第一章:项目全景与需求分析

大家好,我是你们的老朋友。今天咱们正式开始《窗帘电机嵌入式软件全流程开发指南》的第一课。

做嵌入式开发这么多年,我见过太多人一上来就写代码,结果做到一半发现需求没搞清楚,推倒重来。说实话,这种坑我踩过不止一次。所以,咱们第一步,先把项目全景看清楚。

1.1 窗帘电机项目背景

先说说这个项目是干嘛的。

智能家居这几年火得不行。窗帘电机,说白了就是让家里的窗帘能自动开合。你想想看,早上起床窗帘自动拉开,晚上睡觉自动关上,多省事。

我参与过好几个类似的电机控制项目。有一次,客户要求电机必须能带动8公斤的窗帘布,结果我们选了个小电机,一测试就卡住了。嗯,这里要注意,电机选型一定要留余量。

这个项目的目标很明确:做一款低成本、低功耗、静音的窗帘电机控制器。主控芯片用STM32,电机用直流减速电机,加上霍尔传感器做位置检测。

1.2 功能需求详解

功能需求这块,我把它拆成三个核心点。每个点都是我在项目中反复踩过的坑。

1.2.1 正反转控制

窗帘电机最基本的功能,就是正转和反转。正转对应窗帘拉开,反转对应窗帘关上。

实现方式其实不复杂。用H桥驱动电路,控制两个IO口的高低电平就行。我习惯用TIM的PWM输出,这样还能顺便调速。

关键点:正反转切换时,一定要加死区时间。我曾经因为没加死区,导致MOS管瞬间直通,板子直接冒烟了。血的教训。

代码示例(简化版):

// 正转
HAL_GPIO_WritePin(MOTOR_IN1_GPIO_Port, MOTOR_IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(MOTOR_IN2_GPIO_Port, MOTOR_IN2_Pin, GPIO_PIN_RESET);

// 反转
HAL_GPIO_WritePin(MOTOR_IN1_GPIO_Port, MOTOR_IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_IN2_GPIO_Port, MOTOR_IN2_Pin, GPIO_PIN_SET);

// 停止
HAL_GPIO_WritePin(MOTOR_IN1_GPIO_Port, MOTOR_IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(MOTOR_IN2_GPIO_Port, MOTOR_IN2_Pin, GPIO_PIN_RESET);

1.2.2 限位功能

限位,就是让窗帘走到头自动停下来。没有限位,电机会一直转,轻则烧电机,重则拉坏窗帘轨道。

限位有两种实现方式:

  • 机械限位:用微动开关,碰到就停。简单可靠,但安装位置固定后不好调整。
  • 电子限位:用霍尔传感器记录圈数,软件设定上限和下限。灵活,但需要校准。

我个人更推荐电子限位。为什么?因为用户安装时,窗帘宽度可能不一样。电子限位可以通过按键设置,适应性强。

小技巧:电子限位要加防抖处理。霍尔传感器在电机低速时,信号会有抖动。我一般用定时器做10ms的软件滤波。

1.2.3 遇阻停功能

遇阻停,就是窗帘在运动过程中遇到障碍物,自动停止并反转一小段。这个功能对安全性很重要,尤其是家里有小孩的。

实现原理:检测电机电流。当窗帘被卡住时,电机负载增大,电流会突然上升。通过ADC采样电流值,超过阈值就触发保护。

阈值怎么设?我做过实验,正常运行时电流在200mA左右,遇阻时能飙到800mA以上。所以阈值设在500mA比较合适。当然,不同电机参数不同,需要实际测试。

注意:电流检测要避开启动瞬间的浪涌电流。电机启动时电流会瞬间增大,但这不是遇阻。我一般会加一个200ms的延时,等电流稳定后再开始检测。

1.3 非功能需求分析

功能需求是「做什么」,非功能需求是「做得怎么样」。这两点往往决定产品能不能卖出去。

1.3.1 低功耗

窗帘电机通常是电池供电的。用户可不想三天两头换电池。低功耗设计是重中之重。

我总结了几条经验:

  • 选型要省电:STM32的睡眠模式功耗可以做到几微安。电机不转时,让MCU进入Stop模式。
  • 通信要省电:如果用蓝牙,不要一直广播。我习惯用事件触发的方式,有操作才唤醒。
  • 外设要关断:霍尔传感器、LED指示灯这些,不用的时候一定要关掉电源。

举个例子,我做过一个项目,待机功耗从2mA降到了50μA,电池续航从1个月延长到了半年。说白了,细节决定成败。

1.3.2 静音

窗帘电机通常在卧室使用,噪音大了谁受得了?静音设计主要从两方面入手:

  • 机械方面:选用静音齿轮、加橡胶减震垫。这个主要是结构工程师的事。
  • 软件方面:PWM频率要选对。我试过1kHz、5kHz、10kHz,发现10kHz以上人耳基本听不到电机啸叫。另外,加减速要平滑,不要突然启动或停止。

我的经验:PWM频率越高,电机噪音越小,但MOS管的开关损耗会增大。我一般取10kHz,算是一个平衡点。

1.4 系统架构概览

好了,需求讲完了。咱们来看看整个系统长什么样。

系统架构分三层:

层级 说明 主要模块
应用层 用户交互和业务逻辑 按键处理、蓝牙通信、状态机
驱动层 硬件抽象和驱动 电机驱动、霍尔传感器、ADC、PWM
硬件层 物理器件 STM32、直流电机、H桥、电池

我习惯用分层设计。这样做的好处是,换硬件时只需要改驱动层,应用层基本不用动。有一次客户要求换电机型号,我只改了驱动层的几个参数,两天就搞定了。

通信方式上,我选蓝牙BLE。为什么?因为手机直接控制,用户不用额外买网关。而且BLE功耗低,适合电池供电。

嗯,第一章的内容就到这里。这一章是地基,地基打不牢,后面盖楼会出大问题。下一章,咱们开始讲硬件选型和电路设计。

公众号:蓝海资料掘金营,微信deep3321