第一课:牙刷硬件拆解——主控芯片选型分析、传感器布局、电机驱动电路、电池管理单元

各位同学,大家好。欢迎来到《嵌入式实时操作系统在牙刷中的移植实战》的第一课。

做嵌入式开发,尤其是做RTOS移植,有个铁律:不懂硬件,寸步难行。你想想看,RTOS跑在芯片上,芯片焊在板子上,板子连着一堆外设。你要是连主控是Cortex-M0还是M4都不清楚,连电机怎么转、电池怎么充都不明白,那移植RTOS就是空中楼阁。

所以,咱们第一课不急着敲代码。先把牙刷的硬件拆开,看看里面到底有什么。我个人习惯,拿到一个产品,先看三样东西:大脑(主控)、手脚(传感器和电机)、心脏(电池)。今天咱们就按这个逻辑来。

1.1 主控芯片选型分析

牙刷的主控芯片,说白了就是它的CPU。我见过不少方案,从8位的8051到高端的Cortex-M4都有。但做RTOS移植,我个人建议至少选Cortex-M0+以上的内核。为什么?

  • 性能要够:RTOS本身要占一点资源,任务切换、中断管理都需要CPU时间。M0+主频跑到48MHz,基本够用。
  • 内存要足:RTOS内核、任务栈、消息队列,这些都要RAM。我建议至少8KB SRAM起步,16KB更舒服。
  • 外设要全:定时器(PWM输出)、ADC(电池检测)、I2C/SPI(传感器通信),这些是标配。

我在项目中遇到过一款牙刷,用的是某国产Cortex-M0芯片,主频48MHz,16KB Flash,4KB SRAM。嗯,这里要注意,4KB RAM跑FreeRTOS其实很勉强。任务栈稍微开大一点,系统就崩了。后来我硬是把任务栈从256字节压到128字节,才勉强跑起来。所以,选芯片时,RAM一定要留余量

给大家一个参考表格,是我个人总结的:

芯片型号 内核 主频 Flash SRAM 适合RTOS?
STM32F030 Cortex-M0 48MHz 64KB 8KB 勉强可以
GD32E230 Cortex-M23 72MHz 64KB 16KB 推荐
AT32F403 Cortex-M4 240MHz 256KB 64KB 性能过剩
小提示:选芯片时,别忘了看封装。牙刷内部空间有限,QFN32或TSSOP20这种小封装更实用。我曾经为了省空间,硬是选了QFN封装,结果手工焊接差点没把我焊哭。

1.2 传感器布局

牙刷上的传感器,主要就两个作用:感知压力检测运动。你想想看,刷牙太用力会伤牙龈,刷不到位又刷不干净。所以传感器就是牙刷的「眼睛」和「耳朵」。

常见的传感器布局是这样的:

  • 压力传感器:一般放在刷头根部,用霍尔元件或者压阻式传感器。当用户用力按压时,传感器输出信号变化,主控检测到后降低电机转速或报警。
  • 加速度计/陀螺仪:放在主板中间位置,用来检测牙刷的姿态和运动轨迹。比如你刷上排牙还是下排牙,刷了多久,都能通过算法算出来。
  • 接近传感器:有些高端牙刷会加一个红外接近传感器,检测牙刷是否放入口中。没放入时自动休眠,省电。

我记得有一次,客户反馈牙刷在充电时莫名其妙震动。查了半天,发现是加速度计离充电线圈太近,充电时的电磁干扰导致加速度计误触发。后来我把传感器挪到了板子边缘,远离线圈,问题就解决了。所以,传感器布局时,一定要考虑电磁干扰

避坑指南:我曾经在布局时,把I2C总线的传感器和电机驱动放在同一侧。结果电机一转,I2C通信就出错。后来加了屏蔽罩和滤波电容才搞定。所以,传感器走线要远离大电流回路

1.3 电机驱动电路

牙刷的核心执行机构,就是电机。目前主流的是无刷直流电机(BLDC),也有用有刷电机的,但BLDC更安静、寿命更长。

电机驱动电路,说白了就是控制电机转多快、转多大劲。典型的电路包括:

  • MOSFET H桥:用来控制电机正反转和转速。一般用N沟道和P沟道MOSFET搭配。
  • 预驱芯片:比如DRV8837、L9110S,专门用来驱动电机。主控输出PWM信号,预驱芯片放大后驱动MOSFET。
  • 电流采样电阻:串联在电机回路中,检测电机电流。主控通过ADC读取电压,换算成电流,实现过流保护。

给大家看一个简单的驱动电路代码示例(伪代码):

// 电机PWM初始化
void motor_pwm_init(void) {
    // 配置定时器TIM2,输出PWM到PA0
    TIM2->ARR = 999;      // 自动重装值,决定PWM频率
    TIM2->CCR1 = 500;     // 占空比50%
    TIM2->CR1 |= TIM_CR1_CEN; // 启动定时器
}

// 设置电机转速
void motor_set_speed(uint8_t speed) {
    // speed: 0-100
    uint16_t duty = (uint16_t)speed * 10; // 映射到0-1000
    TIM2->CCR1 = duty;
}

// 电机过流保护
void motor_overcurrent_check(void) {
    uint16_t adc_val = adc_read(ADC_CH_MOTOR_CURRENT);
    if (adc_val > OVERCURRENT_THRESHOLD) {
        motor_stop(); // 立即停止电机
        // 同时可以报警或记录错误
    }
}

嗯,这里要注意,电机启动瞬间电流很大,可能达到正常工作电流的3-5倍。所以软件上要做软启动,PWM占空比从0慢慢增加到目标值。我刚开始做的时候没注意,一上电就全速,结果电池保护板直接触发过流保护,牙刷断电了。后来加了200ms的软启动,问题解决。

1.4 电池管理单元

牙刷是便携设备,电池管理是重中之重。目前主流方案是锂电池+充电管理芯片。常见的充电管理芯片有TP4056、MCP73831等。

电池管理单元主要做三件事:

  • 充电管理:恒流恒压充电,充满自动停充。一般充电电流设定在500mA左右,太大电池会发热。
  • 电量检测:通过ADC检测电池电压,换算成剩余电量。注意,锂电池放电曲线不是线性的,需要做查表补偿。
  • 保护功能:过充保护(4.2V)、过放保护(3.0V)、短路保护。这些一般由保护板(BMS)完成,但主控也要做软件保护。

给大家看一个简单的电量检测代码:

// 电池电量检测(查表法)
const uint16_t battery_table[] = {
    3300, // 0% 电量,电压3.3V
    3500, // 10%
    3700, // 30%
    3900, // 50%
    4100, // 80%
    4200  // 100%
};

uint8_t get_battery_level(void) {
    uint16_t adc_val = adc_read(ADC_CH_BATTERY);
    uint16_t voltage = (adc_val * 3300) / 4096; // 假设12位ADC,参考电压3.3V
    
    // 查表
    for (int i = 0; i < 6; i++) {
        if (voltage < battery_table[i]) {
            return i * 20; // 返回0,20,40,60,80,100
        }
    }
    return 100; // 满电
}
重要提醒:电池管理千万不能马虎。我见过一个案例,某品牌牙刷因为充电管理芯片失效,电池过充导致鼓包,差点起火。所以,硬件上要加独立保护板,软件上要做多重检测。安全第一,不是开玩笑的。

好了,第一课的内容就到这里。我们拆解了牙刷的四大硬件模块:主控芯片、传感器、电机驱动、电池管理。这些是RTOS移植的硬件基础。下一课,我们会开始搭建开发环境,把RTOS跑起来。

记住一句话:硬件是骨架,软件是血肉,RTOS是灵魂。骨架没搭好,后面全是白费功夫。各位同学,下节课见。