愿偿✘年少泪♬ 2024-12-31 15:35 采纳率: 50%
浏览 21
已结题

MT6701代码计算值出错

请问各位,如下代码a值输出一直为零,没有计算结果是什么原因啊?下面为源代码片段,是Arduino读取I2C输出的14位数据,通过计算得出角度值


 b = (i << 6) | n; //输出14位二进制数据,将寄存器地址0x03读取到的八位数据左移6位,与0x04寄存器读取到的6位数据相与。
  int y = b;
  int a = (y/16384)*360;

Serial.println(a);
Serial.println(b);

b的值输出正常,但是a输出一直为零

  • 写回答

1条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2024-12-31 15:41
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    根据你提供的代码片段,问题出在计算角度值 `a` 的公式上。具体来说,由于整数除法的特性,在进行 `y/16384` 时,如果 `y` 小于 16384,则结果会是 0(因为任何小于 16384 的正整数除以 16384 都会得到 0)。然后乘以 360 仍然为 0。这解释了为什么 `a` 的输出一直为零。

    解决方案

    要解决这个问题,你可以使用浮点数来进行除法运算,这样即使 y 小于 16384,也可以得到一个非零的小数值。之后再将结果转换为整数或保留小数位数。

    修改后的代码

    #include <Wire.h>
    
    void setup() {
      Serial.begin(9600);
      Wire.begin();
    }
    
    void loop() {
      int i, n;
      // 假设这里已经通过I2C读取到了i和n的值
      // 例如: Wire.requestFrom(0x53, 2); // 从I2C地址0x53读取2个字节
      // if (Wire.available()) { i = Wire.read(); n = Wire.read(); }
    
      int16_t b = (i << 6) | (n & 0x3F); // 输出14位二进制数据
      int y = b;
    
      // 使用浮点数进行除法运算
      float a = (float)y / 16384.0 * 360.0;
    
      Serial.print("b: ");
      Serial.println(b);
      Serial.print("a: ");
      Serial.println(a);
    
      delay(1000); // 每秒更新一次
    }
    

    代码说明

    1. 类型声明:将 b 声明为 int16_t,确保它可以存储14位的数据。
    2. 浮点数运算:将 y 转换为 float 类型进行除法运算,确保可以得到小数值。
    3. 输出:分别输出 ba 的值,以便观察结果。

    示例

    假设 in 的值分别为 0x120x34: - i 的值为 18(0x12) - n 的值为 52(0x34)

    计算过程如下: - b = (18 << 6) | (52 & 0x3F) = 1152 | 52 = 1204 - y = 1204 - a = (float)1204 / 16384.0 * 360.0 ≈ 26.25

    最终输出:

    b: 1204
    a: 26.25
    

    这样就可以正确计算并输出角度值 a 了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月8日
  • 已采纳回答 12月31日
  • 创建了问题 12月31日