1. 药盒硬件架构概览:主控芯片选型、传感器接口、电机驱动、电源管理模块介绍

各位同学,咱们今天聊聊嵌入式药盒的硬件架构。说实话,药盒这东西看着简单,但真要量产,坑可不少。我当年刚接手第一个药盒项目时,觉得不就是个盒子嘛,结果被电源和电机折腾得够呛。好,咱们一个一个模块来拆解。

1.1 主控芯片选型:别光看主频

主控芯片是整个药盒的大脑。选型时,我个人习惯先看三点:功耗、外设接口、成本。药盒是电池供电的设备,你不能选个动不动就几百毫安的芯片,那电池撑不了几天。

我常用的方案是 STM32L0 系列 或者 GD32E230。为什么?

  • 低功耗:待机电流能到 1μA 以下,适合电池供电。
  • 外设丰富:I2C、SPI、UART 都有,接传感器、电机驱动、显示屏都够用。
  • 成本可控:批量采购价在 5-10 元人民币,性价比不错。

你可能会问:「为什么不用 ESP32?还能连 WiFi。」嗯,这里要注意:药盒是医疗设备,无线通信会增加功耗和认证成本。除非产品明确需要远程提醒,否则我建议用纯 MCU。

避坑指南:我曾经在一个项目中选了 STM32F103,结果发现待机电流 20μA,电池容量根本扛不住。后来换成 L0 系列,待机电流降到 1.2μA,续航从 3 天变成了 3 个月。所以,选型时一定要看数据手册里的「待机电流」和「运行电流」,别只看主频。

1.2 传感器接口:药盒的「眼睛」和「耳朵」

药盒需要感知环境,比如:药片有没有被取出?药盒有没有被打开?温度湿度是否正常?这些全靠传感器。

常见的传感器接口有:

  • 霍尔传感器:检测药盒盖是否关闭。我用的是 AH3503,输出是数字信号,直接接 GPIO 就行。
  • 红外对管:检测药片是否在槽位里。比如 ITR8307,发射管和接收管对射,药片挡住光线时输出高电平。
  • 温湿度传感器:比如 SHT30,通过 I2C 接口读取数据。精度 ±0.3°C,够用。

接口设计上,我建议加 RC 滤波。为什么?传感器信号容易受电机干扰。我曾经遇到过红外对管误触发,查了半天发现是电机启动时产生的电磁干扰。加个 10kΩ 电阻 + 100nF 电容的滤波电路,问题就解决了。

小技巧:传感器接口的 GPIO 尽量选支持外部中断的引脚。这样药片被取出时,MCU 可以从休眠中唤醒,不用轮询,省电。

1.3 电机驱动:别小看那个小马达

药盒的出药机构,说白了就是一个小电机。但电机驱动设计不好,药盒会卡药、噪音大、甚至烧驱动芯片。

我常用的电机是 N20 微型减速电机,额定电压 3V,堵转电流 200mA。驱动芯片用 DRV8837 或者 L9110S

驱动电路的关键点:

  • H 桥电路:控制电机正反转。DRV8837 内部集成了 H 桥,外围只需要两个电容。
  • 电流检测:在电机回路串一个 0.1Ω 采样电阻,MCU 通过 ADC 读取电压,判断电机是否堵转。
  • 续流二极管:电机是感性负载,断电时会产生反向电动势。不加续流二极管,驱动芯片很容易烧。我习惯在电机两端并联一个 SS34 肖特基二极管。

代码控制上,我一般用 PWM 调速。频率设 10kHz,占空比从 0% 慢慢升到 80%,这样电机启动平稳,不会「哐」一下弹出去。

// 电机 PWM 初始化示例(STM32 HAL 库)
void Motor_PWM_Init(void) {
    TIM_HandleTypeDef htim2;
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 72 - 1;        // 72MHz / 72 = 1MHz
    htim2.Init.Period = 100 - 1;          // 1MHz / 100 = 10kHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&htim2);

    TIM_OC_InitTypeDef sConfigOC;
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;                  // 初始占空比 0%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

// 设置电机速度,speed 范围 0-100
void Motor_SetSpeed(uint8_t speed) {
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, speed);
}

警告:电机驱动芯片的散热问题。DRV8837 虽然小,但持续 200mA 电流时温度能到 60°C。我建议在 PCB 上给芯片加 覆铜散热,或者留一个散热焊盘。否则量产时,芯片过热会导致电机停转,药盒就「罢工」了。

1.4 电源管理模块:续航的命脉

药盒是电池供电,电源管理直接决定了产品能用多久。我常用的方案是 锂电池 + 升压芯片

电池选 18650 锂电池,容量 2600mAh,电压 3.7V。但 MCU 和电机需要 3.3V 和 5V,所以需要升压。

升压芯片我推荐 TPS61023 或者 MT3608。前者效率高(95%),后者便宜(1 块钱)。

电源管理的关键点:

  • 电池保护:加 DW01 保护芯片,防止过放、过充、短路。没有保护板,电池鼓包是迟早的事。
  • 低功耗设计:MCU 休眠时,关闭传感器和电机电源。我习惯用 MOS 管开关,比如 SI2301,GPIO 控制通断。
  • 电压检测:通过电阻分压(比如 100kΩ + 47kΩ),MCU 的 ADC 读取电池电压。当电压低于 3.0V 时,提示用户充电。

这里有个坑:电机启动瞬间电流很大,会导致电池电压瞬间跌落。如果升压芯片响应慢,MCU 会复位。我遇到过这个问题,后来在电机电源输入端加了一个 470μF 电解电容,问题就解决了。

经验总结:电源模块的布局要「粗短直」。电池到升压芯片的走线,宽度至少 1mm,长度尽量短。否则线阻大,电机启动时电压跌得更厉害。我见过一个同事的板子,走线 0.3mm,结果电机一转,MCU 就重启。改版后走线加宽到 1.5mm,一切正常。

1.5 模块间通信:I2C 和 GPIO 的配合

各个模块之间怎么通信?说白了就是:

  • 传感器:用 I2C 总线,SHT30、霍尔传感器都挂在这条线上。注意上拉电阻,我习惯用 4.7kΩ。
  • 电机驱动:用 GPIO 控制方向(DIR)和使能(EN),PWM 控制速度。
  • 电源管理:用 ADC 读取电池电压,用 GPIO 控制 MOS 管开关。

我建议把 I2C 总线的时钟频率设低一点,比如 100kHz。为什么?药盒内部空间小,走线长,高频容易受干扰。100kHz 虽然慢,但稳定。

好了,这一章的内容就这些。下一章咱们聊 PCB 布局与布线,我会讲讲怎么把电源、电机、传感器放在一块板子上,还不互相干扰。到时候见。