找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 388|回复: 2
打印 上一主题 下一主题
收起左侧

本人小白,在自学平衡车项目,遇到了些问题!帮忙解决请客一杯奶茶。

[复制链接]
跳转到指定楼层
楼主
ID:368235 发表于 2025-3-18 19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "stm32f10x.h"                  // Device header"
#include "OLED.h"
#include "Delay.h"
#include "inv_mpu.h"
#include "Serial.h"
#include "string.h"
#include "Servo.h"
#include "Motor.h"
#include "MPU6050_Exti.h"
#include "MPU6050.h"

float Pitch,Roll,Yaw;
int16_t GX, GY, GZ;       

int main(void)
{
        delay_init();
        OLED_Init();
        Serial_Init();                //串口初始化
        Servo_Init();                  //舵机初始化
        Motor_Init();                  //直流电机初始化
        MPU6050_Exti_Init();//为MUP6050配置中断引脚PB12
        MPU6050_DMP_Init(); //MUP6050 DMP库初始化
  Servo_SetAngle(90);       
        Motor_SetSpeed(70);
       
        while(1)
        {
       
                Serial_Printf("%.2f %.2f %.2f\r\n",Pitch,Roll,Yaw);

                delay_ms(50);
       
                OLED_ShowFloatNum(1, 1, Roll, 3, 2, OLED_8X16);
                OLED_ShowFloatNum(1, 20, GY, 3, 2, OLED_8X16);
                //OLED_ShowFloatNum(1, 40, Yaw, 3, 2, OLED_8X16);
                OLED_Update();
               
        }
}

void EXTI15_10_IRQHandler(void)
{
        if (EXTI_GetITStatus(EXTI_Line12) == SET)                //判断是否是外部中断12号线触发的中断
        {
                MPU6050_DMP_Get_Data(&Pitch,&Roll,&Yaw);//获取MPU6050 DMP库的角度数据
               
                MPU_Get_Gyroscope(&GX,&GY,&GZ);                //获取MPU6050 原始角速度数据
               
                EXTI_ClearITPendingBit(EXTI_Line12);                //清除外部中断12号线的中断标志位
                //中断标志位必须清除
        }        //否则中断将连续不断地触发,导致主程序卡死
}

问题时这样的:中断函数里有两个函数。第一个是获取DMP库的数据,第二个是获取陀螺仪原始的数据。如何我两个函数同时运行,第一个函数就获取不到数据,第二个函数可以获取到数据。如果我把第二个函数注释掉,第一个函数又能获取数据了。我参考别人平衡车的代码也是这样写的,可到了我这里就出现问题了,麻烦大神帮忙指点一下!
谢谢了!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:940483 发表于 2025-3-20 08:30 | 只看该作者
#include "stm32f10x.h"
#include "OLED.h"
#include "Delay.h"
#include "inv_mpu.h"
#include "Serial.h"
#include "string.h"
#include "Servo.h"
#include "Motor.h"
#include "MPU6050_Exti.h"
#include "MPU6050.h"

// 全局变量声明
volatile float Pitch, Roll, Yaw;  // 使用volatile确保中断和主循环数据同步
int16_t GX, GY, GZ;              

int main(void)
{
    // 外设初始化
    delay_init();
    OLED_Init();
    Serial_Init();                // 串口初始化
    Servo_Init();                 // 舵机初始化
    Motor_Init();                 // 电机初始化
    MPU6050_Exti_Init();          // 配置MPU6050中断引脚PB12
    MPU6050_DMP_Init();           // DMP初始化
   
    Servo_SetAngle(90);           // 舵机初始角度
    Motor_SetSpeed(70);           // 电机初始速度

    while(1)
    {
        // 主循环中读取原始陀螺仪数据(非中断上下文)
        MPU_Get_Gyroscope(&GX, &GY, &GZ);
        
        // 通过串口输出DMP姿态数据
        Serial_Printf("Pitch:%.2f Roll:%.2f Yaw:%.2f\r\n", Pitch, Roll, Yaw);
        
        // OLED显示Roll和GY数据
        OLED_ShowFloatNum(1, 1, Roll, 3, 2, OLED_8X16);
        OLED_ShowFloatNum(1, 20, GY, 3, 2, OLED_8X16);
        OLED_Update();
        
        delay_ms(50);             // 控制主循环频率
    }
}

// 中断服务函数:仅处理DMP数据读取
void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line12) == SET)
    {
        // 仅读取DMP姿态数据(中断上下文)
        MPU6050_DMP_Get_Data(&Pitch, &Roll, &Yaw);
        
        EXTI_ClearITPendingBit(EXTI_Line12); // 必须清除中断标志
    }
}

试试
回复

使用道具 举报

板凳
ID:368235 发表于 2025-3-20 19:47 | 只看该作者
Tonghao666 发表于 2025-3-20 08:30
#include "stm32f10x.h"
#include "OLED.h"
#include "Delay.h"

谢谢你!仅读取DMP数据是可以的!两个函数一起运行就不可以!我也不知道为什么了!算了,我打算重新移植其他人的平衡车代码再看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表