文章目录
前言
本文记录LIS3DH wakeup模式输出中断调试过程:
- 期初IIC读取寄存器为FF,原因为IIC驱动问题和从机地址有误;
- 寄存器初始化值为实测验证值;
- INT1正常输出中断信号;
- 测试低功耗模式下工作电流;
参考文档
LIS3DH datasheet
AN3308应用笔记
一、调通IIC
- 读取who am I 寄存器,结果是0x33说明IIC接口正常;
- 注意SDO接地,从机地址为0x30,读寄存器地址+1为0x31;
- SDO接高电平,从机地址为0x32,读寄存器地址+1为0x33;
地址错了就会读到FF;
二、 官方器件初始化
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
- 寄存器设置:0x3f
- ODR[3:0] = 0b0011;
- LPen:低功耗模式;
- Zen:Z轴使能;
- Yen:Y轴使能;
- Xen:X轴使能;
2. CTRL_REG2:寄存器21h
- 寄存器设置:0x09
- 数据经过滤波器送给输出寄存器;
- 使能中断1高通滤波器;
3. CTRL_REG3:寄存器22h
- 寄存器设置:0x40
- 使能中断INT1
4. CTRL_REG4:寄存器23h
5. CTRL_REG5:寄存器24h
6. CTRL_REG6:寄存器25h
- 寄存器设置:0x02
- INT1 和 INT2低电平有效;
7. INT1_CFG:寄存器30h
- 寄存器设置:0x1a
- 使能Z轴高中断触发条件
- 使能Y轴高中断出发条件
- 使能X轴高中断出发条件
8. INT1_THS:寄存器32h(阈值)
- 寄存器设置:0x10
- 中断INT1:加速度阈值
9. INT1_DURATION:寄存器33h(阈值)
- 寄存器设置:0x08
- 中断INT1
五、读取寄存器
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
版权声明:本文为博主原创文章,转载请附上博文链接!