第1章:硬件系统架构
各位工程师朋友,咱们直接进入正题。血压计这东西,看着简单,里面门道可不少。我做了这么多年嵌入式,踩过的坑能绕深圳湾一圈。今天先聊聊硬件架构,这是整个系统的骨架。
1.1 主控芯片选型(MCU)
MCU是血压计的大脑。选型时我一般看三点:处理速度、外设资源、功耗。
处理速度方面,血压计需要实时采集压力数据,还要跑滤波算法。我个人习惯用ARM Cortex-M0+或M4内核的芯片。M0+够用,M4带DSP,算起来更爽。你想想看,采样率一般1kHz,每个点要做数字滤波,M0+也能扛住,但M4能留出更多余量给UI刷新。
外设资源这块,我建议至少要有:
- 12位以上ADC,采样率不低于1kHz
- 2个以上定时器,一个用于PWM驱动气泵,一个用于采样定时
- SPI/I2C接口,接OLED或LCD屏
- 足够的GPIO,控制电磁阀、按键、蜂鸣器
功耗嘛,血压计不是一直工作的。待机时电流要控制在微安级。我遇到过一款芯片,待机标称1μA,实际焊上去测出来5μA,查了半天发现是内部LDO没关。嗯,这里要注意,选型时一定要看实际测试数据,别光看手册。
推荐型号:
- STM32G030系列(性价比高,M0+内核)
- GD32F103系列(国产替代,资源丰富)
- NXP LPC845(超低功耗,适合电池供电)
1.2 气泵与电磁阀驱动电路
气泵和电磁阀是血压计的"手脚"。气泵负责充气,电磁阀负责放气。驱动电路设计不好,轻则噪声大,重则烧管子。
气泵驱动,说白了就是控制电机。我一般用N沟道MOS管做低边驱动。选MOS管时注意:
- Vds耐压要高于电源电压2倍以上
- Rds(on)要小,减少发热
- 栅极电容要小,开关速度快
电磁阀驱动更讲究。电磁阀是感性负载,关断时会产生反电动势。我曾经在项目中没加续流二极管,结果MOS管被击穿,整个产线停了两天。教训啊!
避坑指南:电磁阀驱动电路必须加续流二极管,最好用肖特基二极管,响应快。另外,驱动电流不要超过电磁阀额定值的80%,留点余量。
驱动电路典型结构:
// 气泵驱动(PWM控制)
GPIO_Init(PUMP_PIN, GPIO_MODE_AF_PP);
TIM2->CCR1 = pump_speed; // 0-1000
// 电磁阀驱动(开关控制)
GPIO_Init(VALVE_PIN, GPIO_MODE_OUTPUT_PP);
HAL_GPIO_WritePin(VALVE_PORT, VALVE_PIN, GPIO_PIN_SET); // 打开
1.3 压力传感器(MEMS)接口
MEMS压力传感器是血压计的核心。现在主流是压阻式或电容式MEMS传感器。我偏好用带I2C/SPI数字接口的,省去模拟调理电路,抗干扰能力也强。
传感器选型要点:
- 量程:0-300mmHg足够,留点余量到400mmHg
- 精度:±1mmHg以内
- 温度漂移:小于0.1mmHg/℃
- 响应时间:小于5ms
接口电路方面,如果是模拟输出传感器,需要加运放调理。我建议用仪表放大器,比如AD620,共模抑制比高。数字接口就简单了,直接I2C或SPI连MCU。
个人经验:传感器布局要远离气泵和电磁阀,避免振动干扰。我试过把传感器和气泵放一起,结果波形上全是毛刺,滤波都滤不干净。
典型接线:
// I2C接口
SENSOR_SDA -> PB7
SENSOR_SCL -> PB6
// 上拉电阻4.7kΩ到3.3V
// 读取压力值
uint16_t pressure_raw = 0;
HAL_I2C_Mem_Read(&hi2c1, SENSOR_ADDR, 0x00, 1, &pressure_raw, 2, 100);
1.4 OLED/LCD显示电路
显示电路,我推荐用OLED,对比度高,功耗低。0.96寸128x64的OLED屏,SPI接口,够用。
驱动芯片常用SSD1306或SH1106。供电电压3.3V,电流约20mA。注意OLED屏的驱动电压和逻辑电压要匹配。
显示内容一般包括:
- 收缩压/舒张压数值(大字显示)
- 心率数值
- 测量状态(充气中/测量中/完成)
- 电池电量图标
- 日期时间
我习惯用SPI接口,速度比I2C快,刷新不卡顿。接线就4根线:CS、DC、SCLK、MOSI。
// OLED初始化
void OLED_Init(void) {
HAL_Delay(100);
OLED_WriteCmd(0xAE); // 关闭显示
OLED_WriteCmd(0xD5); // 设置时钟分频
OLED_WriteCmd(0x80);
OLED_WriteCmd(0xA8); // 设置多路复用比
OLED_WriteCmd(0x3F);
// ... 省略其他初始化命令
OLED_WriteCmd(0xAF); // 开启显示
}
1.5 按键与蜂鸣器电路
按键电路,我建议用独立按键,不要用矩阵键盘。血压计按键少,一般就3-5个:开始/停止、记忆、设置、上、下。
按键处理要点:
- 硬件消抖:加RC滤波,时间常数10ms左右
- 软件消抖:延时20ms再读取
- 长按/短按区分:计时判断
蜂鸣器电路,用有源蜂鸣器,驱动简单。三极管驱动,基极串1kΩ电阻,集电极接蜂鸣器,发射极接地。
注意:蜂鸣器不要直接接GPIO,驱动电流不够。我见过有人直接接,结果GPIO烧了。
// 按键扫描
uint8_t Key_Scan(void) {
if(HAL_GPIO_ReadPin(KEY_START_GPIO_Port, KEY_START_Pin) == GPIO_PIN_RESET) {
HAL_Delay(20); // 消抖
if(HAL_GPIO_ReadPin(KEY_START_GPIO_Port, KEY_START_Pin) == GPIO_PIN_RESET) {
return KEY_START_PRESSED;
}
}
return KEY_NONE;
}
// 蜂鸣器控制
void Buzzer_On(void) {
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_SET);
}
void Buzzer_Off(void) {
HAL_GPIO_WritePin(BUZZER_GPIO_Port, BUZZER_Pin, GPIO_PIN_RESET);
}
1.6 电源管理(电池/充电)
电源管理是血压计可靠性的关键。一般用锂电池供电,3.7V,容量500-1000mAh。充电芯片用TP4056或类似型号,充电电流500mA。
电源路径设计:
- 电池通过LDO降压到3.3V,给MCU和传感器供电
- 气泵和电磁阀直接由电池供电,通过MOS管控制
- 充电时,USB 5V通过充电芯片给电池充电,同时给系统供电
我建议加电量检测电路。用两个电阻分压,ADC采样电池电压。注意分压电阻要选大阻值,减少漏电流。
避坑指南:电池保护板一定要选带过放保护的。我曾经用了一款便宜电池,没保护板,结果电池过放,充不进去了。整批产品召回,损失惨重。
典型电源电路参数:
| 器件 | 型号 | 参数 |
|---|---|---|
| 充电芯片 | TP4056 | 充电电流500mA,恒流恒压 |
| LDO | XC6206P332MR | 3.3V输出,最大电流150mA |
| 电池 | 聚合物锂电池 | 3.7V,800mAh,带保护板 |
| 电量检测 | 电阻分压 | 100kΩ+100kΩ,ADC采样 |
好了,硬件架构就聊这么多。下一章咱们讲软件架构,包括状态机设计和测量流程。有什么问题可以留言,我看到会回复。
总结一下:硬件设计要留余量,选型要看实际测试,布局要避免干扰。记住这三点,你的血压计硬件就成功了一半。
公众号:蓝海资料掘金营,微信deep3321