| 
 | 
 
现在是通过PID单独调试相对的两个马达,采用增量式PID,输入是角度,输出是对应的马达PWM Duty的改变量。 
测试架构是这样的:将相对的1、3马达关掉,在将1、3马达拖起来,让2、4马达悬空,控制2、4马达PWM可以左右晃动,单独加入P后感觉回收力很小,加大P后就一直左右震荡。加入I后拿在手上倾斜一下才感觉回收力度在慢慢增大,但是还是会调过,出现震荡!加入D后没有改善。下面是我的PID算法: 
int32_t        PID_Cal(float Kp,float Ki,float Kd) 
{ 
        float PID_Value,Delta_Ek,Delta_Ek_B; 
        int32_t PID_Temp; 
         
        Delta_Ek = AngleMotor - AngleMotor_B1;                                //相邻两次的角度差 
        Delta_Ek_B = AngleMotor_B1 - AngleMotor_B2;                //上一次的角度差 
         
        PID_Value = Kp*Delta_Ek;                                                                                        //比例项 
        PID_Value += (Ki*AngleMotor);                                                                        //积分项 
        PID_Value += (Kd*(Delta_Ek - Delta_Ek_B));                //微分项 
         
        PID_Value += PID_Deci;                                                                                                //获取整数部分 
        PID_Temp = (int32_t)PID_Value; 
        PID_Deci = PID_Value - PID_Temp; 
        return PID_Temp; 
} 
由于我是4ms采集一次数据并计算一次角度来改变电机PWM Duty,所以很多时候PID出来的都是比较小的数,所以每次都保留了小数部分,将整数部分去改变PWM Duty。比如:马达2高、马达4低算出角度是正的,马达2低、马达4高算出角度是负的,我会将这个角度带到PID中,如果得到的值是正的就会去减小马达2的Duty,增大马达4的Duty;如果结果为负就增加马达2的Duty,减小马达4的Duty。 
 
 |   
 
 
 
 |