LIS3DH运动检测调试过程

前言

本文记录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;
在这里插入图片描述

二、 官方器件初始化

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_REG10x200x3f
CTRL_REG20x210x09
CTRL_REG30x220x40
CTRL_REG40x230x00
CTRL_REG50x240x00
CTRL_REG60x250x02
INT1_CFG0x300x2a
INT1_THS0x320x10
INT1_DURATION0x330x80

四、寄存器设置说明

1. CTRL_REG1:寄存器20h

  1. 寄存器设置:0x3f
    寄存器20h
  2. ODR[3:0] = 0b0011;
    ODR[3:0]
  3. LPen:低功耗模式;
  4. Zen:Z轴使能;
  5. Yen:Y轴使能;
  6. Xen:X轴使能;
    在这里插入图片描述

2. CTRL_REG2:寄存器21h

  1. 寄存器设置:0x09
    寄存器21h
    设置说明
    HPM
  2. 数据经过滤波器送给输出寄存器;
  3. 使能中断1高通滤波器;

3. CTRL_REG3:寄存器22h

  1. 寄存器设置:0x40
    在这里插入图片描述
  2. 使能中断INT1

4. CTRL_REG4:寄存器23h

5. CTRL_REG5:寄存器24h

在这里插入图片描述

6. CTRL_REG6:寄存器25h

  1. 寄存器设置:0x02
    在这里插入图片描述
  2. INT1 和 INT2低电平有效;

7. INT1_CFG:寄存器30h

  1. 寄存器设置:0x1a
    在这里插入图片描述
  2. 使能Z轴高中断触发条件
  3. 使能Y轴高中断出发条件
  4. 使能X轴高中断出发条件

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

  1. 寄存器设置:0x10
    在这里插入图片描述
  2. 中断INT1:加速度阈值

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

  1. 寄存器设置:0x08
    在这里插入图片描述
  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]);
		
	}

串口打印
在这里插入图片描述

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

在这里插入图片描述

七、硬件测试

  • 用示波器测量INT1管脚:晃动传感器,示波器会显示低电平脉冲;
  • 3.3V供电实测电流(低功耗模式)及官方参考功耗;
数据速率1Hz10Hz25Hz50Hz100Hz200Hz
实测电流5.5uA6.2uA7.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
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 15
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值