第一章:项目全景与硬件选型

各位同学好,我是老李。做嵌入式这行十几年了,从最早的8051一路做到现在的Cortex-M系列。今天咱们聊的窗帘电机项目,说实话是个很典型的低成本嵌入式方案。你别看它结构简单,里面门道可不少。

我刚开始接这个项目时,客户就一句话:「成本压到最低,功能一个不能少。」嗯,这种要求我听得太多了。但窗帘电机这东西,涉及到电机控制、无线通信、电池管理,还真不是随便找个单片机就能糊弄过去的。

1.1 项目需求分析

先说说这个项目到底要干什么。说白了,就是做一个能远程控制、能定时开关的窗帘电机。用户可以用手机APP或者语音助手来控制窗帘的开合。

具体需求我列一下:

  • 电机控制:正反转、速度调节、堵转保护
  • 无线通信:支持Wi-Fi或蓝牙,能接入智能家居平台
  • 低功耗:电池供电时待机电流要低于50μA
  • 位置检测:知道窗帘开到哪了,支持百分比控制
  • 安全保护:过流保护、过热保护、遇阻停止
  • 成本目标:BOM成本控制在15元以内

你想想看,15块钱要搞定这么多功能,是不是有点挑战?我当年做第一个版本时,光电机驱动芯片就花了8块钱,后来硬是换方案才把成本压下来。

核心矛盾:功能越多,成本越高。但用户不会为用不上的功能买单。所以选型时一定要「够用就好」,别堆料。

1.2 系统架构概览

整个系统的架构其实不复杂。我习惯把它分成三层:

  1. 控制层:主控MCU,负责逻辑处理、通信协议、电机控制算法
  2. 驱动层:电机驱动芯片,把MCU的控制信号转换成电机需要的电流
  3. 电源层:电池管理、电压转换、充电电路

这三层之间怎么配合?举个例子:手机发来一条「打开50%」的指令,Wi-Fi模块收到后传给MCU,MCU根据当前位置计算出需要转多少圈,然后给驱动芯片发PWM信号,电机开始转。同时MCU还在监测电流,一旦发现堵转就立刻停止。

我记得第一次画这个架构图时,把通信模块和MCU之间的接口画错了,结果打样回来发现SPI引脚不够用。嗯,这种低级错误犯过一次就够了。

1.3 低成本MCU选型

MCU是整个系统的核心。选型时我主要看这几个指标:

参数 STM32F030 AT32F403 GD32F103
内核 Cortex-M0 Cortex-M4 Cortex-M3
主频 48MHz 240MHz 108MHz
Flash 32KB 64KB 64KB
SRAM 4KB 16KB 20KB
单价(1K) ¥2.5 ¥3.8 ¥3.2

我个人习惯用STM32F030。为什么?便宜、够用、资料多。你可能会问,AT32F403性能那么好,为什么不用?我告诉你,窗帘电机不需要240MHz的主频,48MHz绰绰有余。多出来的性能用不上,还多花钱,何必呢?

我的经验:选MCU时,先算算你的代码量。窗帘电机这种项目,32KB Flash完全够用。我做过一个版本,代码优化后只用了18KB。别一上来就选大容量,那是浪费。

不过要注意一点:STM32F030的SRAM只有4KB。如果你要用RTOS,或者要处理复杂的通信协议,4KB可能不够。我建议裸机跑,或者用状态机,4KB完全够用。

1.4 电机驱动芯片选型

电机驱动芯片这块,我踩过不少坑。先说两个常见的方案:

  • DRV8833:TI的,双H桥,最大驱动电流1.5A,带过流保护
  • L9110S:国产的,单H桥,最大驱动电流800mA,没有保护

DRV8833贵一些,大概3块钱,但功能全。L9110S便宜,不到1块钱,但功能简陋。

我建议用DRV8833。为什么?因为窗帘电机经常遇到堵转的情况——比如窗帘卡住了。DRV8833有内置的过流保护,电流超过阈值会自动关断。L9110S没有这个功能,你得自己在MCU里做电流检测,麻烦不说,响应速度还慢。

避坑指南:我曾经在一个项目里用了L9110S,结果客户反馈电机烧了好几个。查了半天,发现是堵转时电流太大,把驱动芯片烧了。后来换成DRV8833,再也没出过问题。省那两块钱,不值得。

驱动电路的设计也不复杂。MCU输出两路PWM信号,一路控制正转,一路控制反转。再加上一个使能引脚,用来控制电机的启停。嗯,这里要注意:PWM频率别太高,我一般用1kHz到10kHz之间。太高了电机噪音大,太低了电机抖动。

// 电机控制代码示例
void motor_control(uint8_t direction, uint8_t speed) {
    if(direction == FORWARD) {
        TIM1->CCR1 = speed;  // 正转PWM
        TIM1->CCR2 = 0;      // 反转关闭
    } else if(direction == REVERSE) {
        TIM1->CCR1 = 0;      // 正转关闭
        TIM1->CCR2 = speed;  // 反转PWM
    } else {
        TIM1->CCR1 = 0;      // 停止
        TIM1->CCR2 = 0;
    }
}

1.5 电源方案对比

电源方案是窗帘电机项目里最让人头疼的部分。三种方案各有优劣:

方案 优点 缺点 适用场景
锂电池 电压稳定、可充电、容量大 成本高、需要充电管理、有安全隐患 高端产品、无插座场景
干电池 成本低、更换方便 电压下降快、容量有限、不环保 低成本方案、使用频率低
DC适配器 供电稳定、无需考虑功耗 需要插座、布线麻烦 有插座场景、商用项目

我个人最推荐锂电池方案。虽然成本高一些,但用户体验好。你想,用户装个窗帘电机,还得隔三差五换电池,多烦人?

锂电池方案里,我习惯用18650电芯,单节3.7V,容量2600mAh左右。配上TP4056充电芯片,成本也就多两块钱。电机工作电流大概500mA,满电能用5个小时左右。每天开关两次,一次30秒,充一次电能用好几个月。

小技巧:如果用干电池方案,记得加一个升压电路。4节干电池串联才6V,电机一转电压就掉到4.5V以下了。我建议用MT3608升压到12V,这样电机工作稳定,不会出现转不动的尴尬情况。

嗯,电源这块还有一个容易被忽略的点:待机功耗。窗帘电机大部分时间都在待机,等着接收指令。如果待机电流太大,电池很快就耗光了。我一般要求待机电流低于50μA。怎么做到?MCU进入休眠模式,Wi-Fi模块也进入低功耗模式,只有蓝牙模块保持监听状态。

好了,第一章的内容就这些。说白了,窗帘电机项目就是个典型的低成本嵌入式方案,选型时记住三个字:够、用、好。MCU够用就行,驱动芯片选带保护的,电源方案看场景。下一章咱们聊聊具体的电路设计,到时候我会把原理图拿出来,一行一行地讲。