求大佬帮我分析这段代码

2019-07-21 07:11发布

这个是直线倒立摆的卖家提供的源代码中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;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
szczyb1314
1楼-- · 2019-07-21 07:29
一阶低通滤波:此次的采样值主要由上次的采样值决定
你没看到:
Position_Current_AfterFilter(现在这一拍) = Position_Current_AfterFilter(前一拍) *0.8 + Position_Current_Sample(现在这一拍)*0.2;
前一拍的占比80%,现一拍的占比20%,此次的采样值主要由上次的采样值决定
滤波啊,滤掉干扰抖动啊
szczyb1314
2楼-- · 2019-07-21 08:41
Position_Current_Sample(现在这一拍) =Encoder-Position_Zero;  //得到现在的位置
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计算
15307116002
3楼-- · 2019-07-21 13:49
非常感谢您的回答。
一阶低通滤波的作用是什么?

一周热门 更多>