【平衡小车】学习日志(五)

  • 小车初步达到【平衡】要求
  • 清除了不需要的函数和注释信息,使工程尽量精简
  • 将OLED显示基本信息和显示数据封装成函数,使代码更好地模块化
  • 移除了Encoder中之前编写的外部中断服务函数(改为在MPU6050的外部中断中实现)
目前已实现功能说明
  • 【Encoder】+(【MPU6050】+【EXTI】+【NVIC】):通过MPU6050采集数据时跳变的INT引脚进入外部中断,读取编码器
  • 【PID】+(【MPU6050】+【EXTI】+【NVIC】):通过MPU6050采集数据时跳变的INT引脚进入外部中断,进行PID控制并装载至车轮
  • 【Motor】+【PWM】:通过PWM驱动车轮
  • 【OLED】:显示车辆姿态角、加速度数据、陀螺仪数据、温度值、左右车轮编码器值
//【MPU6050】初始化采集频率为200Hz(5ms),即每5ms对车辆状态进行更新控制

OLED

1、在oled.c编写基本信息显示函数 OLED_ShowBasic和采集数据显示函数 OLED_ShowMessage
  • 定义变量(sys.h已extern)
float pitch,roll,yaw;             //欧拉角(姿态角)
short aacx,aacy,aacz;            //加速度传感器原始数据
short gyrox,gyroy,gyroz;        //陀螺仪原始数据
float temp;                     //温度值
//pitch:俯仰角 精度:0.1°   范围:-90.0° <---> +90.0°
//roll:横滚角  精度:0.1°   范围:-180.0°<---> +180.0°
//yaw:航向角   精度:0.1°   范围:-180.0°<---> +180.0°
//左右编码器值
int Encoder_Left,Encoder_Right;
  • 基本信息显示函数
void OLED_ShowBasic(void)
{
    OLED_ShowString(0,0,"Pitch:",12);
    OLED_ShowString(0,1,"Roll :",12);
    OLED_ShowString(0,2,"Yaw  :",12);
    OLED_ShowString(0,3,"Temp :",12);
    OLED_ShowString(0,4,"Left :",12);
    OLED_ShowString(0,5,"Right:",12);
}
  • 采集数据显示函数
void OLED_ShowMessage(void)
{
    /**************显示俯仰角***************/    
        if(pitch<0)        
        {
            OLED_ShowString(48,0,"-",12);
            OLED_Float(0,56,-pitch,3);
        }    
        else    
        {
            OLED_ShowString(48,0,"+",12);
            OLED_Float(0,56,pitch,3);            
        }
/**************显示俯仰角***************/    
        
/**************显示翻滚角***************/    
        if(roll<0)        
        {
            OLED_ShowString(48,1,"-",12);
            OLED_Float(1,56,-roll,3);
        }    
        else    
        {
            OLED_ShowString(48,1,"+",12);
            OLED_Float(1,56,roll,3);            
        }
/**************显示翻滚角***************/    
        
/**************显示航向角***************/    
        if(yaw<0)        
        {
            OLED_ShowString(48,2,"-",12);
            OLED_Float(2,56,-yaw,3);
        }    
        else    
        {
            OLED_ShowString(48,2,"+",12);
            OLED_Float(2,56,yaw,3);            
        }
/**************显示航向角***************/
        
/**************显示温度*****************/
            OLED_Float(3,48,temp/100,2);    
/**************显示温度*****************/
        
/***********显示左右编码器值************/        
            OLED_Num2(29,4,Encoder_Left);
            OLED_Num2(35,5,Encoder_Right);
/***********显示左右编码器值************/
}
2、在oled.h中声明基本信息显示函数 OLED_ShowBasic和采集数据显示函数 OLED_ShowMessage
void OLED_ShowMessage(void);
void OLED_ShowBasic(void);
3、在sys.h中 #includ e "oled .h"
#include "oled.h"

PID参数

#define GB37520
#ifdef GB37520                 //适合电机GB37520使用的PID参数
#define BLC_KP 240        //直立环Kp
#define BLC_KD 0.75       //直立环Kd
#define SPD_KP 62          //速度环Kp
#define SPD_KI 0.31        //速度环Ki
#define TURN_KP -40      //转向环Kp
#define TURN_KD -0.6     //转向环Kd
#endif
使用大鱼电子的PID示例参数可以让小车达到【初步平衡】(前后)的效果,后期通过实践学习理解进而加以改动完善功能

主程序

#include "sys.h"
int main(void)
{
    delay_init();
    
    NVIC_Configuration();
    
    OLED_Init();
    OLED_Clear();
    
    MPU_Init();
    mpu_dmp_init();
    MPU6050_EXTI_Init();
    
    Encoder_TIM2_Init();
    Encoder_TIM3_Init();
    
    PWM_Init_TIM1(0,7199);
    Motor_Init();
    
    OLED_ShowBasic();
    
  while(1)    
    {
        OLED_ShowMessage();
    }     
}
实现功能:小车初步平衡,并通过OLED显示姿态数据等信息。当前小车为未精确调整PID控制之前的最精简程序,之后的调参和添加功能都在此基础上进行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值