第二章 硬件架构基础:主控芯片选型、电源管理与驱动电路

各位同学,咱们今天聊聊理疗仪硬件架构的底子。说白了,就是三个核心模块:主控芯片选什么、电源怎么管、驱动电路怎么搭。我做了十几年嵌入式,见过太多因为选型不当导致项目返工的案例。嗯,咱们一个一个来拆解。

2.1 主控芯片选型:STM32 vs ESP32

主控芯片是理疗仪的“大脑”。选错了,后面所有工作都白搭。我个人习惯先看需求,再定芯片。

STM32 系列,我用的最多。它稳定、实时性好、外设丰富。理疗仪需要精确的PWM波来控制刺激强度,STM32的定时器模块正好干这个。我记得有一次做低频理疗仪,要求输出频率精确到0.1Hz,STM32的16位定时器配合DMA,轻松搞定。

ESP32 系列,优势在于Wi-Fi和蓝牙。如果你要做远程控制、数据上传,ESP32是首选。但要注意,它的ADC精度不如STM32,而且实时性稍差。我曾在项目中用ESP32做多通道同步输出,结果发现中断响应有抖动,后来加了外部DAC才解决。

对比项 STM32F103 ESP32
主频 72MHz 240MHz
ADC精度 12位 12位(实际有效位约9-10位)
PWM分辨率 16位 8位(默认)
无线功能 Wi-Fi + BLE
功耗 低(几十mA) 较高(百mA级)
典型应用 便携式理疗仪 智能联网理疗仪
我的建议:如果产品是纯离线、电池供电,选STM32。如果需要APP控制或数据上云,选ESP32。别想着“一颗芯片打天下”,术业有专攻。

2.2 电源管理模块

电源是理疗仪的“心脏”。理疗仪通常需要多路电压:主控3.3V、驱动电路5V或12V、传感器3.3V。我见过不少新手直接用一个LDO搞定所有,结果发热严重,电池续航崩了。

电池供电方案:我习惯用锂电池(3.7V)升压到5V,再降压到3.3V。升压芯片选MT3608,降压选AMS1117-3.3。注意,升压电路的电感要选对,我吃过亏——电感饱和电流不够,导致输出纹波大,传感器读数乱跳。

电源时序:理疗仪启动时,先给主控上电,再给驱动电路上电。为什么?因为主控初始化GPIO时,如果驱动电路已经带电,可能会产生误动作。我曾在项目中用MOS管做电源开关,主控通过一个IO控制驱动电源的使能,完美解决。

// 电源使能控制示例
void power_enable(void) {
    HAL_GPIO_WritePin(DRV_EN_GPIO_Port, DRV_EN_Pin, GPIO_PIN_RESET); // 先关驱动
    HAL_Delay(10); // 等待主控稳定
    // 初始化外设...
    HAL_GPIO_WritePin(DRV_EN_GPIO_Port, DRV_EN_Pin, GPIO_PIN_SET); // 再开驱动
}
避坑指南:我曾经在电源入口忘记加TVS管,结果一次静电测试直接烧了主控。从此以后,所有电源入口必加TVS和保险丝,这是血的教训。

2.3 驱动电路:MOS管与H桥

理疗仪的输出,本质上是把低压信号放大成能刺激人体的电流或电压。驱动电路就是干这个的。

MOS管驱动:适合单路输出,比如低频脉冲。我常用IRF520或AO3400。注意,MOS管的栅极要加下拉电阻,防止浮空导致误导通。我见过一个案例,栅极没加电阻,上电瞬间MOS管直接导通,输出端短路,烧了保险丝。

H桥驱动:适合需要正反向输出的场景,比如中频理疗或经皮神经电刺激(TENS)。H桥由4个MOS管组成,通过控制导通组合实现电流方向切换。我推荐用集成H桥芯片,比如L298N或DRV8837,省心很多。

为什么用H桥?你想想看,理疗仪需要输出双向脉冲波,如果只用单管,只能输出单向,效果差很多。H桥可以产生对称的正负脉冲,刺激更深层。

// H桥控制示例(DRV8837)
void h_bridge_set_output(uint8_t direction, uint8_t pwm_duty) {
    if (direction == FORWARD) {
        HAL_GPIO_WritePin(IN1_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(IN2_Pin, GPIO_PIN_RESET);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_duty);
    } else if (direction == REVERSE) {
        HAL_GPIO_WritePin(IN1_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(IN2_Pin, GPIO_PIN_SET);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, pwm_duty);
    } else { // 停止
        HAL_GPIO_WritePin(IN1_Pin, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(IN2_Pin, GPIO_PIN_RESET);
    }
}
关键参数:驱动电路设计时,务必关注输出电流和散热。理疗仪输出电流通常在10-100mA,但峰值可能到200mA。MOS管的Rds(on)要小,否则发热严重。我一般选Rds(on)小于0.1Ω的管子。

2.4 传感器接口

理疗仪需要传感器来反馈状态,比如皮肤阻抗、温度、电极接触检测。传感器接口设计不好,数据全是噪声。

皮肤阻抗检测:我习惯用分压电路加ADC采样。注意,人体阻抗变化很大(几kΩ到几百kΩ),分压电阻要选合适。我一般用10kΩ电阻串联,然后ADC采样电压。采样频率不用太高,100Hz足够。

温度检测:用NTC热敏电阻,便宜又可靠。注意,NTC是非线性的,需要查表或公式补偿。我写过一段查表代码,用线性插值,精度能到±0.5°C。

// NTC温度查表示例
const uint16_t ntc_table[] = { // ADC值 -> 温度(°C)
    4095, // 0°C
    3800, // 10°C
    3400, // 20°C
    2900, // 30°C
    2400, // 40°C
    1900  // 50°C
};

float get_temperature(uint16_t adc_value) {
    // 线性插值
    for (int i = 0; i < 5; i++) {
        if (adc_value >= ntc_table[i+1] && adc_value <= ntc_table[i]) {
            float ratio = (float)(adc_value - ntc_table[i+1]) / (ntc_table[i] - ntc_table[i+1]);
            return (i * 10) + (10 * (1 - ratio));
        }
    }
    return -1; // 超出范围
}

电极接触检测:这个简单,用GPIO检测电极是否短路或开路。我一般加一个上拉电阻,电极接触时拉低,断开时高电平。注意,要加去抖处理,否则误报频繁。

我的经验:传感器接口的走线要远离驱动电路的大电流回路。我曾在PCB上把传感器线走在H桥下面,结果ADC读数全是50Hz工频干扰。后来改走线,加屏蔽,问题解决。

好了,硬件架构基础就讲到这里。记住,选型不是越贵越好,合适才是王道。电源要稳,驱动要强,传感器要准。下一章咱们聊软件架构,到时候见。