柠檬酸唉 2023-04-12 18:57 采纳率: 66.7%
浏览 22
已结题

STM32通过i2c读取mpu6050过程中程序运行异常


int main(void)
{
    OLED_Init();//OLED初始化
    MPU6050_Init();              //MPU6050初始化
    Timer4_Init();
    while(1)
    {
    OLED_ShowSignedNum(1,1,Angle_X_Final,5);
    OLED_ShowSignedNum(1,8,Angle_Y_Final,5);

    OLED_ShowSignedNum(2,1,aacx,5);
    OLED_ShowSignedNum(3,1,aacy,5);
    OLED_ShowSignedNum(4,1,aacz,5);
        
    OLED_ShowSignedNum(2,8,gyrox,5);
    OLED_ShowSignedNum(3,8,gyroy,5);
    OLED_ShowSignedNum(4,8,gyroz,5);
    }
}

img

定时器每0.02秒进行一次卡尔曼运算,卡尔曼函数中调用了i2c读取mpu6050的函数,将返回值交由卡尔曼运算,主函数循环中是i2c通信的OLED,当使用有符号显示函数是一切正常,有符号显示函数如下

void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{
    uint8_t i;
    uint32_t Number1;
    if (Number >= 0)
    {
        OLED_ShowChar(Line, Column, '+');
        Number1 = Number;
    }
    else
    {
        OLED_ShowChar(Line, Column, '-');
        Number1 = -Number;
    }
    for (i = 0; i < Length; i++)                            
    {
        OLED_ShowChar(Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
    }
}

但是数据是含小数的,于是我写的了个小数显示的函数


void OLED_ShowDecimelNum(uint8_t Line, uint8_t Column, float Number, uint8_t Length, uint8_t DecLength)
{
    uint8_t i;
    float Number1;
    uint32_t Number_Temp = 0,DecNumber_Temp = 0;
    if (Number >= 0)
    {
        OLED_ShowChar(Line, Column, '+');
        Number1 = Number;
    }
    else
    {
        OLED_ShowChar(Line, Column, '-');
        Number1 = -Number;
    }
    //整数部分
    Number_Temp = (uint32_t)Number1;
    for (i = 0; i < Length; i++)                            
    {
        OLED_ShowChar(Line, Column + i + 1, Number_Temp / OLED_Pow(10, Length - i - 1) % 10 + '0');
    }
    //小数点
    OLED_ShowChar(Line, Column + Length + 1, '.');
    //小数部分
    DecNumber_Temp = (uint32_t)((Number1 - Number_Temp)*(OLED_Pow(10,DecLength)));
    for (i = 0; i < Length; i++)                            
    {
        OLED_ShowChar(Line, Column + i + Length + 1 + 1, DecNumber_Temp / OLED_Pow(10, DecLength - i - 1) % 10 + '0');
    }
}

结果运行之后就卡住了,想了好久都不明白为什么?

单纯运行这个小数显示函数又是正常的,这个问题困扰了我两天[哭哭]

img

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 4月20日
    • 创建了问题 4月12日

    悬赏问题

    • ¥30 关于用python写支付宝扫码付异步通知收不到的问题
    • ¥50 vue组件中无法正确接收并处理axios请求
    • ¥15 隐藏系统界面pdf的打印、下载按钮
    • ¥15 MATLAB联合adams仿真卡死如何解决(代码模型无问题)
    • ¥15 基于pso参数优化的LightGBM分类模型
    • ¥15 安装Paddleocr时报错无法解决
    • ¥15 python中transformers可以正常下载,但是没有办法使用pipeline
    • ¥50 分布式追踪trace异常问题
    • ¥15 人在外地出差,速帮一点点
    • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改