小七

小七

1个粉丝

10

问答

0

专栏

0

资料

小七  发布于  2024-08-10 11:12:27
采纳率 0%
10个问答
345

QMI8610校准

请问有使用过这个QMI8610的陀螺仪模块的吗,该模块主要是通过获取的加速度和角速度计算欧拉角的功能。现在已经计算出角度,但是角度值不准,需要校准内容。官方数据手册中,说的是向偏移寄存器中写入数据,然后进行校准,但是没有具体些要写入什么,只是详细描述了格式,我使用获取到的加速度内容进行转换,变为米每二次方秒的格式,看着范围和内容都挺符合偏移寄存器的内容的,但是填入后的偏差值更大了,暂时不知道是因为什么,有使用过QMI8610这个型号的大佬吗,这个具体的校准步骤是怎么做的啊?

我来回答
回答1个
时间排序
认可量排序

小七

1个粉丝

10

问答

0

专栏

0

资料

小七 2024-08-10 11:17:17
认可0

这个图是数据手册中,对偏移寄存器的格式的介绍,有具体的写入的要求,但是没有说要写入什么数据,我猜测是写入转为加速度单位后的数值。下面是转换的代码。`void convertToRegister(double num, unsigned char registerA, unsigned char registerB) {
// 将小数部分和整数部分分离
double intPart, fracPart;
fracPart = modf(num, &intPart); // modf 函数将 num 分为小数部分 fracPart 和整数部分 intPart
int sign = (num >= 0)? 0 : 1; // 根据 num 的正负确定符号位,正数为 0,负数为 1

int intValue = (int)intPart;  // 将整数部分转换为整数类型
int fracValue = 0;  // 用于存储小数部分转换后的二进制值

// 转换小数部分为二进制
int i = 0;
while (fracPart!= 0 && i < 8) {  // 循环直到小数部分为 0 或达到 8 位
    fracPart *= 2;  // 小数部分乘以 2
    if (fracPart >= 1) {  // 如果乘以 2 后大于等于 1
        fracValue |= (1 << i);  // 将对应位设为 1
        fracPart -= 1;  // 减去 1
    }
    i++;  // 位索引增加
}

// 处理整数部分为补码形式
if (sign == 1) {  // 如果是负数
    intValue = ~intValue + 1;  // 求补码
}

// 处理寄存器 B
*registerB = (sign << 7) | ((intValue & 0x07) << 3) | ((fracValue & 0x07) >> 5);  // 将符号位、整数部分和小数部分的高 3 位组合存入 registerB

// 处理寄存器 A
*registerA和registerB = (fracValue & 0x1F) << 3;  // 将小数部分的低 5 位左移 3 位存入 registerA

}`

这些内容是对加速度值进行处理,将处理后的值,填入registerA和registerB,然后通过函数传到驱动中,然后填入偏转寄存器使其生效。但是处理后的结果依旧很差,甚至精度更差了,希望有使用过这个模块的大佬,能说一下这个怎么校准的,谢谢。

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区