Просмотр исходного кода

refactor(gsensor): 优化DA221传感器数据读取逻辑

重构XYZ轴数据读取方式,改为连续读取6字节数据后统一解析
添加寄存器地址注释,优化12位有符号数据处理逻辑
马梦阳 8 месяцев назад
Родитель
Сommit
e03981c31c
1 измененных файлов с 29 добавлено и 25 удалено
  1. 29 25
      module/Air8000/demo/gsensor/da221.lua

+ 29 - 25
module/Air8000/demo/gsensor/da221.lua

@@ -20,14 +20,14 @@ local odr_addr = {0x10, 0x08}           -- 设置采样率 100Hz
 local mode_addr = {0x11, 0x00}          -- 设置正常模式
 local int_latch_addr = {0x21, 0x02}     -- 设置中断锁存
 
-local x_lsb_reg = 0x02
-local x_mab_reg = 0x03
-local y_lsb_reg = 0x04
-local y_mab_reg = 0x05
-local z_lsb_reg = 0x06
-local z_mab_reg = 0x07
-
-local active_state = 0x0b
+local x_lsb_reg = 0x02 -- X轴LSB寄存器地址
+local x_msb_reg = 0x03 -- X轴MSB寄存器地址
+local y_lsb_reg = 0x04 -- Y轴LSB寄存器地址
+local y_msb_reg = 0x05 -- Y轴MSB寄存器地址
+local z_lsb_reg = 0x06 -- Z轴LSB寄存器地址
+local z_msb_reg = 0x07 -- Z轴MSB寄存器地址
+
+local active_state = 0x0b -- 激活状态寄存器地址
 local active_state_data
 
 
@@ -38,29 +38,33 @@ local function logF(...)
 end
 
 local function read_xyz()
+    -- 从X轴LSB寄存器(0x02)开始连续读取6字节数据(X/Y/Z各2字节)
     i2c.send(i2cId, da221Addr, x_lsb_reg, 1)
-    local recv_x_lsb = i2c.recv(i2cId, da221Addr, 1)
-    i2c.send(i2cId, da221Addr, x_mab_reg, 1)
-    local recv_x_mab = i2c.recv(i2cId, da221Addr, 1)
-    local x_data = (string.byte(recv_x_mab) << 8) | string.byte(recv_x_lsb)
-
-    i2c.send(i2cId, da221Addr, y_lsb_reg, 1)
-    local recv_y_lsb = i2c.recv(i2cId, da221Addr, 1)
-    i2c.send(i2cId, da221Addr, y_mab_reg, 1)
-    local recv_y_mab = i2c.recv(i2cId, da221Addr, 1)
-    local y_data = (string.byte(recv_y_mab) << 8) | string.byte(recv_y_lsb)
-
-    i2c.send(i2cId, da221Addr, z_lsb_reg, 1)
-    local recv_z_lsb = i2c.recv(i2cId, da221Addr, 1)
-    i2c.send(i2cId, da221Addr, z_mab_reg, 1)
-    local recv_z_mab = i2c.recv(i2cId, da221Addr, 1)
-    local z_data = (string.byte(recv_z_mab) << 8) | string.byte(recv_z_lsb)
+    local recv_data = i2c.recv(i2cId, da221Addr, 6)
 
+    -- LSB数据格式为: D[3] D[2] D[1] D[0] unused unused unused unused
+    -- MSB数据格式为: D[11] D[10] D[9] D[8] D[7] D[6] D[5] D[4]
+    -- 数据位为12位,需要将MSB数据左移4位,LSB数据右移4位,最后进行或运算
+    -- 解析X轴数据 (LSB在前,MSB在后)
+    local x_data = (string.byte(recv_data, 2) << 4) | (string.byte(recv_data, 1) >> 4)
+
+    -- 解析Y轴数据 (LSB在前,MSB在后)
+    local y_data = (string.byte(recv_data, 4) << 4) | (string.byte(recv_data, 3) >> 4)
+
+    -- 解析Z轴数据 (LSB在前,MSB在后)
+    local z_data = (string.byte(recv_data, 6) << 4) | (string.byte(recv_data, 5) >> 4)
+
+    -- 转换为12位有符号整数
+    if x_data > 2047 then x_data = x_data - 4096 end
+    if y_data > 2047 then y_data = y_data - 4096 end
+    if z_data > 2047 then z_data = z_data - 4096 end
+
+    -- 转换为加速度值(单位:g)
     local x_accel = x_data / 1024
     local y_accel = y_data / 1024
     local z_accel = z_data / 1024
 
-
+    -- 输出加速度值(单位:g)
     return x_accel, y_accel, z_accel
 end