ASAIR 奥松电子 · MEMS压阻式表压传感器 · STM32F103C8T6 演示程序
AGR12100A 是广州奥松电子(ASAIR)推出的 MEMS 压阻式表压传感器模块,采用硅压阻芯体,将气体压力信号线性转换为模拟电压输出,广泛应用于工业控制、医疗设备、消费电子等领域。
AGR12100A 内部集成 MEMS 压阻式压力传感芯体与专用信号调理电路,采用比例输出(Ratiometric)架构——输出电压与供电电压成比例关系。在 5V 供电下,零点输出 0.5V,满量程输出 4.5V,对应压力量程 0~100 kPa。模块采用八角形 PCB 封装,顶部带气压接口,底部为 SIP 直插引脚(VCC / GND / OUT),安装便捷。
传感器的核心是一片利用 MEMS 工艺在单晶硅上刻蚀出的弹性薄膜(Diaphragm)。薄膜上通过离子注入形成四个压阻应变元件,构成惠斯通电桥(Wheatstone Bridge)。其工作过程如下:
气体压力通过气压接口作用于硅膜片正面,使膜片产生微小弹性形变。
膜片形变导致应变电阻阻值变化——受拉区域电阻增大,受压区域电阻减小。
惠斯通电桥失去平衡,输出与压力成正比的差分毫伏级电压信号。
内部 ASIC 对微弱信号放大、温度补偿、线性校正,输出 0.5~4.5V 标准电压。
| 参数 | 数值 | 说明 |
|---|---|---|
| 品牌/型号 | ASAIR AGR12100A | 广州奥松电子 |
| 传感原理 | MEMS 压阻式 | 硅压阻芯体 + 惠斯通电桥 |
| 测量类型 | 表压 (Gauge) | 以大气压为参考零点 |
| 压力量程 | 0 ~ 100 kPa | 对应 0 ~ 100000 Pa |
| 供电电压 | 5.0 V DC | 典型值,范围 4.5~5.5V |
| 零点输出 | 0.5 V (500 mV) | 零压力时输出电压 |
| 满量程输出 | 4.5 V (4500 mV) | 满量程压力时输出 |
| 输出特性 | 比例输出 (Ratiometric) | 输出与供电电压成比例 |
| 输出接口 | 模拟电压 | 单端输出 |
| 引脚定义 | VCC / GND / OUT | 3-pin SIP 直插 |
| 引脚间距 | 2.54 mm | 标准 0.1 英寸 |
| 封装形式 | 八角形 PCB + 气压接口 | 顶部 Φ3mm 气嘴 |
0~100 kPa 量程覆盖常见工业气压范围,适用于正压检测场景。
输出电压与供电成比例,配合同源基准的 ADC 可消除供电波动影响。
ASIC 集成温度补偿算法,在全温区保持输出精度稳定。
八角形 PCB + SIP 直插引脚,标准 2.54mm 间距,兼容面包板与 PCB。
5V 供电下工作电流小,适合电池供电与嵌入式系统集成。
MEMS 工艺制造,抗震动、抗冲击,适用于工业现场长期运行。
以下为传感器各角度实物照片,原尺寸展示。
以下为传感器模块的原理图与 PCB 封装设计。
原理图中传感器 U1 为 6 引脚封装,引脚 2、4 接 +5V 供电,引脚 3、6 接地,引脚 5 为模拟电压输出(OUT)。由于传感器输出范围超过3.3V,而 STM32F103C8T6 的 ADC 输入范围为 0~3.3V,因此使用 R1 = R2 = 10KΩ 构成 1:1 分压电路,将传感器输出电压衰减一半后送入 MCU 的 PA0(ADC1_IN0) 引脚。
PCB 封装图中,U1 为传感器的 6 引脚封装(左侧引脚 1/2/3,右侧引脚 6/5/4),R1 与 R2 为两颗 10KΩ 电阻的封装,布置在 U1 右侧。所有焊盘采用圆形通孔设计,引脚间距为标准 2.54mm,可直接对应传感器实物引脚布局。
演示程序基于 STM32F103C8T6 + HAL 库开发,通过 ADC1 通道 0 采集传感器模拟电压,经线性映射计算压力值,并在 OLED 屏幕上显示。以下从硬件连接、时钟配置、ADC 采集、电压换算到压力计算进行逐段分析。
| 外设 | MCU 引脚 | 功能 |
|---|---|---|
| ADC1_IN0 | PA0 | 采集传感器分压后模拟电压 |
| OLED SDA | PB14 | OLED I2C 数据线 |
| OLED SCL | PB15 | OLED I2C 时钟线 |
| 传感器 VCC | +5V | 传感器供电 |
| 传感器 GND | GND | 共地 |
| 传感器 OUT | → R1 → PA0 | 经 10K/10K 分压接 MCU |
系统采用外部高速晶振(HSE 8MHz),经 PLL 倍频 9 倍后得到 72MHz 系统主频。ADC 时钟由 APB2(72MHz)8 分频得到 9MHz,满足 STM32F103 ADC 时钟不超过 14MHz 的要求。
main.c — SystemClock_Config() RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; // 使用外部晶振 8MHz RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; // PLL ×9 → SYSCLK = 72MHz RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; // APB1 = 36MHz RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // APB2 = 72MHz PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV8; // ADC时钟 = 72/8 = 9MHz
ADC1 配置为单通道、软件触发、12位分辨率、右对齐。通道 0(PA0)采样时间设为 239.5 个 ADC 时钟周期,确保高阻抗信号源下的采样精度。
adc.c — MX_ADC1_Init() hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // 单通道扫描关闭 hadc1.Init.ContinuousConvMode = DISABLE; // 单次转换模式 hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; // 软件触发 hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; // 数据右对齐,12位有效 hadc1.Init.NbrOfConversion = 1; // 1个转换通道 sConfig.Channel = ADC_CHANNEL_0; // PA0 → ADC1_IN0 sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5; // 239.5周期采样 // GPIO: PA0 设为模拟输入模式 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
ADC 采集到的是 PA0 引脚上的分压后电压(0~2.5V),需还原为传感器原始输出电压。STM32F103 的 ADC 为 12 位,参考电压 3.3V,转换公式如下:
× 2 正是为了还原 R1/R2 = 10K/10K 的 1:1 分压衰减。传感器实际输出 0.5~4.5V 经分压后为 0.25~2.25V,均在 ADC 3.3V 量程范围内。
已知传感器输出电压与压力呈线性关系:0.5V 对应 0 Pa,4.5V 对应 100000 Pa(100 kPa)。程序中使用 map() 函数完成线性映射:
main.c — map() 线性映射函数 long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } // 调用: 将电压 500~4500mV 映射为压力 0~100000Pa pressure = map(Pressure_V, Voltage_0, Voltage_100, 0, 100000.0);
映射后进行上下限幅处理,确保输出值在 0~100000 Pa 范围内:
if(pressure <= 0) pressure = 0; // 下限幅 if(pressure >= 100000.0) pressure = 100000.0; // 上限幅
主循环以 500ms 为周期,利用 HAL_GetTick() 实现非阻塞定时。每次周期触发 ADC 采集、电压换算、压力计算、OLED 显示更新。
main.c — while(1) 主循环 while (1) { if(HAL_GetTick() - Time_Now >= 500) { // 每500ms执行一次 // ① 启动ADC并等待转换完成 HAL_ADC_Start(&hadc1); if(HAL_ADC_PollForConversion(&hadc1, 999) == HAL_OK) Pressure_V = (HAL_ADC_GetValue(&hadc1) * 3300 / 4095.0) * 2; // ② 计算传感器输出电压 HAL_ADC_Stop(&hadc1); // ③ 线性映射为压力值 pressure = map(Pressure_V, Voltage_0, Voltage_100, 0, 100000.0); // ④ 压力限幅 if(pressure <= 0) pressure = 0; if(pressure >= 100000.0) pressure = 100000.0; // ⑤ OLED 显示更新 OLED_Clear(); OLED_CenterPrintf(16, "压力"); OLED_CenterPrintf(32, "%dPa", pressure); OLED_Update(); Time_Now = HAL_GetTick(); // ⑥ 更新时间戳 } }
以下为完整的程序执行流程图,从上到下展示初始化阶段与 while(1) 主循环的完整逻辑。
通过动态可视化展示传感器信号采集链路与实时压力监测效果。
气体压力 → 传感器 → 分压电路 → ADC → MCU计算 → OLED显示
模拟传感器在不同压力下的读数变化(0~100 kPa)
传感器输出电压与压力值的线性对应关系