OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1959|回复: 3

求大佬帮我分析这段代码

[复制链接]

12

主题

19

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-10-23
在线时间
5 小时
发表于 2018-12-4 12:38:07 | 显示全部楼层 |阅读模式
5金钱
这个是直线倒立摆的卖家提供的源代码中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;
}

最佳答案

查看完整内容[请看2#楼]

一阶低通滤波:此次的采样值主要由上次的采样值决定 你没看到: Position_Current_AfterFilter(现在这一拍) = Position_Current_AfterFilter(前一拍) *0.8 + Position_Current_Sample(现在这一拍)*0.2; 前一拍的占比80%,现一拍的占比20%,此次的采样值主要由上次的采样值决定 滤波啊,滤掉干扰抖动啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-4 12:38:08 | 显示全部楼层
一阶低通滤波:此次的采样值主要由上次的采样值决定
你没看到:
Position_Current_AfterFilter(现在这一拍) = Position_Current_AfterFilter(前一拍) *0.8 + Position_Current_Sample(现在这一拍)*0.2;
前一拍的占比80%,现一拍的占比20%,此次的采样值主要由上次的采样值决定
滤波啊,滤掉干扰抖动啊
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-12-4 15:18:40 | 显示全部楼层
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计算
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

12

主题

19

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-10-23
在线时间
5 小时
 楼主| 发表于 2018-12-4 19:00:19 | 显示全部楼层
非常感谢您的回答。
一阶低通滤波的作用是什么?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 08:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表