wenbo2005.online

学习记录 / 基础 TxT 篇

MPU6050

基础 TxT 篇2025-05-04

这里使用两个GPIO口模拟IIC协议

(一),图形化配置界面

1,IIC_Software:SCL(PA1),SDA(PA0)

初始化:高电平

IO类型:容忍5V

2,设置采集频率(默认:100Hz)

开启一个10ms的定时器,负责获取MPU6050数据,不能过快也不能过慢!!

(二),添加MPU6050库文件

可能需要更改软件IIC引脚

(三),主代码:

#include "ti_msp_dl_config.h"
#include "bsp_mpu6050.h"
#include "inv_mpu.h"
#include "oled.h"
#include "stdio.h"
#include "string.h"
#include "board.h"

volatile float pitch,roll,yaw;   //欧拉角

int main(void)
{
    SYSCFG_DL_init();
    OLED_Init();
    char buff[128];

    MPU6050_Init();

    while( mpu_dmp_init() )
    {
        delay_ms(200);
    }
    //清除定时器中断标志
    NVIC_ClearPendingIRQ(TIMER_0_INST_INT_IRQN);
    //使能定时器中断
    NVIC_EnableIRQ(TIMER_0_INST_INT_IRQN);
    while(1)
    {
        snprintf(buff, 128, "P:%.2f  ",pitch);
        OLED_ShowString(0, 0, (uint8_t*)buff, 16, 1);

        snprintf(buff, 128, "R:%.2f  ",roll);
        OLED_ShowString(0, 16, (uint8_t*)buff, 16, 1);

        snprintf(buff, 128, "Y:%.2f  ",yaw);
        OLED_ShowString(0, 32, (uint8_t*)buff, 16, 1);
        OLED_Refresh();
    }
}

//定时器的中断服务函数 已配置为10ms的周期
void TIMER_0_INST_IRQHandler(void)
{
    //如果产生了定时器中断
    switch( DL_TimerG_getPendingInterrupt(TIMER_0_INST) )
    {
        case DL_TIMER_IIDX_ZERO://如果是0溢出中断
            //获取欧拉角
            mpu_dmp_get_data(&pitch,&roll,&yaw);
            break;

default://其他的定时器中断

            break;
    }
}