超详细!STM32平衡小车控制核心

您所在的位置:网站首页 平衡车播放音乐怎么调 超详细!STM32平衡小车控制核心

超详细!STM32平衡小车控制核心

2024-07-17 19:54| 来源: 网络整理| 查看: 265

本文目录 一、代码介绍0. 保护小车1. 直立环2. 速度环3. 获取角度函数4. 输出限幅函数5. Mpu6050外部中断 二、调试介绍步骤1:关闭速度环,只调直立环步骤2:关闭直立环,只调速度环步骤3:双环合并 三、效果演示   

一、代码介绍 0. 保护小车

当倾斜角度大于某一值时,我们关闭电机,防止小车摔倒后,电机仍处于较大转速。电机关闭时,返回值为0,正常时为1。

u8 Turn_Off(float angle) { u8 temp; if(angle40)//倾角大于40度关闭电机 { temp=0; Set_Pwm(Left_moter,0); //关闭左电机 Set_Pwm(Right_moter,0); //关闭右电机 } else temp=1; return temp; } 1. 直立环

   直立环中机械中值的确定:在小车进行两边分别倾斜时的临界值相加除2,来确定。或者通过多次调试来确定更改。这个机械中值很重要,是确保平衡的重要因素。

#define Middle_angle 2.8 //直立环的机械中值 typedef struct PID { float Kp; // Proportional Const P系数 float Ki; // Integral Const I系数 float Kd; // Derivative Const D系数 float PrevError ; // Error[-2] float LastError; // Error[-1] float Error; // Error[0 ] float DError; //pid->Error - pid->LastError float SumError; // Sums of Errors float output; float Integralmax; //积分项的最大值 float outputmax; //输出项的最大值 } PID; //直立环 float PID_Balance_Calc(PID *pid, float Angle,float Gyro) { float Angle_bias,Gyro_bias; Angle_bias=Middle_angle-Angle; //求出平衡的角度中值 和机械相关 Gyro_bias=0-Gyro; pid->output= -pid->Kp/100*Angle_bias-Gyro_bias*pid->Kd/100; //计算平衡控制的电机PWM PD控制 kp是P系数 kd是D系数 if(pid->output > pid->outputmax ) pid->output = pid->outputmax; if(pid->output outputmax ) pid->output = -pid->outputmax; return pid->output; } 2. 速度环 //为了防止积分项过度累积,引入积分项的限幅是一种常见的做法。 //限制积分项的幅值可以防止积分项过度增加,从而限制了系统的累积误差。这样可以避免系统过度响应或者不稳定。 float abs_limit(float value, float ABS_MAX) //积分限幅,设置最大值。 { if(value > ABS_MAX) value = ABS_MAX; if(valueError = 0-(encoder_left+encoder_right); //获取最新速度偏差==测量速度(左右编码器之和)-目标速度(此处为零) Encoder_bias *=0.8; //一阶低通滤波器 Encoder_bias += pid->Error*0.2; //一阶低通滤波器 pid->SumError +=Encoder_bias; pid->output = -pid->Kp* Encoder_bias -pid->Ki* abs_limit( pid->SumError, 10000); if(Turn_Off(Angle_Balance)==1) pid->SumError=0; //电机关闭后清除积分 if(pid->output > pid->outputmax ) pid->output = pid->outputmax; if(pid->output outputmax ) pid->output = -pid->outputmax; return pid->output ; //输出为pwm值 } 3. 获取角度函数

这里使用DMP库进行获取角度。点击:移植DMP库详情介绍。

void Get_Angle(void) { Read_DMP(); //读取加速度、角速度、倾角 Angle_Balance=Pitch; //更新平衡倾角,前倾为正,后倾为负 Gyro_Balance=gyro[0]; //更新平衡角速度,前倾为正,后倾为负 } 4. 输出限幅函数 int PWM_Limit(int IN,int max,int min) { int OUT = IN; if(OUT>max) OUT = max; if(OUT


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3