文章目录
- 前言
- 一、调通IIC
- 二、 官方器件初始化
-
- 1. 惯性唤醒(绕过高通滤波器)
- 2. 自由落体检测
- 三、最终初始化值
- 四、寄存器设置说明
-
- 1. CTRL_REG1:寄存器20h
- 2. CTRL_REG2:寄存器21h
- 3. CTRL_REG3:寄存器22h
- 4. CTRL_REG4:寄存器23h
- 5. CTRL_REG5:寄存器24h
- 6. CTRL_REG6:寄存器25h
- 7. INT1_CFG:寄存器30h
- 8. INT1_THS:寄存器32h(阈值)
- 9. INT1_DURATION:寄存器33h(阈值)
- 五、读取寄存器
- 六、初始化写寄存器读出结果
- 七、硬件测试
前言
- 期初IIC读取寄存器为FF,原因为IIC驱动问题和从机地址有误;
- 寄存器初始化值为实测验证值;
- INT1正常输出中断信号;
- 测试低功耗模式下工作电流;
参考文档
LIS3DH datasheet
AN3308应用笔记
一、调通IIC
- 读取who am I 寄存器,结果是0x33说明IIC接口正常;
- 注意SDO接地,从机地址为0x30,读寄存器地址+1为0x31;
- SDO接高电平,从机地址为0x32,读寄存器地址+1为0x33;
二、 官方器件初始化
1. 惯性唤醒(绕过高通滤波器)
- 将A7h写入CTRL_REG1 //启动传感器并使用X、Y、和Z ODR = 100Hz
- 将00h写入CTRL_REG2 //高通滤波器已禁用
- 将40h写入CTRL_REG3 //中断被驱动到INT1焊盘
- 将00h写入CTRL_REG4 //FS = 2g
- 将08h写入CTRL_REG5 //中断已锁存
- 将10h写入INT1_THS //阈值 = 250mg
- 将00h写入INT1_DURATION //持续时间 = 0
- 将0Ah写入INT1_CFG //使能XH和YH中断生成
- 轮询INT1焊盘;如果INT = 0,则转至8
- 读INT1_SRC //返回触发中断事件
- (发生了唤醒事件;在此插入用户代码) //事件处理
- 转至8
- 对应初始化代码:
LIS3DH_Write(CTRL_REG1, 0xA7); //数据速率设置LIS3DH_Write(CTRL_REG2, 0x00);LIS3DH_Write(CTRL_REG3, 0x40);LIS3DH_Write(CTRL_REG4, 0x00);LIS3DH_Write(CTRL_REG5, 0x08);LIS3DH_Write(INT1_THS, 0x10); //中断阈值LIS3DH_Write(INT1_DURATION, 0x00); //设置最小持续中断时间,ODR;LIS3DH_Write(INT1_CFG, 0x0A);
- 按照官方配置无法产生中断,问题在CTRL_REG5 中断锁存;
- 将CTRL_REG5寄存器写00,中断能够正常产生;
//LIS3DH_Write(CTRL_REG5, 0x08);LIS3DH_Write(CTRL_REG5, 0x00);
2. 自由落体检测
利用INT1_CTRL寄存器特定配置识别器件,是否沿有轴测量的加速度变为零;
- 将A7h写入CTRL_REG1 //启动传感器并使用X、Y、和Z ODR = 100Hz
- 将00h写入CTRL_REG2 //高通滤波器已禁用
- 将40h写入CTRL_REG3 //中断被驱动到INT1焊盘
- 将00h写入CTRL_REG4 //FS = 2g
- 将08h写入CTRL_REG5 //中断已锁存
- 将16h写入INT1_THS //将自由落体阈值设置 = 350mg
- 将03h写入INT1_DURATION //设置最短事件持续时间
- 将95h写入INT1_CFG //配置自由落体识别
- 轮询INT1焊盘;如果INT = 0,则转至10
- (发生了自由落体事件;在此插入代码) //事件处理
- 读取INT1_SRC寄存器 //清除中断请求
- 转至9
- 对应初始化代码:
LIS3DH_Write(CTRL_REG1, 0xA7); //数据速率设置LIS3DH_Write(CTRL_REG2, 0x00);LIS3DH_Write(CTRL_REG3, 0x40);LIS3DH_Write(CTRL_REG4, 0x00);LIS3DH_Write(CTRL_REG5, 0x08);LIS3DH_Write(INT1_THS, 0x16); //中断阈值LIS3DH_Write(INT1_DURATION, 0x03); //设置最小持续中断时间,ODR;LIS3DH_Write(INT1_CFG, 0x95);
- 同样将CTRL_REG5寄存器写00,中断能够正常产生;
//LIS3DH_Write(CTRL_REG5, 0x08);LIS3DH_Write(CTRL_REG5, 0x00);
三、最终初始化值
通过IIC驱动LIS3DH
LIS3DH_Write(0x20, 0x3f); //CTRL_REG1
LIS3DH_Write(0x21, 0x09); //CTRL_REG2
LIS3DH_Write(0x22, 0x40); //CTRL_REG3
LIS3DH_Write(0x23, 0x00); //CTRL_REG4
LIS3DH_Write(0x24, 0x00); //CTRL_REG5
LIS3DH_Write(0x32, 0x10); //INT1_THS
LIS3DH_Write(0x33, 0x80); //INT1_DURATION
LIS3DH_Write(0x30, 0x2A); //INT1_CFG
LIS3DH_Write(0x25, 0x02); //CTRL_REG6
初始化寄存器表
寄存器 | 地址 | 值 |
---|---|---|
CTRL_REG1 | 0x20 | 0x3f |
CTRL_REG2 | 0x21 | 0x09 |
CTRL_REG3 | 0x22 | 0x40 |
CTRL_REG4 | 0x23 | 0x00 |
CTRL_REG5 | 0x24 | 0x00 |
CTRL_REG6 | 0x25 | 0x02 |
INT1_CFG | 0x30 | 0x2a |
INT1_THS | 0x32 | 0x10 |
INT1_DURATION | 0x33 | 0x80 |
四、寄存器设置说明
1. CTRL_REG1:寄存器20h
2. CTRL_REG2:寄存器21h
3. CTRL_REG3:寄存器22h
4. CTRL_REG4:寄存器23h
5. CTRL_REG5:寄存器24h
6. CTRL_REG6:寄存器25h
7. INT1_CFG:寄存器30h
8. INT1_THS:寄存器32h(阈值)
9. INT1_DURATION:寄存器33h(阈值)
五、读取寄存器
printf("LIS3DH testing\r\n"); ucRegValue[0] = LIS3DH_Read(WHO_AM_I);ucRegValue[1] = LIS3DH_Read(CTRL_REG1);ucRegValue[2] = LIS3DH_Read(CTRL_REG2);ucRegValue[3] = LIS3DH_Read(CTRL_REG3);ucRegValue[4] = LIS3DH_Read(CTRL_REG4);ucRegValue[5] = LIS3DH_Read(CTRL_REG5);ucRegValue[6] = LIS3DH_Read(CTRL_REG6); ucRegValue[7] = LIS3DH_Read(INT1_CFG);ucRegValue[8] = LIS3DH_Read(INT1_THS);ucRegValue[9] = LIS3DH_Read(INT1_DURATION);while(1){delay_ms(1000);printf("LIS3DH who am I: %2x\r\n",ucRegValue[0]);printf("CTRL_REG1: %2x\r\n",ucRegValue[1]);printf("CTRL_REG2: %2x\r\n",ucRegValue[2]);printf("CTRL_REG3: %2x\r\n",ucRegValue[3]);printf("CTRL_REG4: %2x\r\n",ucRegValue[4]);printf("CTRL_REG5: %2x\r\n",ucRegValue[5]);printf("CTRL_REG6: %2x\r\n",ucRegValue[6]);printf("INT1_CFG: %2x\r\n",ucRegValue[7]);printf("INT1_THS: %2x\r\n",ucRegValue[8]);printf("INT1_DURATION: %2x\r\n",ucRegValue[9]);}
六、初始化写寄存器读出结果
七、硬件测试
- 用示波器测量INT1管脚:晃动传感器,示波器会显示低电平脉冲;
- 3.3V供电实测电流(低功耗模式)及官方参考功耗;
数据速率 | 1Hz | 10Hz | 25Hz | 50Hz | 100Hz | 200Hz |
---|---|---|---|---|---|---|
实测电流 | 5.5uA | 6.2uA | 7.5uA |
- 触发中断灵敏度
由寄存器33h和寄存器32h决定;
LIS3DH_Write(0x20, 0x2f);
LIS3DH_Write(0x21, 0x09);
LIS3DH_Write(0x22, 0x40);
LIS3DH_Write(0x23, 0x00);
LIS3DH_Write(0x24, 0x00);
LIS3DH_Write(0x32, 0x41);
LIS3DH_Write(0x33, 0x82);
LIS3DH_Write(0x30, 0x2A);
LIS3DH_Write(0x25, 0x02);
What you leave behind is not what is engraved in stone monuments, but what is woven into the lives of others.
作者:行走的X君
来源:CSDN
原文:https://blog.csdn.net/zhouxiangjun11211/article/details/106769258
版权声明:本文为博主原创文章,转载请附上博文链接!