基于瑞萨的血压测量仪电路实现
一、系统架构设计
基于瑞萨的血压测量仪系统架构分为传感器模块、模拟前端(AFE)、微控制器(MCU)、执行模块、通信模块和电源模块,具体如下:
graph TD
A[传感器模块] --> B[模拟前端(AFE)]
B --> C[微控制器(RL78)]
C --> D[执行模块(气泵/电磁阀)]
C --> E[通信模块(BLE)]
C --> F[显示模块(LCD)]
G[电源模块] --> A & B & C & D & E & F
- 传感器模块:采集袖带内的压力信号(静压+脉搏波),采用Honeywell ABPDANN005PG2A3(12位I2C数字输出,精度±0.25%FS)。
- 模拟前端(AFE):对传感器信号进行放大、滤波和模数转换,采用RL78/H1D内置AFE(24位ΔΣ ADC、PGA、运算放大器)。
- 微控制器(MCU):核心控制单元,运行血压算法(示波法),控制执行模块和通信模块,采用RL78/H1D(16位CPU,128KB Flash,8KB RAM)。
- 执行模块:控制袖带的充放气过程,采用MITSUMI MAP-AM-265气泵(6V,400mmHg)和Yujin KSV05B电磁阀(6V,快速放气)。
- 通信模块:实现蓝牙数据传输,采用RL78/G1D BLE模块(支持蓝牙4.0)。
- 显示模块:显示血压值和状态,采用4位8段LCD(RL78/H1D内置LCD控制器驱动)。
- 电源模块:提供稳定供电,采用4节AAA电池(6V)或DC 6V适配器,通过XC6206-3.3V稳压至3.3V。
二、硬件电路设计
1. 传感器模块电路
核心器件:Honeywell ABPDANN005PG2A3(I2C数字输出)。
电路连接:
- VCC:3.3V(来自稳压电路);
- GND:接地;
- SCL:连接RL78的I2C时钟引脚(如P1.0);
- SDA:连接RL78的I2C数据引脚(如P1.1);
- INT:中断引脚(可选,用于触发数据读取)。
设计要点:
- 传感器输出为12位数字信号(I2C),无需额外ADC,直接连接RL78的I2C接口;
- 需在SCL/SDA线上添加10kΩ上拉电阻(符合I2C标准)。
2. 模拟前端(AFE)电路
核心器件:RL78/H1D内置AFE(24位ΔΣ ADC、PGA、运算放大器)。
电路设计:
-
放大电路:采用RL78/H1D内置可编程增益放大器(PGA),增益设置为100倍(放大传感器输出的毫伏级信号);
-
滤波电路:采用RL78/H1D内置IIR数字滤波器(截止频率5Hz),滤除高频噪声(如电源干扰、运动噪声);
-
ADC转换:采用RL78/H1D内置24位ΔΣ ADC(采样率100Hz),将模拟信号转换为数字信号(有效精度18位)。
设计要点:
-
PGA增益需根据传感器输出范围调整(如传感器输出0-3V,PGA增益100倍后,输出0-300V,需匹配ADC输入范围);
-
IIR滤波器系数可通过瑞萨GUI工具模拟计算(如压力传感器波形提取),并写入RL78固件。
3. 微控制器(RL78/H1D)电路
核心器件:RL78/H1D(R5F11NMGAFB#10,80pin LFQFP)。
电路连接:
-
I2C接口:连接传感器(SCL/P1.0,SDA/P1.1);
-
PWM接口:连接气泵(P2.0,控制充气速度);
-
GPIO接口:连接电磁阀(P2.1,控制放气);
-
LCD接口:连接4位8段LCD(COM0-COM3,SEG0-SEG7);
-
UART接口:连接BLE模块(TX/P3.0,RX/P3.1)。
设计要点:
-
RL78/H1D内置LCD控制器,无需额外驱动芯片,直接驱动4位8段LCD;
-
PWM频率设置为1kHz(气泵控制),占空比可调(0-100%);
-
UART波特率设置为9600bps(BLE通信)。
4. 执行模块电路
核心器件:MITSUMI MAP-AM-265气泵(6V)、Yujin KSV05B电磁阀(6V)。
电路设计:
-
气泵驱动:采用P沟道MOSFET(IRLML6402)和NPN三极管(DTC114),RL78的PWM信号(P2.0)控制三极管导通,进而控制MOSFET通断,实现气泵充气;
-
电磁阀驱动:采用NPN三极管(DTC114),RL78的GPIO信号(P2.1)控制三极管导通,实现电磁阀放气。
设计要点:
-
气泵和电磁阀的电源需与MCU电源隔离(采用6V独立电源),避免干扰;
-
MOSFET和二极管(SS34)需添加10kΩ限流电阻(保护MCU引脚)。
5. 通信模块电路
核心器件:RL78/G1D BLE模块(支持蓝牙4.0)。
电路连接:
-
TXD:连接RL78的UART接收引脚(P3.0);
-
RXD:连接RL78的UART发送引脚(P3.1);
-
VCC:3.3V;
-
GND:接地。
设计要点:
-
BLE模块需与手机APP(如Android/iOS)配对,传输血压数据(收缩压、舒张压、脉搏率);
-
手机APP需支持BLE GATT协议(如Nordic Semiconductor的nRF Connect)。
6. 电源模块电路
核心器件:4节AAA电池(6V)、DC 6V适配器、XC6206-3.3V(低压差稳压器)。
电路设计:
-
输入:6V电源(电池或适配器);
-
输出:3.3V(供给传感器、MCU、BLE模块等);
-
滤波:在稳压芯片输入/输出端添加0.1μF陶瓷电容(去耦,减少电源噪声)。
设计要点:
-
电池需采用低功耗型号(如Panasonic Eneloop),续航时间≥30天;
-
适配器需支持过压保护(如TVS管SMBJ36A),避免损坏电路。
参考代码 基于瑞萨的血压测量仪电路+源代码+设计文档 www.youwenfan.com/contentcss/70636.html
三、软件算法设计
1. 主程序流程
graph TD
A[系统初始化] --> B[传感器校准]
B --> C[等待用户按键]
C --> D[启动测量]
D --> E[气泵充气]
E --> F[电磁阀放气]
F --> G[采集压力信号]
G --> H[运行血压算法]
H --> I[显示结果]
I --> J[蓝牙传输]
J --> C
- 系统初始化:初始化RL78的I2C、PWM、UART、LCD等外设;
- 传感器校准:读取传感器零点(无压力时的输出),补偿温度漂移;
- 等待用户按键:用户按下“开始”键,启动测量;
- 气泵充气:RL78输出PWM信号,控制气泵充气至180mmHg(高于收缩压);
- 电磁阀放气:RL78输出GPIO信号,控制电磁阀以3-5mmHg/秒的速度放气;
- 采集压力信号:RL78通过I2C读取传感器输出的压力信号(100Hz采样率);
- 运行血压算法:从压力信号中提取脉搏波,计算收缩压、舒张压和脉搏率;
- 显示结果:LCD显示血压值和状态(如“120/80 mmHg”);
- 蓝牙传输:将血压数据发送至手机APP。
2. 血压算法(示波法)
核心步骤:
-
信号预处理:对采集的压力信号进行IIR低通滤波(截止频率5Hz),去除高频噪声;
-
脉搏波提取:通过移动平均法提取脉搏波的包络(即脉搏波的峰值序列);
-
特征点检测:
- 平均压(MAP):脉搏波包络的最大值对应的袖带压力;
- 收缩压(SP):采用斜率差法(或FAN算法),找到脉搏波包络左侧(收缩压侧)的最平缓点;
- 舒张压(DP):采用脉搏降幅百分比法,找到脉搏波包络右侧(舒张压侧)的幅度下降最快点;
-
结果校准:根据传感器校准参数,补偿温度漂移和线性误差。
代码实现(简化版):
// 定义血压数据结构
typedef struct {
float systolic; // 收缩压(mmHg)
float diastolic; // 舒张压(mmHg)
float pulse_rate; // 脉搏率(次/分钟)
} BloodPressure;
// 示波法血压算法
BloodPressure oscillometric_algorithm(float *pressure_signal, int signal_length) {
BloodPressure bp;
float max_amplitude = 0.0f;
int max_index = 0;
int map_index = 0;
int sp_index = 0;
int dp_index = 0;
// 1. 提取脉搏波包络(移动平均法)
float envelope[signal_length];
for (int i = 0; i < signal_length; i++) {
envelope[i] = moving_average(pressure_signal, i, 5); // 5点移动平均
if (envelope[i] > max_amplitude) {
max_amplitude = envelope[i];
max_index = i;
}
}
// 2. 计算平均压(MAP)
map_index = max_index;
bp.systolic = envelope[map_index];
// 3. 计算收缩压(SP):斜率差法
float min_slope_diff = 1000.0f;
for (int i = 0; i < map_index; i++) {
float slope_diff = calculate_slope_diff(envelope, i, map_index);
if (slope_diff < min_slope_diff) {
min_slope_diff = slope_diff;
sp_index = i;
}
}
bp.diastolic = envelope[sp_index];
// 4. 计算舒张压(DP):脉搏降幅百分比法
float max_drop_percent = 0.0f;
for (int i = map_index; i < signal_length; i++) {
float drop_percent = (envelope[i] - envelope[i+1]) / envelope[i] * 100;
if (drop_percent > max_drop_percent) {
max_drop_percent = drop_percent;
dp_index = i;
}
}
bp.pulse_rate = calculate_pulse_rate(envelope, signal_length);
return bp;
}
// 移动平均函数
float moving_average(float *signal, int index, int window_size) {
float sum = 0.0f;
int half_window = window_size / 2;
for (int i = index - half_window; i <= index + half_window; i++) {
if (i >= 0 && i < signal_length) {
sum += signal[i];
}
}
return sum / window_size;
}
// 斜率差计算函数
float calculate_slope_diff(float *envelope, int start, int end) {
float slope = (envelope[end] - envelope[start]) / (end - start);
float diff_sum = 0.0f;
for (int i = start; i < end; i++) {
float current_slope = (envelope[i+1] - envelope[i]);
diff_sum += fabs(current_slope - slope);
}
return diff_sum / (end - start);
}
// 脉搏率计算函数
float calculate_pulse_rate(float *envelope, int signal_length) {
int pulse_count = 0;
for (int i = 1; i < signal_length; i++) {
if (envelope[i] > envelope[i-1] && envelope[i] > envelope[i+1]) {
pulse_count++;
}
}
return (pulse_count / (signal_length / 100)) * 60; // 100Hz采样率,转换为次/分钟
}
设计要点:
- 脉搏波包络提取需采用移动平均法或形态学滤波(如膨胀、腐蚀),确保包络平滑;
- 特征点检测需采用斜率差法(收缩压)和脉搏降幅百分比法(舒张压),提高准确性;
- 算法需通过临床测试(与医用血压计对比),调整参数(如移动平均窗口大小、斜率差阈值)。
3. 通信协议(BLE)
核心协议:BLE GATT(Generic Attribute Profile)。
服务与特征:
-
服务UUID:0x180D(心率服务);
-
特征UUID:0x2A37(心率测量值);
-
数据格式:采用IEEE 11073-20601标准,包含收缩压、舒张压、脉搏率等信息。
代码实现(简化版):
// BLE模块初始化
void ble_init() {
// 配置UART波特率为9600bps
uart_init(9600);
// 发送BLE模块初始化命令
uart_send("AT+INIT\r\n");
// 等待模块响应
while (uart_receive() != "OK");
// 配置GATT服务和特征
uart_send("AT+GATTADDCHAR=0x180D,0x2A37,0x10,0x01\r\n");
// 等待模块响应
while (uart_receive() != "OK");
}
// 发送血压数据
void ble_send_data(BloodPressure *bp) {
// 格式化数据为IEEE 11073-20601格式
uint8_t data[8];
data[0] = 0x00; // flags(无时间戳)
data[1] = (uint8_t)(bp->systolic / 10); // 收缩压(整数部分)
data[2] = (uint8_t)((bp->systolic - data[1]*10) * 10); // 收缩压(小数部分)
data[3] = (uint8_t)(bp->diastolic / 10); // 舒张压(整数部分)
data[4] = (uint8_t)((bp->diastolic - data[3]*10) * 10); // 舒张压(小数部分)
data[5] = (uint8_t)(bp->pulse_rate / 10); // 脉搏率(整数部分)
data[6] = (uint8_t)((bp->pulse_rate - data[5]*10) * 10); // 脉搏率(小数部分)
data[7] = 0x00; // 保留
// 发送数据
uart_send("AT+CHARWRITE=0x2A37,");
for (int i = 0; i < 8; i++) {
uart_send_int(data[i]);
uart_send(",");
}
uart_send("\r\n");
}
设计要点:
- BLE模块需与支持IEEE 11073-20601标准的手机APP配对(如Nordic Semiconductor的nRF Connect);
- 数据传输需采用CRC校验(如CRC16),确保数据完整性。