LIS3DH 三轴加速度传感器使用流程及示例
LIS3DH是一个三轴加速度传感器,可用于检测X、Y、Z轴上的加速度,以及设置阈值,在加速度超出阈值时触发中断,支持SPI和IIC读写。
下面主要是IIC方式读写:
SPI方式读写类似,参考手册即可。一般情况下,可以用2根线,没必要用3线或者4线。而且IIC用GPIO模拟很方便,网上例程很多,这里就不贴了,搜一搜就有。
一、寄存器读写流程
首先硬件连接会决定该模块的IIC地址
如果SAO脚接地,IIC地址为0X30(不包含最低位).
如果接V3.3,则IIC地址为0X32(不包含最低位).
这个器件地址很重要,因为读写寄存器都是要先写一下对应的器件地址,然后再执行命令的。
注意先发送的器件地址只是前7位,最后一位决定的是读写位,0是写寄存器,1为读寄存器,所以写寄存器时是先写入“LIS_ADDR|0x00”,读的时候则是先写入“LIS_ADDR|0x01”,(LIS_ADDR这里指上文的IIC地址)。
a、主机向从机写一个字节,下表是通过IIC向LIS3DH寄存器写一个字节的流程。简单来说就是:先写1个字节的写命令+IIC地址,再写一个字节的你要写的寄存器地址,最后写一个字节你要写入寄存器的内容。
示例:
//IIC写一个字节
//reg:寄存器地址
//data:数据
//返回值:0,正常
//其他,错误代码
uint8_t LIS_Write_Byte(uint8_t reg,uint8_t data)
{IIC_Start(); IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令if(IIC_Wait_Ack()) //等待应答{IIC_Stop(); return 1; }IIC_Send_Byte(reg|0x00); //写寄存器地址 D7位为低用于单字节传输IIC_Wait_Ack(); //等待应答IIC_Send_Byte(data); //发送数据if(IIC_Wait_Ack()) //等待ACK{IIC_Stop();return 1;}IIC_Stop(); Sleep(5000); //休眠5msreturn 0;
}
b、LIS3DH读寄存器一个字节
流程:先写1个字节的写命令+IIC地址,再写你要读的寄存器,然后写1个字节的读命令+IIC地址,最后读一个字节的数据
示例:
//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据
uint8_t LIS_Read_Byte(uint8_t reg)
{uint8_t res=0x00;IIC_Start();IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令 if(IIC_Wait_Ack()) //等待ACK{IIC_Stop(); return 1; }IIC_Send_Byte(reg); //写寄存器地址IIC_Wait_Ack(); //等待应答IIC_Start();IIC_Send_Byte(LIS_ADDR|0x01); //发送器件地址+读命令 IIC_Wait_Ack(); //等待应答 res = IIC_Read_Byte(0); //读取数据,发送nACKIIC_Stop(); //产生一个停止条件 return res;
}
c、IIC连续写寄存器:
示例:
//IIC连续写
//addr:器件地址
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
// 其他,错误代码
uint8_t LIS_Write_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{uint8_t i; IIC_Start();IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令if(IIC_Wait_Ack()) //等待应答{IIC_Stop(); return 1; }IIC_Send_Byte(reg|0x80); //写寄存器地址 D7位为高用于多字节传输IIC_Wait_Ack(); //等待应答for(i=0;i<len;i++){IIC_Send_Byte(buf[i]); //发送数据if(IIC_Wait_Ack()) //等待ACK{IIC_Stop(); return 1; } } IIC_Stop();return 0;
}
d、IIC方式连续读寄存器。注意MAK和NMAK。
示例:
//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
// 其他,错误代码
uint8_t LIS_Read_Len(uint8_t addr,uint8_t reg,uint8_t len,uint8_t *buf)
{IIC_Start();IIC_Send_Byte(LIS_ADDR|0x00);//发送器件地址+写命令if(IIC_Wait_Ack()) //等待应答{IIC_Stop(); return 1; }IIC_Send_Byte(reg|0x80); //写寄存器地址 D7位为高用于多字节传输IIC_Wait_Ack(); //等待应答IIC_Start();IIC_Send_Byte(LIS_ADDR|0x01);//发送器件地址+读命令IIC_Wait_Ack(); //等待应答while(len){if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK else *buf=IIC_Read_Byte(1); //读数据,发送ACK len--;buf++; } IIC_Stop(); //产生一个停止条件 return 0;
}
二、设置阈值震动触发中断应用
首先,通过读取一个叫WHO_AM_I的寄存器,可以用来确定芯片可用,因为这个寄存器读取的值是恒定的0x33,这通常用来做芯片的初始化检测。
设置阈值触发中断示例:
该实例设置了中断锁存。即直到重新读取INT1_SRC寄存器前,中断都不会被清除,引脚会被一直强拉到重新读取INT1_SRC为止。
一般情况情况下,三轴加速度传感器记录了XYZ三个轴的加速度数据,这个加速度应该包括重力加速度的。理论上,重力加速度会一直存在,影响我们的中断检测,所以我们需要想办法排除它。好消息是芯片本身已经自带了一个内部滤波器,可以通过设置一个初始状态,让芯片在随后的过程中始终将读到的加速度与这个初始值做对比,差值才视为加速度的值,这个值超过一定范围才触发中断,这样重力加速度的因素就可以被排除。下面的示例就是这么做的:
LIS_Write_Byte(CTRL_REG1,0x3F); //设置低功耗模式 xyz轴使能 采样频率25HZLIS_Write_Byte(CTRL_REG2,0x09); //高通滤波正常模式,数据从内部滤波器到输出寄存器 高通滤波器使能到中断1LIS_Write_Byte(CTRL_REG3,0x40); //使能AOI中断1LIS_Write_Byte(CTRL_REG4,0x80); //分辨率为+-2g 则单位为 4000/(2^8)=16mg 仅在LSB和MSB被读时才更新数据LIS_Write_Byte(CTRL_REG5,0x08); //寄存器锁存中断,只有读INT1_SRC可以恢复LIS_Write_Byte(INT1_THS,0x10); //设置阈值 16*16=256 mgLIS_Write_Byte(INT1_DURATION,0x00); //中断持续时间设置,此处设为0,因为不读INT1_SRC中断就一直锁存LIS_Read_Byte(REFERENCE); //读虚寄存器,强制将当前加速度值加载到高通滤波器值进行比较//INT1_CFG使能中断 中断模式为 “OR”组合 只使能xyz轴高事件//LIS_Write_Byte(INT1_CFG,0x2A);//INT1_CFG使能中断 中断模式6-direction position 使能xyz轴高低事件LIS_Write_Byte(INT1_CFG,0xFF);LIS_Read_Byte(INT1_SRC);//清除中断位
不过这样也要注意,在芯片初始化,记录起始状态的时候(装载滤波器值),要尽量保证芯片处于静止状态,否则对加速度的差值判断就不准了。
另外,还可以设置中断触发指定时间,在指定时间内中断引脚强制拉高,随后引脚会还原。主要通过设置INT1_DURATION (33h)寄存器。
这个ODR可以通过GTRL_REG1设置。
最后中断持续时间就是INT1_DURATION/ODR
三、FIFO模式读取X、Y、Z轴方向加速度值
一般如果没有高速读写需求,直接读OUT_X_L、OUT_X_H等6个寄存器,就可以读到XYZ轴的加速度值。通过配置部分CREG寄存器,可以设置这些加速度值的精度,采样频率等,具体可以参考手册,这里就不详细展开了。
出于高速读写的需求,可能需要使用FIFO方式来进行加速度的读取。
LIS3DH的FIFO模式有4种:
1、Bypass mode
中间模式,只有切换模式的时候用得到
2、FIFO mode
数据填充满缓冲区后,停止继续填充
3、Stream mode
数据持续输出,填充满缓冲区后会覆盖旧的数据,数据依次向前推一字节
4、Stream-to-FIFO mode
FIFObuffer开始处于stream模式,等到中断脚选择触发时,切换到FIFO模式。FIFO_CTRL_REG (2Eh)的TR位可以决定是INT1脚还是INT2脚来进行控制。芯片手册上貌似写这是一种用于调试的模式,实际应用前两种应该就够了
示例:读取XYZ轴方向的加速度,用Stream mode。
watermark是指配置FSS [4:0]来检查读取的时候数据总量是否超出指定的范围。因为FIFO的缓冲区最多为32级,比如可以设置为20,则读取的时候,如果当时数据超出20个,则FIFO_SRC_REG (2Fh) (WTM)位会被置1,否则为0。
如果32级缓冲区全部满了,FIFO_SRC_REG (2Fh) 的 OVRN_FIFO会被置1。这两个标志位都是可以配置触发中断的,可以将这两个事件配置到芯片的两个中断引脚用于检测FIFO溢出。
//测试FIFO
IIC_WriteByte(LIS3DH_CTRL_REG1,0x80|0x0F); //0010 0111 低功耗模式
IIC_WriteByte(LIS3DH_CTRL_REG2,0x00); //高通滤波关闭IIC_WriteByte(LIS3DH_CTRL_REG3,0x06); //使能FIFO中断 0000 0110
IIC_WriteByte(LIS3DH_CTRL_REG4,0x00); //分辨率+-16g 0011 0000IIC_WriteByte(LIS3DH_CTRL_REG5,0x48); //FIFO使能 0100 1000
IIC_WriteByte(LIS3DH_FIFO_CTRL,0x80|0x1D); //0100 1111 配置FIFO模式和水印IIC_ReadByte(LIS3DH_INT1_SRC); //清除中断位collect_LIS_Data();void collect_LIS_Data(void)
{uint16_t LIS_temp_data[3] = {0,0,0};uint8_t data_len,i;FIFO_data_len = IIC_ReadByte(LIS3DH_FIFO_SRC);FIFO_data_len &= 0x1F;for(i=0;i<FIFO_data_len;i++){LIS3DH_ReadData(LIS_temp_data); //读取3个方向的数据}
}
数据会不断刷新,所以要定时读取,读取间隔可以通过ODR来控制调整,也可以利用watermark触发中断读取
如果要使用stm32的硬件IIC实现LIS3DH的各种功能配置,可以参考这篇:
https://blog.csdn.net/zhangfls/article/details/109078500
LIS3DH 三轴加速度传感器使用流程及示例相关推荐
- 三轴加速度传感器和六轴惯性传感器_美泰产品推介MSV3100A三轴加速度传感器
1 产品介绍 MSV3100A三轴加速度传感器 MSV3100A是一款三轴向模拟输出的MEMS加速度传感器.传感器由三个相互正交的微加速度计和信号变换电路组成.能够承受高达10,000g的冲击载荷和恒 ...
- 溢出检测单符号位法_设计经验:如何用三轴加速度传感器检测倾斜角?
本文介绍了三轴加速度传感器的特性,并通过一个典型的应用--检测倾斜角--对单轴.双轴和三轴加速度传感器进行了比较,并给出了选型建议. 在前两篇文章中,我们介绍了单/双轴加速度传感器在来检测倾斜角上的应 ...
- ADI Blackfin DSP处理器-BF533的开发详解59:DSP控制ADXL345三轴加速度传感器的应用2(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解60:DSP控制ADXL345三轴加速度传感器-电子水平仪(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解61:DSP控制ADXL345三轴加速度传感器-LCD(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- ADI Blackfin DSP处理器-BF533的开发详解62:DSP控制ADXL345三轴加速度传感器-贪食蛇游戏(含源码)
硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...
- 三轴加速度传感器bma150驱动解析
BMA150 博世 三轴加速度传感器 SPI(4线,3线),i2c,中断引脚 频响+/- 2g,4g,8g;带宽25~1500hz,中断触发内部加速度求值 低功耗,快速唤醒 包含数据寄存器,控制寄存器 ...
- android SENSOR_ACCELEROMETER 三轴加速度传感器
先看效果图: package org.ninetripods.mq.asdasdasdasdasdas; import android.content.Context; import android. ...
- ST公司 Lis2dh12 三轴加速度传感器,计算加速度值转成角度值
目录 概述 项目上使用了一款Lis2dh12三轴加速度传感器.开发前要准备的工作. 1.原理图: 1.1.创建lis2dh12.c文件 1.2.在此重点说明,如果想调传感器的中断灵敏度,注意:关注1. ...
最新文章
- 不要担心,我可以一个人走
- JAVA----------------------华为机试--------------------------删除字符串中出现次数最少的字符...
- 02.Python基础
- Python实现奖金计算两种方法的比较
- golang 获取本地ip
- 爱默生E系列服务器机柜托盘,艾默生通信电源PS48300-3B/1800 一体化室内机柜
- rcu宽限期_如何处理宽限期错误:静默失败不是一种选择
- c struct 对齐_C中的struct大小| 填充,结构对齐
- HTML5 学习笔记(三)——本地存储(LocalStorage、SessionStorage、Web SQL Database)
- 省选专练【POI2015】Podzial naszyjnika
- python commands_python之commands模块
- 存储过程清理N天前数据
- Windows7与Window2008 64位IIS7上面配置操作Excel
- 【weblogic部署应用】
- ImDisk 命令行用法
- 偶然接触oracle中的变量
- 信息学奥赛一本通(C++版)在线评测系统 1887:【15NOIP提高组】神奇的幻方
- python中的Numpy包
- Bootstrap网站模板
- python编写一个汽车类_Python 类:以汽车为例
热门文章
- AI 重聚知名已故歌手,发布四首原创歌曲
- 正则表达式在一个字符串上多次搜索、正则表达式匹配书名等
- addrule android用法,RelativeLayout.LayoutParams 使用addRule失效的问题解决办法
- 留人间多少爱,迎浮世千重变;和有情人,做快乐事, 别问是劫是缘
- 360校招——最后赢家(C++)
- spring boot图书管理系统 毕业设计-附源码160934
- Python课堂点名器,妈妈再也不会担心我被老师点名了
- Repeating Decimals UVA - 202
- 麻吉宝创世内测开启,阿里区块链邀请码AP751K
- zabbix3.0 之短信报警配置