本文将详细讲解如何使用 STM32 单片机驱动 MSP20 血压 / 气压 / 压力传感器,并将采集到的压力数据实时显示在 OLED 屏幕上。教程采用STM32F103C8T6(最小系统板)、I2C 接口 OLED(0.96 寸)、MSP20 传感器,代码基于 HAL 库开发,适合新手学习和实操。
一、硬件准备与原理说明
1. 硬件清单
| 器件 | 数量 | 备注 |
|---|---|---|
| STM32F103C8T6 最小系统板 | 1 | 核心控制单元 |
| MSP20 压力传感器 | 1 | 模拟输出型压力传感器 |
| 0.96 寸 I2C 接口 OLED 屏 | 1 | 分辨率 128*64,SSD1306 驱动 |
| 杜邦线 | 若干 | 连接电路 |
| 5V 电源 / USB 数据线 | 1 | 给开发板供电 |
2. 核心原理
- MSP20 传感器:属于模拟输出型压力传感器,输出0.5V~4.5V的模拟电压,对应传感器的满量程压力(如 MSP20-010G 对应 0~10kPa,具体量程看传感器型号)。
- STM32 采集数据:通过 STM32 的ADC 外设采集 MSP20 的模拟电压,将电压值转换为对应的压力值。
- OLED 显示:通过 STM32 的 I2C 接口驱动 OLED 屏幕,将转换后的压力数据实时显示。
3. MSP20 传感器的用途与适用范围
这部分补充内容能帮助你更全面地了解 MSP20 传感器的实际价值,明确其应用场景和使用边界,也是教程发布时提升实用性的关键部分。
3.1 核心用途(按领域分类)
MSP20 系列传感器凭借体积小、精度高、响应快、成本低的特点,被广泛应用于多个领域,其中血压 / 气压 / 压力检测是其核心应用方向:
- 医疗健康领域(核心应用场景)
- 电子血压计(臂式、腕式)的血压检测,是家用和医用无创血压监测设备的核心传感器。
- 便携式医疗设备:如血氧仪、呼吸机的气压监测,输液泵的压力控制。
- 理疗设备:如气压按摩仪的压力调节与反馈。
- 工业测控领域
- 气动系统:气压表、气动阀门的压力检测与控制,空压机的压力监测。
- 液压系统:小型液压设备的低压检测(需匹配对应量程的 MSP20 型号)。
- 环境监测:大气压力、管道气压的实时采集(如工业车间的气压预警系统)。
- 消费电子领域
- 智能穿戴设备:智能手表、手环的气压高度计(辅助 GPS 定位)、压力感应(如触控压力识别)。
- 智能家居:智能马桶的水压检测,净水器的滤芯堵塞压力预警,空气净化器的风道气压监测。
- 玩具与无人机:无人机的气压定高(低精度场景),遥控车的压力感应刹车。
- 汽车电子领域
- 汽车胎压监测系统(TPMS)的辅助压力检测(低端车型适配)。
- 汽车空调系统的气压监测,燃油管路的低压检测。
- 物联网 / 户外设备领域
- 户外手持设备:登山表、户外 GPS 的大气压力与海拔高度测量。
- 气象站:小型气象监测设备的气压数据采集。
3.2 适用范围(技术与场景边界)
使用 MSP20 传感器时,需明确其适用的技术参数和场景限制,避免误用:
- 压力量程范围:MSP20 系列有多个量程型号,常见的有0~10kPa(MSP20-010G)、0~50kPa(MSP20-050G)、0~100kPa(MSP20-100G)等,其中0~10kPa/0~30kPa型号主要用于血压 / 气压检测,更高量程型号用于工业压力检测。
- 工作环境参数:
- 工作温度:-20℃~85℃(民用级),适合常温环境,不建议在高温(如工业熔炉旁)或低温(如极地环境)下长期使用。
- 工作湿度:0%~95% RH(无冷凝),避免在高湿度冷凝环境中使用(如水下,需额外做防水处理)。
- 电气参数适配:
- 供电电压:3.3V~5V(推荐 3.3V,与 STM32 单片机电平匹配),避免超过 5V 供电导致传感器损坏。
- 输出类型:模拟电压输出(0.5V~4.5V),适合单片机 ADC 采集,不支持数字信号直接输出(需额外加 AD 转换模块的场景不推荐使用)。
- 介质兼容性:MSP20 传感器主要检测干燥气体(空气、氮气等),少量型号可检测非腐蚀性液体(如水、矿物油),但禁止接触腐蚀性介质(如强酸、强碱、有机溶剂),否则会损坏传感器膜片。
- 安装与精度限制:
- 安装方式:贴片或直插式,适合小型设备的紧凑布局,建议垂直安装(膜片朝上)以减少重力影响。
- 精度等级:±1.5% FS(满量程),属于民用级精度,不适合高精度工业测控(如实验室级压力校准),但完全满足血压、气压等民用场景需求。
二、硬件接线
1. MSP20 与 STM32 接线
MSP20 传感器引脚说明:
VCC:供电(3.3V/5V,推荐 3.3V)GND:接地OUT:模拟电压输出NC:空脚,无需连接
接线表(STM32F103C8T6):
| MSP20 引脚 | STM32 引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 传感器供电 |
| GND | GND | 共地 |
| OUT | PB0 | 接 ADC1 的通道 8 |
| NC | - | 悬空 |
2. OLED 与 STM32 接线(I2C)
| OLED 引脚 | STM32 引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 屏幕供电 |
| GND | GND | 共地 |
| SCL | PB6 | I2C 时钟线 |
| SDA | PB7 | I2C 数据线 |
注意:如果你的 OLED 屏是 5V 供电,需注意电平匹配,建议使用 3.3V 供电避免损坏 STM32。
三、软件准备
1. 开发环境
- STM32CubeMX(用于配置 STM32 外设,生成初始化代码)
- Keil MDK-ARM(用于编写、编译代码,下载程序到 STM32)
- ST-Link 调试器(或 USB 转串口,用于下载程序)
四、代码编写
1. 导入 OLED 驱动代码
0.96 寸 I2C OLED 的驱动基于 SSD1306 芯片,需要导入对应的驱动文件:
- 新建
oled.c、oled.h文件,添加到 Keil 工程的Src和Inc目录下。 - 驱动代码可自行下载(SSD1306 I2C 驱动,网络上有成熟的开源代码),核心功能包括:OLED 初始化、清屏、显示字符 / 数字、显示字符串等。
关键提示:OLED 的 I2C 地址如果是 0x7A,需在驱动代码中修改
OLED_I2C_ADDR为 0x7A(默认一般为 0x78)。
2. 核心代码编写
1.adc.c(部分)
/** **************************************************************************************************** * @file adc.c * @author 送外卖的工程师 * @version V1.0 * @date 2025-11-23 * @brief MSP20血压/气压/压力传感器驱动 **************************************************************************************************** * @attention * * 实验平台:STM32F103C8T6 * CSDN:送外卖的工程师 * 技术指导VX:wmz14026 * 淘宝店铺:小马科技 * 闲鱼店铺:送外卖的工程师 * * 修改说明 * V1.0.0.251211 * 第一次发布 **************************************************************************************************** */ void MX_ADC1_Init(void) { /* USER CODE BEGIN ADC1_Init 0 */ /* USER CODE END ADC1_Init 0 */ ADC_ChannelConfTypeDef sConfig = {0}; /* USER CODE BEGIN ADC1_Init 1 */ /* USER CODE END ADC1_Init 1 */ /** Common config */ hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); } /** Configure Regular Channel */ sConfig.Channel = ADC_CHANNEL_8; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN ADC1_Init 2 */ /* USER CODE END ADC1_Init 2 */ } //主函数中添加 p=0.48471*v1 + 4.4168; // p= 48.471x + 4.4168 得到气压值 if(p<5) p=0; //初始值归零 display_xy(p); 2.adc.h
/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file adc.h * @brief This file contains all the function prototypes for * the adc.c file ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __ADC_H__ #define __ADC_H__ #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "main.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ extern ADC_HandleTypeDef hadc1; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_ADC1_Init(void); /* USER CODE BEGIN Prototypes */ uint32_t adc_get_result_average(uint32_t ch, uint8_t times); /* USER CODE END Prototypes */ #ifdef __cplusplus } #endif #endif /* __ADC_H__ */五、下载与测试
1. 编译代码
- 在 Keil 中点击
Build(编译)或Rebuild(重新编译),确保代码无错误。
2. 下载程序
- 将 ST-Link 调试器连接到 STM32 最小系统板的 SWD 接口(SWDIO、SWCLK、GND)。
- 在 Keil 中点击
Download(下载),将程序烧录到 STM32 中。
3. 测试效果
- 给 STM32 供电,此时 OLED 屏幕会显示压力值。
- 用手按压 MSP20 传感器的注射器,观察 OLED 上的压力值是否随压力变化而更新。
- 若用于血压检测场景,可将 MSP20 传感器连接到血压计的气囊管路,测试压力变化与实际血压的对应关系。
六、常见问题解决
OLED 屏幕无显示
- 检查接线是否正确(SCL→PB6,SDA→PB7),确保 VCC 和 GND 接对。
- 确认 OLED 的 I2C 地址是否正确(0x78 或 0x7A),修改驱动代码中的地址。
- 检查 OLED 初始化函数是否执行成功。
压力值始终为 0 或最大值
- 检查 MSP20 的接线(OUT→PA0),确保模拟输出引脚连接正确。
- 检查 ADC 采集函数是否正常读取到值(可添加串口打印调试)。
压力值波动过大
- 增加 ADC 的采样时间(如改为
239.5 Cycles),或多次采样取平均值(如采集 10 次取平均)。 - 给 MSP20 的 VCC 引脚添加 0.1μF 的去耦电容,减少电源干扰(尤其在血压检测等高精度场景中)。
- 确保传感器感应面无异物遮挡,且安装环境无剧烈振动。
- 增加 ADC 的采样时间(如改为