电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
x-nucleo-iks01a3使用之压力传感器lps22hh
分 享
扫描二维码分享
x-nucleo-iks01a3使用之压力传感器lps22hh
iks01a3
lps22hh
LPC11U68
hehung
关注
发布时间: 2019-09-17
丨
阅读: 3196
# 1、背景 lps22hh是x-nucleo-iks01a3上板载的一个压力传感器,其特点是: LPS22HH是一种超小型压阻式绝对压力传感器,可作为数字输出气压计使用;可以检测出260至1260hpa绝对压力,使用功耗电流消耗可以降至4μA,绝对压力精度为0.5 hpa,低压传感器噪声为0.65pa,担忧温度传感器,可以作为嵌入式温度补偿,为24位压力数据输出,支持SPI、I2C或MIPI i3csm接口,供电电压范围为1.7至3.6V,能够抗高压22000g。 上一篇文章中介绍了x-nucleo-iks01a3上关于stts751温度传感器的使用: [x-nucleo-iks01a3使用之温度传感器STTS751](https://www.icxbk.com/article/detail?aid=895 "x-nucleo-iks01a3使用之温度传感器STTS751") # 2、原理图 ![](https://cf05.ickimg.com/bbsimages/201909/85b4c91e95726dcfb1023e3a07db16a1.jpg) 从原理图中可以看到lps22hh也是使用的I2C地址为0xBE。 下图是传感器在板子上的位置 ![](https://cf05.ickimg.com/bbsimages/201909/f0102db76faeb57920880439c43f297f.jpg) #3、寄存器 知道了传感器的位置和原理图之后,就开始要知道如何操作该传感器了,查看数据手册,有下面几个比较重要的寄存器,在操作该芯片的时候需要用到的。 寄存器总览: ![](https://cf05.ickimg.com/bbsimages/201909/9bdc228ecaf8d166e3f2ecb1029b3319.jpg) 可以看到该芯片的寄存器比较多,其中主要使用的寄存器有: ## 控制寄存器IF_CTRL(0x0E) ![](https://cf05.ickimg.com/bbsimages/201909/307f732583d356a079ab9f22a2258ee5.jpg) 这个寄存器使能IIC操作的,传感器初始化的时候可以设置该值为0x1A,也就是选择使用了上拉电阻和I2C。对于不同的通信总线凡是可以配置不同的设置。 ## 寄存器WHO_AM_I(0x0F) ![](https://cf05.ickimg.com/bbsimages/201909/934ed4183edce05c466bf45fcc74d1a8.jpg) 该寄存器是该芯片的固有ID值,通过读取该寄存器的值,该芯片的固有ID值为0xB3 ## 控制寄存器CTRL_REG1(0x10) ![](https://cf05.ickimg.com/bbsimages/201909/d93f2aedcaf325342124d7be98beb24e.jpg) 这个寄存器可以设置输出数据的格式,数据转换频率和低通滤波等功能。 该寄存器需要在传感器初始化的时候进行配置,需要设置位ODR[2:0]位以指定频率进行数据的读取,默认是单词触发读取,我这是的0x01,每一秒钟更新一次数据。 ## 获取压力数据寄存器 压力数据是使用24位的寄存器进行存放的,分别存在了长度为8的三个寄存器里面,这三个寄存器分别是*PRESS_OUT_XL(0X28),PRESS_OUT_L(0X29),PRESS_OUT_H(0X2A)* 其中,PRESS_OUT_XL(0X28)是最低位寄存器,PRESS_OUT_L(0X29)是低位寄存器,PRESS_OUT_H(0X2A)是高位寄存器 ![](https://cf05.ickimg.com/bbsimages/201909/64706c3a78be13724f8f990918f8713a.jpg) 通过读取这三个寄存器的值,进行转换之后就是我们期望获取的压力数据了,可以使用唯一的方式:Get_Pressure_H_LPS22HH()<<16)|(Get_Pressure_L_LPS22HH()<<8)|(Get_Pressure_XL_LPS22HH() ## 温度寄存器 该芯片自带有温度寄存器,可以进行对压力数据的补偿,温度寄存器是16位的数据,使用的是2个8位的寄存器。 分别是:TEMP_OUT_L(0x28)和TEMP_OUT_H(0x2C),对于获取的温度值,需要除以100才是正常的温度。 ![](https://cf05.ickimg.com/bbsimages/201909/752d260d5e26c410f047864d70777099.jpg) 上面的几个寄存器就是该芯片使用时的最主要的几个寄存器了,下面该讲述如何在代码中实现。 # 4、程序实现 x-nucleo-iks01a3还是结合lpc11u68来实现功能,工程的创建就不进行详细的描述了,不是本文的重点,可以在上篇文章中的工程的基础上添加该传感器的模块文件即可。 ## 读写IIC数据 ```c //LPS22HH写 static int IIC_WrDat_LPS22HH(uint8_t IIC_Add, uint8_t IIC_Reg, uint8_t IIC_Data) { uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Reg); //write data ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Data); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Stop(); return 0; } //LPS22HH读 static int IIC_Read_LPS22HH(uint8_t IIC_Add, uint8_t IIC_Reg) { int ret; uint8_t ret_suc = 1; IIC_Start(); IIC_Send_Byte(IIC_Add & 0xfe); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Send_Byte(IIC_Reg); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} IIC_Start(); IIC_Send_Byte(IIC_Add | 0x01); ret_suc = IIC_Wait_Ack(); if(ret_suc == 1) {return -1;} ret=IIC_Read_Byte(1); IIC_Stop(); return ret; } ``` 寄存器的读写,寄存器的读写是在读写IIC的代码的基础上实现的,需要使用IIC对该芯片的寄存器进行操作,代码如下: ```c //设置寄存器 int Set_Reg_LPS22HH(uint8_t add, uint8_t reg, uint8_t dat) { int ret_succ = -1; uint8_t i = 20u; //失败之后尝试的次数 do{ if(0 == IIC_WrDat_LPS22HH(add, reg, dat)) { ret_succ = 0; //设置成功 break; } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_succ; } //读取寄存器 int Get_Reg_LPS22HH(uint8_t add, uint8_t reg) { uint8_t i = 20u; int ret_get = -1; do{ ret_get = IIC_Read_LPS22HH(add, reg); if(-1 != ret_get) { break; //获取数据成功 } else { i--; //获取失败,再次尝试 } }while(i>0u); return ret_get; } ``` 下面是操作几个主要寄存器的代码的实现,如下所示: ```c //读取我是谁 int Get_WHO_AM_I_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_WHO_AM_I); } //获取状态寄存器 int Get_Status_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_STATUS); } //获取压力值XL int Get_Pressure_XL_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_XL); } //获取压力值L int Get_Pressure_L_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_L); } //获取压力值H int Get_Pressure_H_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_PRE_OUT_H); } float Get_Pressure(void) { static float Last_return_p = 0.0f; int get_p; if((Get_Pressure_H_LPS22HH() != -1) &&(Get_Pressure_L_LPS22HH() != -1) &&(Get_Pressure_XL_LPS22HH() != -1)) { get_p = (Get_Pressure_H_LPS22HH()<<16)|(Get_Pressure_L_LPS22HH()<<8)|(Get_Pressure_XL_LPS22HH()); Last_return_p = ((float)get_p / 4096.0f); } else { } return Last_return_p; } //获取温度值H int Get_Temp_L_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_TEMP_OUT_L); } //获取温度值H int Get_Temp_H_LPS22HH(void) { return Get_Reg_LPS22HH(LPS22HH_ADDR_W_1, LPS22HH_REG_TEMP_OUT_H); } float Get_Temp(void) { static float Last_return_t = 0.0f; int get_t; if((Get_Temp_H_LPS22HH() != -1) &&(Get_Temp_L_LPS22HH() != -1)) { get_t = (Get_Temp_H_LPS22HH()<<8)|(Get_Temp_L_LPS22HH()); Last_return_t = ((float) get_t / 100.0f); } else { } return Last_return_t; } ``` 串口操作,将读取和处理后的数据发送到串口,可以使用电脑的串口助手进行读取: ```c void Send_Uart_LPS22HH(void) { char str[35] = {0}; send_str((uint8_t *)"<-----------START--------->\r\n"); sprintf(str,"Pressure:%f\r\n", Get_Pressure()); send_str((uint8_t *)str); sprintf(str,"Temp:%f\r\n", Get_Temp()); send_str((uint8_t *)str); sprintf(str,"Who_am_i:%X\r\n",Get_WHO_AM_I_LPS22HH()); send_str((uint8_t *)str); send_str((uint8_t *)"<------------END---------->\r\n\n"); } ``` 最后是.h文件中的宏定义,为了程序的可以执行和编译修改,对寄存器的描述均采用了宏定义的方式: ```c #define LPS22HH_REG_INT_CFG (0x0BU) #define LPS22HH_REG_IF_CTRL (0x0EU) #define LPS22HH_REG_WHO_AM_I (0x0FU) #define LPS22HH_REG_CTRL_1 (0x10U) #define LPS22HH_REG_STATUS (0x27U) #define LPS22HH_REG_PRE_OUT_XL (0x28U) #define LPS22HH_REG_PRE_OUT_L (0x29U) #define LPS22HH_REG_PRE_OUT_H (0x2AU) #define LPS22HH_REG_TEMP_OUT_L (0x2BU) #define LPS22HH_REG_TEMP_OUT_H (0x2CU) /@@*IIC slave address write and read*/ /@@*SD0 connect to power supply*/ #define LPS22HH_ADDR_W_1 0xBAU #define LPS22HH_ADDR_R_1 0xBBU /@@*SD0 connect to ground*/ #define LPS22HH_ADDR_W_0 0xB8U #define LPS22HH_ADDR_R_0 0xB9U ``` # 5、数据采集效果 使用串口助手查看数据,显示如下,用手压住压力传感器,因为温度数据产生了变化,补偿的值不一样,最终读取的压力传感器反馈的数据也是不一样的。 ![](https://cf05.ickimg.com/bbsimages/201909/4f8769adedd0af9815fb6302eb064394.jpg) ![](https://cf05.ickimg.com/bbsimages/201909/4db815b3506a3cdaa65b3c3517d5224e.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
hehung
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交