文章目录

  • 前言
  • 一、调通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(阈值)
  • 五、读取寄存器
  • 六、初始化写寄存器读出结果
  • 七、硬件测试

前言

本文记录LIS3DH wakeup模式输出中断调试过程

  1. 期初IIC读取寄存器为FF,原因为IIC驱动问题和从机地址有误;
  2. 寄存器初始化值为实测验证值;
  3. INT1正常输出中断信号;
  4. 测试低功耗模式下工作电流;

参考文档
LIS3DH datasheet
AN3308应用笔记

一、调通IIC

  • 读取who am I 寄存器,结果是0x33说明IIC接口正常;
  • 注意SDO接地,从机地址为0x30,读寄存器地址+1为0x31;
  • SDO接高电平,从机地址为0x32,读寄存器地址+1为0x33;

地址错了就会读到FF;
LIS3DH运动检测调试过程-编程知识网

二、 官方器件初始化

1. 惯性唤醒(绕过高通滤波器)

  1. 将A7h写入CTRL_REG1 //启动传感器并使用X、Y、和Z ODR = 100Hz
  2. 将00h写入CTRL_REG2 //高通滤波器已禁用
  3. 将40h写入CTRL_REG3 //中断被驱动到INT1焊盘
  4. 将00h写入CTRL_REG4 //FS = 2g
  5. 将08h写入CTRL_REG5 //中断已锁存
  6. 将10h写入INT1_THS //阈值 = 250mg
  7. 将00h写入INT1_DURATION //持续时间 = 0
  8. 将0Ah写入INT1_CFG //使能XH和YH中断生成
  9. 轮询INT1焊盘;如果INT = 0,则转至8
  10. 读INT1_SRC //返回触发中断事件
  11. (发生了唤醒事件;在此插入用户代码) //事件处理
  12. 转至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寄存器特定配置识别器件,是否沿有轴测量的加速度变为零;

  1. 将A7h写入CTRL_REG1 //启动传感器并使用X、Y、和Z ODR = 100Hz
  2. 将00h写入CTRL_REG2 //高通滤波器已禁用
  3. 将40h写入CTRL_REG3 //中断被驱动到INT1焊盘
  4. 将00h写入CTRL_REG4 //FS = 2g
  5. 将08h写入CTRL_REG5 //中断已锁存
  6. 将16h写入INT1_THS //将自由落体阈值设置 = 350mg
  7. 将03h写入INT1_DURATION //设置最短事件持续时间
  8. 将95h写入INT1_CFG //配置自由落体识别
  9. 轮询INT1焊盘;如果INT = 0,则转至10
  10. (发生了自由落体事件;在此插入代码) //事件处理
  11. 读取INT1_SRC寄存器 //清除中断请求
  12. 转至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

  1. 寄存器设置:0x3f
    LIS3DH运动检测调试过程-编程知识网
  2. ODR[3:0] = 0b0011;
    LIS3DH运动检测调试过程-编程知识网
  3. LPen:低功耗模式;
  4. Zen:Z轴使能;
  5. Yen:Y轴使能;
  6. Xen:X轴使能;
    LIS3DH运动检测调试过程-编程知识网

2. CTRL_REG2:寄存器21h

  1. 寄存器设置:0x09
    LIS3DH运动检测调试过程-编程知识网
    LIS3DH运动检测调试过程-编程知识网
    LIS3DH运动检测调试过程-编程知识网
  2. 数据经过滤波器送给输出寄存器;
  3. 使能中断1高通滤波器;

3. CTRL_REG3:寄存器22h

  1. 寄存器设置:0x40
    LIS3DH运动检测调试过程-编程知识网
  2. 使能中断INT1

4. CTRL_REG4:寄存器23h

LIS3DH运动检测调试过程-编程知识网

5. CTRL_REG5:寄存器24h

LIS3DH运动检测调试过程-编程知识网

6. CTRL_REG6:寄存器25h

  1. 寄存器设置:0x02
    LIS3DH运动检测调试过程-编程知识网
  2. INT1 和 INT2低电平有效;

7. INT1_CFG:寄存器30h

  1. 寄存器设置:0x1a
    LIS3DH运动检测调试过程-编程知识网
  2. 使能Z轴高中断触发条件
  3. 使能Y轴高中断出发条件
  4. 使能X轴高中断出发条件

8. INT1_THS:寄存器32h(阈值)

  1. 寄存器设置:0x10
    LIS3DH运动检测调试过程-编程知识网
  2. 中断INT1:加速度阈值

9. INT1_DURATION:寄存器33h(阈值)

  1. 寄存器设置:0x08
    LIS3DH运动检测调试过程-编程知识网
  2. 中断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]);}

串口打印
LIS3DH运动检测调试过程-编程知识网

六、初始化写寄存器读出结果

LIS3DH运动检测调试过程-编程知识网

七、硬件测试

  • 用示波器测量INT1管脚:晃动传感器,示波器会显示低电平脉冲;
  • 3.3V供电实测电流(低功耗模式)及官方参考功耗;
数据速率 1Hz 10Hz 25Hz 50Hz 100Hz 200Hz
实测电流 5.5uA 6.2uA 7.5uA

LIS3DH运动检测调试过程-编程知识网

  • 触发中断灵敏度
    由寄存器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
版权声明:本文为博主原创文章,转载请附上博文链接!