一、产品概述
XGZP6847A是一款适用于生物医学、汽车电子等领域的压力传感器。其核心部分是一颗利用MEMS技术加工的硅压阻式压力敏感芯片,外部施压作用在弹性膜上时电桥会产生一个与所加压力成线性比例关系的电压输出信号,传感器内部金属片发生微小的形变,导致电阻值的变化,通过测量阻值的变化,就可以得到压力的大小。(该压力敏感芯片由一个弹性膜及集成在膜上的四个电阻组成,四个压敏电阻形成了惠斯通电桥结构。)
工作温度范围: -30°C~+100°C
气压测量范围:0~40kPa
应用领域:
电子血压计、呼吸机、制氧机、监护仪等医疗领域
胎压计、MAP、转向助力、刹车助力等汽车电子领域
按摩器、按摩椅、气垫床等运动健身器材领域
真空包装机、真空搅拌机、真空破壁机、真空保鲜盒、真空泵等真空负压领域
洗衣机、啤酒机、咖啡机、吸尘器、净水机、压力仪表、气动元件等领域
二、引脚定义
XGZP6847A压力传感器共有六个引脚。
1号端口不接,2号、4号都接电源+3.3v / +5v,3号、6号接GND,5号接ADC的IO口。
三、测量显示气压水压
接线:
4针OLED:GND -> GND; VCC -> 3.3V; SCL -> PB6; SDA -> PB7;
气压传感器:VCC -> 5V; GND -> GND; AO -> PA1;
USB转串口模块:GND -> GND; RX -> PA9; TX -> PA10;
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "adc.h"
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "OLED_I2C.h"
int ADC;
float Pressure_V=0.0;
long pressure=0;
char V_disbuff[5]={0};
char P_disbuff[6]={0};
const float VCC =3300; // ADC参考电压为mV
const float Voltage_0 =160; // 零点电压值mV 校准时需修改
const float Voltage_40 =3750 ; // 满量程输出电压值mV 需修改
long map(long x, long in_min, long in_max, long out_min, long out_max);
void BEND_Value_Conversion()
{
/*显示电压值*/
V_disbuff[0]=(long int)(Pressure_V)/1000+'0';
V_disbuff[1]=(long int)(Pressure_V)%1000/100+'0';
V_disbuff[2]=(long int)(Pressure_V)%100/10+'0';
V_disbuff[3]=(long int)(Pressure_V)%10+'0';
OLED_ShowStr(36,2,V_disbuff,2);
/*显示气压值*/
if(pressure<=0){pressure=0;}
if(pressure>=40000){pressure=40000;}
P_disbuff[0]=(int)((pressure))/10000+'0';
P_disbuff[1]=(int)((pressure))%10000/1000+'0';
P_disbuff[2]=(int)((pressure))%1000/100+'0';
P_disbuff[3]=(int)((pressure))%100/10+'0';
P_disbuff[4]=(int)((pressure))%10+'0';
OLED_ShowStr(27,4,P_disbuff,2);
}
int main(void)
{
delay_init();
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(9600); //串口初始化为9600
I2C_Configuration();
OLED_Init();
OLED_CLS();
Adc_Init();
OLED_ShowCN(0, 0,0); //显示“气”
OLED_ShowCN(18,0,1); //显示“压”
OLED_ShowCN(36,0,2); //显示“检”
OLED_ShowCN(54,0,3); //显示“测”
OLED_ShowCN(72,0,4); //显示“系”
OLED_ShowCN(90,0,5); //显示“统”
OLED_ShowStr(0,2,"V:",2);
OLED_ShowStr(0,4,"P:",2);
OLED_ShowStr(71,2,"mv",2);
OLED_ShowStr(79,4,"pa",2);
while(1)
{
ADC = Get_Adc_Average(1,10); //10次平均值
Pressure_V=(ADC*VCC)/4096;
pressure = map(Pressure_V, Voltage_0, Voltage_40, 0, 40000.0);
printf("Voltage:%f mV\r\n",Pressure_V);
printf("Pressure:%ld pa\r\n",pressure);
BEND_Value_Conversion();
delay_ms(500);
}
}
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;
}
//映射函数,将输入值x从一个范围映射到另一个范围
我们首先通过Get_Adc_Average()函数读取ADC采样值,然后通过计算公式将ADC采样值转换为电压值电压V,接着将电压值电压V映射到压强值p(单位:pa)。( V=K * p ,其中K是一个系数)
(注意:供电不同时,即3.3v供电和5v供电时,所对应的气压与电压曲线稍有不同)