合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程
Posted 合宙Luat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程相关的知识,希望对你有一定的参考价值。
LuaTask是合宙Luat开源架构的最新应用实现,用户基于此可便捷地进行二次开发,快速实现商业项目的应用落地,有效减少开发成本。
今天,我们将分享Luat社区针对一款应用极广泛的三轴加速度传感器——KXTJ3-1057,特别编写的LuaTask驱动手把手教程,方便用户触类旁通,根据实际情况和项目需求进行更改及调用。
感觉兴趣的朋友可通过文末“阅读原文”链接,下载PDF完整版。
1
KXTJ3-1057简介
三轴加速度传感器具有体积小和重量轻的特点,可以测量空间加速度,能够全面准确反映物体的运动性质,在汽车电子、航空航天、医学设备、机器人及消费产品创新应用等领域得到广泛的应用。
KXTJ3-1057原是Kionix出品的一款手机上非常常用的三轴加速度传感器(和KXTJ2-1009 pin to pin兼容,驱动也兼容),后被ROHM收购。
工作原理
KXTJ3-1057是三轴±2g、±4g、±8g或±16g微加工硅晶加速计。这些元件采用Kionix的专有等离子微加工工艺技术制造。
加速度使这些元件运动,进而产生电容器差是这些元件的加速度检测的基本原理,而且使用共模消除法减少由于工艺变化、温度和环境影响造成的误差。
利用玻璃浆料将另一片盖形晶圆与该器件粘结在一起,使这些元件实现晶圆级密封。独立的ASIC器件与感测元件封装在一起,用于进行信号调节和数字化通讯。
这种加速计采用2mm x 2mm x 0.9mm LGA塑料封装,由 1.71VDC至3.6VDC电源供电。稳压器用于在输入电源电压范围内保持内部工作电压恒定。这样就能在输入电压范围内保持稳定的工作特性,而且实现几乎检测不到的比率误差。
I2C数字协议用于与芯片进行通讯,以便对该部件进行配置并监视输出。
主要特性
体积小:
2mm x 2mm x 0.9mm LGA 封装;
低电流消耗:
待机状态0.9μA,低功耗状态10μA,高分辨率模式155μA;
电源电压范围宽:
1.71V~3.6V,且内置稳压器;
配置范围广:
±2g、±4g、±8g 或 ±16g;
I2C数字通讯接口,高达3.4 MHz;
高分辨率环形功能,阈值可配置,低至3.9mg;
用户可配置输出数据速率:
0.781Hz~1600Hz;
采用改进型设计,几乎消除了回流焊后偏移和灵敏度漂移;
高度可配置的中断控制功能;
符合RoHS/REACH规范。
2
编写KXTJ3-1057 for LuaTask 驱动
抽象驱动所用到的函数包含寄存器定义、读写寄存器函数、读中断状态函数、初始化函数、I2C通信自检函数等等。
上下滑动,查看完整内容
02 local KXTJ3_DCST_RESP = 0x0C -- KXTJ3 的数字通自检寄存器
03 -- 加速度输出寄存器
04 local KXTJ3_XOUT_L = 0x06
05 local KXTJ3_XOUT_H = 0x07
06 local KXTJ3_YOUT_L = 0x08
07 local KXTJ3_YOUT_H = 0x09
08 local KXTJ3_ZOUT_L = 0x0A
09 local KXTJ3_ZOUT_H = 0x0B
10 -- 中断寄存器
11 local KXTJ3_INT_SOURCE1 = 0x16 local
12 KXTJ3_INT_SOURCE2 = 0x17
13 local KXTJ3_STATUS_REG = 0x18
14 local KXTJ3_INT_REL = 0x1A
15 -- 控制寄存器
17 local KXTJ3_CTRL_REG2 = 0x1D
18 local KXTJ3_INT_CTRL_REG1 = 0x1E
19 local KXTJ3_INT_CTRL_REG2 = 0x1F
20 local KXTJ3_DATA_CTRL_REG = 0x21
21 local KXTJ3_WAKEUP_COUNTER = 0x29
22 local KXTJ3_WAKEUP_THRESHOLD_H = 0x6A
23 local KXTJ3_WAKEUP_THRESHOLD_L = 0x6B
KXTJ3-1057读写寄存器函数
LuaTask的I2C调用的是内部的硬件I2C,所以core给了几个API:
https://wiki.openluat.com/doc/luatApi4G/#i2c
KXTJ3-1057读写寄存器函数:
上下滑动,查看完整内容
01 -- 初始化并打开I2C操作
02 -- @param I2C 内部ID
03 -- @return number ,I2C的速率
04 local function i2c_open(id, speed)
05 if i2c.setup(id, speed or i2c.SLOW) ~= i2c.SLOW then
06 i2c.close(id)
07 return i2c.setup(id, speed or i2c.SLOW)
08 end
09 return i2c.SLOW
10 end
11
12 --- 读取寄存器值
13 -- @number id: I2C端口号
16 -- @return number: 寄存器当前值
17 function readRegister(id, addr, reg)
18 log.info("I2C OPEN Result:", i2c_open(id))
19 i2c.send(id, addr, reg)
20 local _, val = pack.unpack(i2c.recv(id, addr, 1), 'b')
21 i2c.close(id)
22 log.info("读取", string.format("寄存器:0x%02x 当前值:0x%02x", reg, val or 0))
23 return val;
24 end
25
26 --- 写寄存器方法
27 -- @number id: I2C端口号
30 -- @number ...: 要写入寄存器其他值
31 -- @return number: 寄存当前值
32 function writeReg(id, addr, reg, ...)
33 log.info("I2C OPEN Result:", i2c_open(id))
34 i2c.send(id, addr, {reg, ...})
35 local _, val = pack.unpack(i2c.recv(id, addr, 1), 'b')
36 log.info("重读", string.format("寄存器:0x%02x 当前值:0x%02x",reg, val or 0))
37 i2c.close(id)
38 return val
39 end
为了规避I2C异常,提高I2C抗干扰能力,建议I2C使用完后就立刻关闭。如上代码,每次读取寄存器1个字节。读写寄存器的函数可以根据实际情况,一次读取或写入两个字节,写寄存器函数每次写完后,会重读当前寄存器,方便调试。
I2C数字通信自检函数
参考KXTJ3-1057数据手册,可以找到寄存器“DCST_RESP” 专门用来做KXTJ3-1057数字通信验证。
如果接线正常,I2C工作正常, 那么读取该寄存器KXTJ3-1057会返回0x55,依据这个可以判断LuaTask的I2C和KXTJ3-1057的数字接线、数字通信是否正常;如果不返回0x55,要检查硬件和I2C端口号是否正确。
I2C数字通信自检函数:
上下滑动,查看完整内容
01 --- 数字通信自检验证
02 -- number id: I2C端口号
03 -- return number 正常返回0x55,其他值为异常
04 function dcst(id)
05 local val = readRegister(id, KXTJ3_ADDR, DCST_RESP)
06 log.info("KXTJ3C DCST Result:", string.format("0x%02x", val or 0))
07 return val;
08 end
读取和复位状态寄存器
当中断源寄存器1的DRDY和WUFS位被置位时,该寄存器Bit4置位,表示有位移或者加速度变化产生。当读取加速度数据或读取中断释放寄存器(INT_REL)时,Bit4复位。
读取和复位状态寄存器:
上下滑动,查看完整内容
01 --- 读中断状态
02 -- number id: I2C端口号
03 -- return number 返回状态寄存器当前值
04 function readStatus(id)
05 local val = readRegister(id, KXTJ3_ADDR, KXTJ3_STATUS_REG)
06 log.info("KXTJ3C read interrupt status:",
string.format("0x%02x", val or 0))
07 return val;
08 end
09
10 --- 清中断状态
11 -- number id: I2C端口号
12 -- return nil
13 function clearStatus(id)
14 readRegister(id, KXTJ3_ADDR, KXTJ3_INT_REL)
15 log.info("Clear Interrupt status register:", "OK")
16 end
读取中断源寄存器
实际上读取寄存器的操作可以直接用readRegister函数直接实现,这里演示的是二次封装方法,方便跨页面调用。
读取中断源寄存器:
上下滑动,查看完整内容
01 --- 读取中断源寄存器
02 -- number id: I2C端口号
03 -- @number src: 1 读中断源1寄存器, 2读中断源2寄存器
04 -- @return number: 返中断源寄存器的值
05 function readInterrupt(id, src)
06 local val = 0
07 if src == 2 then
08 val = readRegister(id, KXTJ3_ADDR, KXTJ3_INT_SOURCE2)
09 else
10 val = readRegister(id, KXTJ3_ADDR, KXTJ3_INT_SOURCE1)
11 end
12 log.info("readInterrupt register:", string.format("%02x",val or 0))
13 return val
14 end
KXTJ3-1057工作模式切换
KXTJ3-1057部分寄存器写入数据必须在准备模式才能写入,工作模式写入无效。配置CTRL_REG1寄存器Bit7的值可切换工作模式:
0 = stand-by mode
1 = operating mode
KXTJ3-1057工作模式切换:
上下滑动,查看完整内容
01 --- 配置 KXTJ3工作模式
02 -- number id: I2C端口号
03 -- @number mode: 0 准备模式, 1工作模式
04 -- @return number: 返中断源寄存器的值
05 function setMode(id, mode)
06 log.info("-------->I2C OPEN Result:", i2c_open(id))
07 i2c.send(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1)
08 local _, val = pack.unpack(i2c.recv(id, KXTJ3_ADDR, 1), 'b')
09 i2c.send(id, KXTJ3_ADDR, {KXTJ3_CTRL_REG1, mode == 0 and
10 bit.clear(val, 7) or bit.set(val, 7)})
val = readRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1)
11 i2c.close(id)
12 log.info("读取CTRL_REG1寄存器:", string.format("当前值:0x%02x",val or 0))
13 end
实际应用中,也可以在准备模式配置完寄存器后,配置CTRL_REG1的同时切换KXTJ3为工作模式。
读取三轴加速度数据
读取三轴加速度数据:
上下滑动,查看完整内容
01 --- 读取三轴输出值,注意结果是 Tri-axis 数字量
02 -- @param axis: 'x','y','z' 分别表示x,y,z轴
03 -- @number n: 分辨率,可选值8,12,14(CTRL_REG1配置)
04 -- @return number: Tri-axis Digital
05 function readAxis(id, axis, n)
06 local val, recv, reg = 0, {}, {}
07 if axis == 'x' then
08 reg[1] = KXTJ3_XOUT_L
09 reg[2] = KXTJ3_XOUT_H
10 elseif axis == 'y' then
11 reg[1] = KXTJ3_YOUT_L
12 reg[2] = KXTJ3_YOUT_H
13 elseif axis == 'z' then
14 reg[1] = KXTJ3_ZOUT_L
15 reg[2] = KXTJ3_ZOUT_H
16 else
17 return 0
18 end
19 recv[1] = readRegister(id, KXTJ3_ADDR, reg[1])
20 recv[2] = readRegister(id, KXTJ3_ADDR, reg[2])
21 val = recv[2] * 256 + recv[1]
22 if n == 8 then
23 return recv[2]
24 elseif n == 12 then
25 return (recv[2] > 0x7F) and bit.bor(bit.rshift(val, 4),
26 0xF000) or bit.band(bit.rshift(val, 4), 0x0FFF)
27 elseif n == 14 then
return (recv[2] > 0x7F) and bit.bor(bit.rshift(val, 4),
0xC000) or bit.band(bit.rshift(val, 4), 0x3FFF)
28 end
29 return 0;
30 end
这部分就是读取加速度三轴的高低位寄存器的值,根据CTRL_REG1寄存器配置的分辨率,然后换算成Tri-axis 数字量。
KXTJ3-1057三轴功能自检函数
KXTJ3-1057提供了一套功能自检逻辑,帮助用户判断三轴传感器是否正常工作。
当写入0xCA到SELF_TEST寄存器,内部测量自检方法被启用, 加速度的静电驱动会让X、Y、Z三轴产生偏移,对该寄存器写入0x00,则关闭自检并恢复正常工作。
KXTJ3-1057三轴功能自检函数:
上下滑动,查看完整内容
01 -- KXTJ3-1057 功能自检
02 -- number id: I2C端口号
03 -- @return nil
04 function selfTest(id)
05 setMode(id, 0)
06 writeRegister(id, KXTJ3_ADDR, KXTJ3_SELF_TEST, 0xCA)
07 setMode(id, 1)
08 log.info("on self test axis-x: ", readAxis(id, 'x', 8))
09 log.info("on self test axis-y: ", readAxis(id, 'y', 8))
10 log.info("on self test axis-z: ", readAxis(id, 'z', 8))
11 setMode(id, 0)
12 writeRegister(id, KXTJ3_ADDR, KXTJ3_SELF_TEST, 0x00)
13 setMode(id, 1)
14 log.info("out self test axis-x: ", readAxis(id, 'x', 8))
15 log.info("out self test axis-y: ", readAxis(id, 'y', 8))
16 log.info("out self test axis-z: ", readAxis(id, 'z', 8))
17 end
KXTJ3-1057初始化示例
下面介绍KXTJ3-1057初始化的例子, 读者可根据自己的实际情况和项目需求进行更改,其中一些直接用writeRegister写寄存器的方法, 大家可以自己动手封装成方法,方便在其他页面调用。
KXTJ3-1057初始化示例:
上下滑动,查看完整内容
01 --- 初始化配置
02 -- number id: I2C端口号
03 -- @return nil
04 function init(id)
05 -- 进入配置模式
06 setMode(id, 0)
07 -- 复位控制寄存器2
08 writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG2, 0x86)
09 -- 配置控制寄存器2 为50HZ
10 writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG2, 0x06)
11 -- 配置唤醒延时和唤阈值
12 writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_COUNTER, 50)
13 writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_THRESHOLD_H,
(1500 - (1500 % 256)) / 256)
14 writeRegister(id, KXTJ3_ADDR, KXTJ3_WAKEUP_THRESHOLD_L, 1500
% 256)
15 writeRegister(id, KXTJ3_ADDR, KXTJ3_DATA_CTRL_REG, 0x02)
16 -- 配置控制寄存器1 配置唤中断,(B0010 0010)
17 writeRegister(id, KXTJ3_ADDR, KXTJ3_CTRL_REG1, 0x82)
18 -- 清中断
19 clearStatus(id)
20 log.info("KXTJ3C init done: ", "ok!")
21 end
扫码获取完整版文档及源码
本文将持续在Luat社区更新
http://doc.openluat.com/article/2120/0
- 欢迎加入Luat 社区 -
社区账户与ERP系统通用
Lua教程 | 模块资料 | 问答系统 | 工具下载 | 经验分享
方式一:留言互动
方式二:好友助力
合宙商城五折券使用说明:
合宙Luat (Cat.1模块) 1群:1092305811
合宙Luat (Cat.1模块) 2群:8771645550
每个建议都值得关注
每个技能都值得分享
更多精彩等你来参与
千人级专业人士技术交流群,
模组开发、行业应用、知识分享包罗万象,
谈笑间轻松获取最前沿最实用的物联网资讯!
- 合宙Cat.1生态应用案例 -
以上是关于合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程的主要内容,如果未能解决你的问题,请参考以下文章
合宙Luat | 看《射雕英雄传》,聊聊LuaTask延时那些事
合宙Luat | VSCode全新LuatIDE插件版本发布,行业高效开发再添利器