嵌入式学习(38)-基于STM32的气压计GZP6859D驱动
GZP6859D 型压力传感器采用 SOP6 封装形式,内部集成了高精度 ADC芯片,对传感器芯片输出的偏移、灵敏度、温漂和非线性进行数字补偿,以供电电压为参考,产生一个经过校准、温度补偿后的标准数字信号。GZP6859D 型压力传感器尺寸小,方便客户安装。产品广泛用于医疗电子、汽车电子、运动健身器材等领域。
·
一、概述
GZP6859D 型压力传感器采用 SOP6 封装形式,内部集成了高精度 ADC芯片,对传感器芯片输出的偏移、灵敏度、温漂和非线性进行数字补偿,以供电电压为参考,产生一个经过校准、温度补偿后的标准数字信号。GZP6859D 型压力传感器尺寸小,方便客户安装。产品广泛用于医疗电子、汽车电子、运动健身器材等领域。

二、应用
GZP5959D的通信方式是IIC总线,IIC总线使用 SCL和 SDA 作为信号线,这两根线都通过上拉电阻(典型值 4.7K)连接到 VDD,不通信时都保持为高电平。12C设备地址为 0x6D。 时序图:

根据时序图可以知道,读的指令是0XDA;写是0XDB;关于IIC底层的驱动不再赘述,直接上应用层的驱动。
关于读写指令:
/*********************************************************
函数功能:发送一个字节
入口参数:
返 回:无。
备 注:无。
作者:Roy
时间:2024-05-17
*********************************************************/
void GZP6859D_1_WriteByte(uint8_t addr,uint8_t data)
{
iic1_start(); /* 发送起始信号 */
iic1_send_byte(0xDA);
iic1_wait_ack(); /* 每次发送完一个字节,都要等待ACK */
iic1_send_byte(addr); /* 发送低位地址 */
iic1_wait_ack();
iic1_send_byte(data); /* 发送1字节 */
iic1_wait_ack(); /* 等待ACK */
iic1_stop(); /* 产生一个停止条件 */
delay_ms(4);
}
/*********************************************************
函数功能:接收一个字节
入口参数:
返 回:无。
备 注:无。
作者:Roy
时间:2024-05-17
*********************************************************/
uint8_t GZP6859D_1_ReadByte(uint8_t addr)
{
uint8_t temp = 0;
iic1_start(); /* 发送起始信号 */
iic1_send_byte(0xDA);
iic1_wait_ack(); /* 每次发送完一个字节,都要等待ACK */
iic1_send_byte(addr); /* 发送低位地址 */
iic1_wait_ack();
iic1_start(); /* 发送起始信号 */
iic1_send_byte(0xDB);
iic1_wait_ack();
temp=iic1_read_byte(0);
iic1_wait_ack();
iic1_stop(); /* 产生一个停止条件 */
delay_ms(2);
return temp;
}
其中读指令测试必要要延时4ms以上才行,这个使用的时候一定要注意,不然就会出现一直读不了数,还不知道是哪里问题。
关于初始化
/*********************************************************
函数功能:初始化
入口参数:
返 回:无。
备 注:无。
作者:Roy
时间:2024-05-17
*********************************************************/
void GZP6859D_1_Init(void)
{
uint8_t Temp_A5;
uint8_t P1,P2,P3;
uint8_t T1,T2;
IIC1_Init();
GZP6859D_1_WriteByte(0X30,0X0A);
T1= GZP6859D_1_ReadByte(0X09);
T2= GZP6859D_1_ReadByte(0X0A);
P1= GZP6859D_1_ReadByte(0X06);
P2= GZP6859D_1_ReadByte(0X07);
P3= GZP6859D_1_ReadByte(0X08);
printf(">>>>>>>>>压力传感器1初始化完成>>>>>>>>>\r\n");
}
关于压力读取:
/*********************************************************
函数功能:获取压力值
入口参数:
返 回:无。
备 注:无。
作者:Roy
时间:2024-05-17
*********************************************************/
float GZP6859D_1_GetPressure(void)
{
uint8_t P1,P2,P3;
uint8_t T1,T2;
int32_t Pre ,Temp;
float Pas;
float T;
GZP6859D_1_WriteByte(0X30,0X0A);
if((GZP6859D_1_ReadByte(0x30) & 0x08)==0)//数据采集完成标志位
{
T1= GZP6859D_1_ReadByte(0X09);
T2= GZP6859D_1_ReadByte(0X0A);
// Temp= T1*256+T2;
// T=Temp/256;
// printf("温度1:%.1f\r\n",T);
P1= GZP6859D_1_ReadByte(0X06);
P2= GZP6859D_1_ReadByte(0X07);
P3= GZP6859D_1_ReadByte(0X08);
Pre = P1*65536+P2*256+P3;
// printf("P1:%d\r\n",P1);
// printf("P2:%d\r\n",P2);
// printf("P3:%d\r\n",P3);
// printf("Pre:%d\r\n",Pre);
if (Pre > 8388608) //超过8388606 为负压值,需在显示终端做处理
{
Pas = (Pre - 16777216)/128; //单位为pa
return 0;
// printf("负数:%d\r\n",Pas);
}
else
{
Pas = Pre/128; //400是补偿值
}
if (Pas < 0)
{
Pas = fabs(Pas);
}
Pas=Pas/1000-0.05; //单位为Kpa
// printf("校准后的气压值:%f\r\n",Pas);
return Pas;
}
return 0;
}
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)