这个是直线倒立摆的卖家提供的源代码中Control部分里的位置PD控制部分。
Encoder应该是读电机的现在位置(转动角度)。
Position_Zero是10000,是电机的初始位置。
我不理解这段算法的过程。
麻烦详细地讲解一下。
谢谢!
函数功能:位置PD控制
入口参数:编码器
返回 值:位置控制PWM
作 者:平衡小车之家
**************************************************************************/
int Position(int Encoder)
{
static float Position_PWM,Last_Position,Position_Bias,Position_Differential;
static float Position_Least;
Position_Least =Encoder-Position_Zero; //电机转动的量,Position_Zero:电机初始位置
Position_Bias *=0.8;
Position_Bias += Position_Least*0.2; //===一阶低通滤波器
Position_Differential=Position_Bias-Last_Position;
Last_Position=Position_Bias;
Position_PWM=Position_Bias*Position_KP+Position_Differential*Position_KD; //===速度控制
return Position_PWM;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你没看到:
Position_Current_AfterFilter(现在这一拍) = Position_Current_AfterFilter(前一拍) *0.8 + Position_Current_Sample(现在这一拍)*0.2;
前一拍的占比80%,现一拍的占比20%,此次的采样值主要由上次的采样值决定
滤波啊,滤掉干扰抖动啊
Position_Current_AfterFilter(现在这一拍) = Position_Current_AfterFilter(前一拍) *0.8 + Position_Current_Sample(现在这一拍)*0.2;//得到经过滤波的位置(一阶低通滤波:此次的采样值主要由上次的采样值决定)
Position_Error(误差) = Position_Current_AfterFilter(现在这一拍) - Last_Position(上一拍的位置); //得到现在为止跟上次位置的误差
Last_Position(这一拍的位置) = Position_Current_AfterFilter(现在这一拍); //保存这次的位置作为下一拍的上次位置值
Position_PWM(控制量) = KP * Position_Error + KD * Position_Error; //PD计算
一阶低通滤波的作用是什么?
一周热门 更多>