第一章:嵌入式系统基础:MCU选型与资源规划
各位工程师朋友,咱们直接进入正题。做剃须刀这种个人护理产品,MCU选型是第一道坎。选对了,后面顺风顺水;选错了,改板子、换方案,折腾得你怀疑人生。
我个人习惯,拿到产品需求后,先不急着翻芯片手册。我会先问自己三个问题:
- 要控制几个电机? 单刀头还是多刀头?
- 要检测哪些信号? 霍尔、触摸、电流?
- 电池能用多久? 续航是7天还是30天?
这三个问题想清楚,MCU选型的大方向就定了。
1.1 MCU选型:别只看主频
很多新手选MCU,上来就看主频。其实对于剃须刀这种应用,主频真不是瓶颈。你想想看,电机控制无非是PWM输出,传感器检测也就是ADC采样,这些活儿,几十MHz的MCU完全够用。
我真正关注的是这几点:
| 选型维度 | 我的建议 | 为什么 |
|---|---|---|
| 内核架构 | ARM Cortex-M0+ 或 M4 | M0+够用且省电,M4适合做算法 |
| Flash大小 | 64KB起步 | 固件升级、日志存储都需要空间 |
| RAM大小 | 8KB以上 | 缓冲区、状态机、算法中间变量 |
| ADC精度 | 12位 | 电流检测需要足够分辨率 |
| 定时器数量 | 至少3个 | 电机PWM、霍尔捕获、触摸扫描各一个 |
重点提醒: 别只看芯片本身的价格。要把开发工具、烧录器、样品采购周期都算进去。有些小众芯片便宜,但开发环境难用,调试一次花半天,得不偿失。
1.2 资源规划:把每一分钱花在刀刃上
资源规划说白了就是「算账」。你得知道每个外设要占多少引脚、多少定时器、多少DMA通道。
我做过一个项目,客户要求同时支持霍尔测速、电容触摸按键、电机电流检测。当时我选了颗48引脚的MCU,结果发现定时器不够用。后来硬着头皮用软件模拟PWM,结果抖动太大,电机噪音超标。
嗯,从那以后我学乖了。资源规划一定要提前做,而且要做「冗余」规划。
典型资源分配表(以三刀头剃须刀为例)
| 功能模块 | 所需资源 | 备注 |
|---|---|---|
| 主电机控制 | 1个定时器 + 2路PWM | 正反转、调速 |
| 副电机控制 | 1个定时器 + 2路PWM | 刀头摆动 |
| 霍尔传感器 | 2个外部中断 + 1个定时器捕获 | 测速、换向检测 |
| 电容触摸 | 1个定时器 + 2个GPIO | 按键扫描 |
| 电流检测 | 1个ADC通道 + 1个运放 | 堵转保护 |
| 电池管理 | 1个ADC通道 + 1个GPIO | 电量监测、充电控制 |
我的小技巧: 画PCB之前,先把所有外设的引脚分配画在一张纸上。用不同颜色标记不同功能。这样一眼就能看出有没有冲突。我习惯用红色标中断引脚,蓝色标PWM,绿色标ADC。别问我为什么,反正这样不容易出错。
1.3 传感器接口:霍尔、电容触摸、电流检测
传感器是剃须刀的「眼睛」和「耳朵」。没有它们,MCU就是个瞎子。
霍尔传感器接口
霍尔传感器用来检测电机位置和转速。我常用的方案是:
- 单霍尔方案: 成本低,但只能测速,不能判断方向
- 双霍尔方案: 可以测速+判向,适合需要换向的刀头
接口设计上,霍尔输出是开漏信号,需要上拉电阻。我一般用4.7kΩ上拉到3.3V。注意,霍尔信号线要尽量短,远离电机驱动线,否则容易受干扰。
// 霍尔中断服务函数示例
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == HALL_A_PIN) {
hall_count++;
// 计算转速:每转产生N个脉冲
// 转速 = (hall_count * 60) / (N * 时间间隔)
}
}
避坑指南: 我曾经遇到过霍尔信号抖动导致计数不准的问题。后来加了10ms的软件消抖,问题解决了。别迷信硬件滤波,软件消抖更灵活。
电容触摸接口
电容触摸按键现在几乎是标配。没有机械按键,防水、耐用、颜值高。
我常用的触摸方案有两种:
- RC充放电法: 用MCU的GPIO直接驱动,成本最低
- 专用触摸芯片: 比如TTP223,稳定可靠,但多一颗芯片
我个人更推荐第一种,只要PCB layout做得好,效果不输专用芯片。关键点:
- 触摸焊盘要远离地平面(保持1mm以上间距)
- 走线要细(0.3mm以内),长度尽量短
- 每个触摸按键周围加一圈地线(guard ring)
电机电流检测
电流检测主要是为了堵转保护。电机堵转时电流会飙升,如果不及时断电,轻则烧电机,重则起火。
检测方法很简单:在电机回路串一个小电阻(0.1Ω左右),用ADC测量电阻两端的电压。然后根据欧姆定律算电流。
// 电流检测代码片段
uint16_t adc_value = HAL_ADC_GetValue(&hadc1);
float voltage = (adc_value / 4096.0) * 3.3; // 12位ADC,参考电压3.3V
float current = voltage / 0.1; // 采样电阻0.1Ω
if(current > 2.0) { // 堵转阈值2A
motor_stop();
set_error_flag(ERROR_STALL);
}
经验之谈: 采样电阻要用高精度的(1%或0.5%),温漂要小。我吃过亏,用了5%的电阻,结果温度一高,电流检测偏差30%以上。
1.4 电源管理与低功耗设计
剃须刀是电池供电产品,低功耗设计是重中之重。用户可不想刮到一半没电了。
低功耗设计分两个层面:硬件和软件。
硬件层面
- 选低功耗MCU: 待机电流低于1μA的型号
- 用MOS管做电源开关: 不用时彻底切断传感器供电
- LDO选型: 静态电流要小,我常用XC6206系列
软件层面
软件低功耗的核心思想:没事就睡,有事再醒。
我常用的策略:
- 空闲时进入Stop模式: 电流可以降到几个μA
- 用RTC定时唤醒: 比如每100ms醒来一次,检查按键
- 中断唤醒: 霍尔信号、触摸按键都可以作为唤醒源
// 进入低功耗模式示例
void enter_sleep_mode(void)
{
// 关闭不用的外设时钟
__HAL_RCC_GPIOB_CLK_DISABLE();
__HAL_RCC_GPIOC_CLK_DISABLE();
// 配置唤醒源
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
// 进入Stop模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 醒来后重新配置时钟
SystemClock_Config();
}
核心原则: 低功耗不是靠一个函数实现的,而是贯穿整个设计过程。从MCU选型到PCB layout,从代码架构到中断设计,每一步都要考虑功耗。
好了,第一章的内容就到这里。MCU选型、资源规划、传感器接口、低功耗设计,这四个点吃透了,嵌入式系统的基础就算打牢了。下一章咱们聊聊电机控制的具体实现。