合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

Posted 合宙Luat

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程相关的知识,希望对你有一定的参考价值。

DOC.OPENLUAT.COM

合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

LuaTask是合宙Luat开源架构的最新应用实现,用户基于此可便捷地进行二次开发,快速实现商业项目的应用落地,有效减少开发成本。

今天,我们将分享Luat社区针对一款应用极广泛的三轴加速度传感器——KXTJ3-1057,特别编写的LuaTask驱动手把手教程,方便用户触类旁通,根据实际情况和项目需求进行更改及调用。

感觉兴趣的朋友可通过文末“阅读原文”链接,下载PDF完整版。






1


KXTJ3-1057简介





三轴加速度传感器具有体积小和重量轻的特点,可以测量空间加速度,能够全面准确反映物体的运动性质,在汽车电子、航空航天、医学设备、机器人及消费产品创新应用等领域得到广泛的应用。


合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程


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 | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

扫码获取完整版文档及源码

本文将持续在Luat社区更新


合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

http://doc.openluat.com/article/2120/0


- 欢迎加入Luat 社区 -

社区账户与ERP系统通用

Lua教程 | 模块资料 | 问答系统 | 工具下载 | 经验分享



合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程
快来领取专属福利~


合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

方式一:留言互动


方式二:好友助力


合宙商城五折券使用说明:





合宙Luat (Cat.1模块) 1群:1092305811

合宙Luat (Cat.1模块) 2群:8771645550


每个建议都值得关注

每个技能都值得分享


更多精彩等你来参与

合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程


千人级专业人士技术交流群,

模组开发、行业应用、知识分享包罗万象,

谈笑间轻松获取最前沿最实用的物联网资讯!





合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

- 合宙Cat.1生态应用案例 -




合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程


合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程

合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程




以上是关于合宙Luat | 三轴加速度传感器——稀饭放姜LuaTask驱动手把手教程的主要内容,如果未能解决你的问题,请参考以下文章

合宙Luat | 看《射雕英雄传》,聊聊LuaTask延时那些事

合宙Luat | VSCode全新LuatIDE插件版本发布,行业高效开发再添利器

合宙Luat 2G/4G系列模块Lua版本串口功能汇总

关于安卓手机三轴加速度传感器的一些问题。

请问三轴加速度传感器加三轴陀螺仪怎样测动态姿态,能不能说详细点,谢谢!

MMS-A01型三轴有线加速度传感器