关于PID的程序问题

2019-08-14 06:29发布

最近在网上找了一个 倒立摆 程序研究一下PID
程序中由几个不懂的点想请教论坛的大神们

在这个倒立摆中,用到了编码器和角速度传感器

//第一段程序
void PID_Init(u16 k_pa, u16 k_da, u16 k_pe, u16 k_de)
{
        PID.SetPoint = ADC_MID;
        PID.P_ANG = (float)k_pa / 1000;
        PID.I_ANG = 0;
        PID.D_ANG = (float)k_da / 1000;
        PID.P_ENCOD = (float)k_pe / 1000;
        PID.I_ENCOD = 0;
        PID.D_ENCOD = (float)k_de / 1000;
        PID.LastError = 0;
        PID.PrerError = 0;
}


//第二段程序
//摆杆PID计算
        pid_angle = PID.P_ANG * PID.PrerError;                            //比例
        pid_angle += PID.D_ANG * (PID.PrerError - PID.LastError);        //比例+微分
        angle_speed *= 0.97;                        //角速度
        angle_speed += (PID.PrerError - PID.LastError)*0.03;       
        PID.LastError = PID.PrerError;


在第一段程序中 为什么参数 k_pa,  k_da, k_pe, k_de都要除以1000呢?
在第二段程序中 为什么角速度又要乘与0.97呢?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
10条回答
正点原子
1楼-- · 2019-08-14 07:05
帮顶
aiyeba
2楼-- · 2019-08-14 09:00
我的猜想是第一段程序  你看他的函数参数都是u16的    PID其实大多数都是float型的   如果不用的话 就需要同时扩大或者缩小  (注:float运算很占cpu的)

第二个那个是比例参数  用来修正的
wmh19910511
3楼-- · 2019-08-14 09:57
既然你都看出来了要乘以0.97 那你为什么 不问 后面的式子 为什么 要乘以0.03呢?


你自己想想 这两个 加起来 系数等于1  

就是互补 滤波
凯爷儿
4楼-- · 2019-08-14 12:09
aiyeba 发表于 2017-8-23 11:28
我的猜想是第一段程序  你看他的函数参数都是u16的    PID其实大多数都是float型的   如果不用的话 就需要 ...

那比例参数的值是怎么得来的呢?
aiyeba
5楼-- · 2019-08-14 16:03
 精彩回答 2  元偷偷看……
aiyeba
6楼-- · 2019-08-14 17:46
正点原子 发表于 2017-8-23 00:26
帮顶

哥,你最近不是刚搞四轴飞行器,这个你应该知道的啊。

一周热门 更多>