基于瑞萨的血压测量仪电路实现

基于瑞萨的血压测量仪电路实现

一、系统架构设计

基于瑞萨的血压测量仪系统架构分为传感器模块模拟前端(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

二、硬件电路设计

1. 传感器模块电路

核心器件:Honeywell ABPDANN005PG2A3(I2C数字输出)。

电路连接

设计要点

2. 模拟前端(AFE)电路

核心器件:RL78/H1D内置AFE(24位ΔΣ ADC、PGA、运算放大器)。

电路设计

3. 微控制器(RL78/H1D)电路

核心器件:RL78/H1D(R5F11NMGAFB#10,80pin LFQFP)。

电路连接

4. 执行模块电路

核心器件:MITSUMI MAP-AM-265气泵(6V)、Yujin KSV05B电磁阀(6V)。

电路设计

5. 通信模块电路

核心器件:RL78/G1D BLE模块(支持蓝牙4.0)。

电路连接

6. 电源模块电路

核心器件:4节AAA电池(6V)、DC 6V适配器、XC6206-3.3V(低压差稳压器)。

电路设计

参考代码 基于瑞萨的血压测量仪电路+源代码+设计文档 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

2. 血压算法(示波法)

核心步骤

代码实现(简化版)

// 定义血压数据结构
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)。

服务与特征

// 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");
}

设计要点

 

专注于matlab/simulink,电子电路,编程