OpenEdv-开源电子网

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

一起来学习PID

  [复制链接]

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
发表于 2014-7-20 14:17:51 | 显示全部楼层 |阅读模式
5金钱
这个是我从各网站看到然后总结的,并结合自己的经验解说的。后面会结合2013大学生电子设计竞赛国赛中C题倒立摆进行讲述(持续更新)
一、总体原则

    PID调试一般原则 
    a.在输出不振荡时,增大比例增益P。 
    b.在输出不振荡时,减小积分时间常数Ti。 
    c.在输出不振荡时,增大微分时间常数Td。
二、各环节作用
    [P]比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。反之,过小,更不上系统需求。
    [I]积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。一般情况是将时间常数设置很小。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。 
    [D]微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强 的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为 零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。
三、细说[分为PID、PI、PD]
    1、确定比例增益P 
    确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
     【解说】我们知道P是调节与预设值(即输入值)的偏差的作用的,因此P很大时,当反馈值很小时也会造成很大的波动,最终是震荡状态,这个可以试出来的,这时的P是Pmax。反之P太小时,根本不可能靠近预设值,当刚好能靠近预设值时,这时的P就是Pmin。一般取P = Pmax(*60~70%)。
    2、确定积分时间常数Ti
    比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录
此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
    【解说】
    3、确定积分时间常数Td积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti 的方法相同,取不振荡时的30%。 
    【解说】
    【PID算法演示小软件(绿色版)】
四、具体实践
[mw_shl_code=c,true]/*2014年7月17日*/ unsigned long lastTime; double Input, Output, Setpoint; double etSum, lastErr; double kp, ki, kd; //output = kp*et + ki*etSum + kd*det; void PidFunction() { /*How long since we last calculated*/ unsigned long now = millis(); //得到当前时间 double timeChange = (double)(now - lastTime); //得到当前时间与上次时间之间的间隔 /*Compute all the working error variables*/ // double et = Setpoint - Input; //反馈值与输入值的差值 e(t) = 比例 etSum += (et* timeChange); //差值*时间间隔乘积累加 = 积分 理论是零 double dEt = (et - lastErr) / timeChange; //差值-上一次差值 = 微分 /*Compute PID Output*/ // Output = kp * et + ki * etSum + kd * dEt; //输出 = 比例 + 积分 + 微分 /*Remember some variables for next time*/ lastErr = et; //下次循环: 当前比例成为过去比例 lastTime = now; //下次循环: 当前时间成为过去时间 } void ParaSet(double Kp, double Ki, double Kd) //设置比例、积分、微分的系数 { kp = Kp; ki = Ki; kd = Kd; } [/mw_shl_code]

    上面的程序代码是整个PID控制的模板。具体的看你的系统需求。下面我讲讲倒立摆(还不知道倒立摆是什么的可以去网上了解下)的PID控制:
【单个传感器实现倒立摆】
   角度传感器(精密电位器):我们知道一般的精密电位器就可以当作传感器来使用,电位器三个脚,其中一端接GND,一端接VCC,那么中间端作为电压输出,通过AD采样既可以获取摆转过的角度位置。自然在摆的最高点就有一个角度值。为了获得较好的控制周期,我们采用定时器中断的方式,即在定时器中断中进行采样和数据处理,并进行电机控制(放心,STM32运行速度足够了)。这里取定时器三毫米中断一次,注意,AD采样的时间一定要小于定时器中断时间,否则会出现时序错乱,可以在AD初始化中设定采样周期,或者在中断函数里面进行适当的处理,比如分三次采样取平均值(这个需要设定更小的中断时间,如一毫秒中断一次,我就是这样的做的)。定时器初始化和一些变量的定义我就没贴代码了,具体的代码如下:
[mw_shl_code=c,true]void TIM3_IRQHandler(void) { static int timercount; if(TIM3->SR&0X0001){ //溢出中断 LED1 = ~LED1; timercount++; } TIM3->SR &= ~(1<<0); //清除中断标志位 if(timercount == 1){ ang[0] = Get_Adc(ADC_CH1); } if(timercount == 2){ ang[1] = Get_Adc(ADC_CH1); } if(timercount == 3){ ////////////angle PID/////////// ang[2] = Get_Adc(ADC_CH1); //采集AD值 angleLast = angle; //保存上一次的采样角度值 angle = (ang[0]+ang[1]+ang[2])/3; //取三次采集的平均值 degreeLast = degree; //保存上一次的计算角度值 degree = calcAngle(angle); //获取新的计算角度值 velocity = (angle - angleLast); //得到采样角速度差值(微分值) if(abs(angle-setPoint)<=4) //输入值与反馈值差的绝对值 < 4 error_p = 0; //p = 0 else error_p = setPoint-angle; //p = 输入值与反馈值差 error_d = velocity; //d = 微分值 error_i = error_i + (error_p*timechange); myspeed = - (kp*error_p + ki*error_i + kd*error_d); setMotorSpeed(myspeed); //电机PID控制 //printf("[%d %d %d %7d]\t",angle,degree,myspeed,error_i); } if(timercount == 3){ timercount = 0; error_i = isOverFlow(error_i); } } [/mw_shl_code]
    电机速度控制代码:
[mw_shl_code=c,true]void setMotorSpeed(long mySpeed) { long output = 0; mySpeed = constrain(mySpeed,-41665,41665); //限制速度上下限 if(mySpeed == 0)mySpeed = 1; //保证速度不为零,也可以不用 if(mySpeed>0){ output = mySpeed*1.0; //这个具体的看系统进行调整放大 //printf("R:%d\t",output); TurnLeft(output); } else{ output = mySpeed*(-1.0); //printf("L:%d\t",output); TurnRight(output); } } [/mw_shl_code]

    速度控制的话,我的速度值调节范围为0~5000,这个可以通过定时器来设定的。
   效果如下:
  

【多个传感器实现倒立摆】

PID算法演示软件.rar

194.03 KB, 下载次数: 10293

PID控制原理及编程方法.pdf

460.82 KB, 下载次数: 16848

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

145

主题

477

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1264
金钱
1264
注册时间
2012-4-2
在线时间
69 小时
发表于 2014-7-20 17:49:14 | 显示全部楼层
等大神呢。。。。。。
回复

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2014-7-20 18:35:12 | 显示全部楼层
回复【2楼】767904101:
---------------------------------
慢慢更
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-20 23:21:18 | 显示全部楼层
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2013-1-12
在线时间
27 小时
发表于 2014-7-21 11:52:14 | 显示全部楼层
谢谢楼主,坐等更新。。。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2014-7-16
在线时间
13 小时
发表于 2014-7-22 10:51:45 | 显示全部楼层
感谢分享......
回复

使用道具 举报

17

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1016
金钱
1016
注册时间
2014-4-7
在线时间
99 小时
发表于 2014-7-22 12:23:43 | 显示全部楼层
搬个板凳听课了···
在你没有做出成绩之前,这个世界不会在乎你的自尊。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-7-23
在线时间
0 小时
发表于 2014-7-29 14:10:40 | 显示全部楼层
最近正好在做这个,顶一个
回复

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2014-7-29 16:00:30 | 显示全部楼层
不错,谢谢分享
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-7-23
在线时间
0 小时
发表于 2014-7-30 14:40:52 | 显示全部楼层
请问楼主是如何将读取的AD值通过PID转换成用来控制电机的PWM的TIMX->CCRX的?
回复

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2014-7-31 16:51:59 | 显示全部楼层
回复【10楼】elecfans:
---------------------------------
这个不是PID处理后有个输出吗?那个就是电机的速度控制量,然后赋值给CCRX就好了。
回复

使用道具 举报

23

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2012-11-2
在线时间
1 小时
发表于 2014-7-31 17:07:31 | 显示全部楼层
留着有用再来看
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-7-7
在线时间
0 小时
发表于 2014-7-31 20:52:32 | 显示全部楼层
楼主真的是太帅了,太爱你了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-7-7
在线时间
0 小时
发表于 2014-7-31 20:54:12 | 显示全部楼层
回复【11楼】回首看那个曾经的我:
---------------------------------
嘿嘿
回复

使用道具 举报

18

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2013-8-13
在线时间
0 小时
发表于 2014-8-5 18:42:06 | 显示全部楼层
楼主,软件使用过期了...求一个新的
要么不做,要么做到最好。。
回复

使用道具 举报

3

主题

17

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-7-28
在线时间
0 小时
发表于 2014-8-7 22:35:10 | 显示全部楼层
楼主你好,请问millis()这个函数是自己定义的吗?
回复

使用道具 举报

25

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2013-4-20
在线时间
0 小时
 楼主| 发表于 2014-8-8 12:16:46 | 显示全部楼层
回复【16楼】逍遥winter:
---------------------------------
就是告诉你采下样周期的获取,采样周期可以自己设定,这只是为了形象的表示下。你也可以真实的写出这个函数来。
回复

使用道具 举报

5

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2014-3-23
在线时间
0 小时
发表于 2014-8-10 11:46:40 | 显示全部楼层
楼主你好,这个代码是控制减速直流电机的吧?通过控制PWM波的占空比,改变加在电机两端的平均电压,进而改变输出扭矩,如果是步进电机,该如何控制改变输出扭矩呢?换句话说,步进电机该怎么控制摆杆摆动幅度?
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-9-6
在线时间
1 小时
发表于 2014-8-10 17:18:38 | 显示全部楼层
这个必须MARK
回复

使用道具 举报

1

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
266
金钱
266
注册时间
2014-7-5
在线时间
43 小时
发表于 2014-8-13 23:51:38 | 显示全部楼层
mark!!!!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-17
在线时间
0 小时
发表于 2014-8-17 08:44:15 | 显示全部楼层
学习了,谢谢楼主
回复

使用道具 举报

19

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2013-12-2
在线时间
0 小时
发表于 2014-8-18 09:45:16 | 显示全部楼层
回复【3楼】回首看那个曾经的我:
---------------------------------
楼主 对于pid编程一点都不了解 希望 能提供给一些资料,建议,谢谢了亲
回复

使用道具 举报

20

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2014-3-23
在线时间
22 小时
发表于 2014-8-21 16:49:59 | 显示全部楼层
楼主能不能把整个程序发出来啊,我看的比较迷惑,我最近要做一个项目,要用到PID,比较急
回复

使用道具 举报

20

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
183
金钱
183
注册时间
2013-7-17
在线时间
30 小时
发表于 2014-10-16 16:39:01 | 显示全部楼层
回复【23楼】张仁良:
---------------------------------
同求~
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2014-7-17
在线时间
2 小时
发表于 2014-11-29 10:26:33 | 显示全部楼层
跪拜了,真心牛逼!!小弟刚刚开始要做PID的温控,CO2浓度控,跟着大神学了。
回复

使用道具 举报

20

主题

232

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
335
金钱
335
注册时间
2013-6-1
在线时间
0 小时
发表于 2014-11-29 13:18:43 | 显示全部楼层
去年就是因为不懂PID所以没做出来,需要这样的帖子哇。
回复

使用道具 举报

8

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2014-12-2
在线时间
0 小时
发表于 2015-3-6 12:11:08 | 显示全部楼层
新手刚开始用STM32开始做PI控制,我想问的是PID的控制模板在STM32中也是适用的?我所控制对象是功率电路,不涉及电机。
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-3-6 13:35:57 | 显示全部楼层
谢谢分享 留名学习
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-3-8
在线时间
0 小时
发表于 2015-3-8 18:49:10 | 显示全部楼层
不知道那个软件怎么用?菜鸟求教
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-3-7
在线时间
0 小时
发表于 2015-3-12 11:50:41 | 显示全部楼层
isOverFlow具体是如何实现的,需要剔除之前的值吗
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-9-14
在线时间
0 小时
发表于 2015-5-3 21:43:13 | 显示全部楼层
没然后了吗???求解答
回复

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2015-5-4 09:07:53 | 显示全部楼层
顶一个。。。
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2015-5-23
在线时间
1 小时
发表于 2015-5-23 11:15:08 | 显示全部楼层
正需要!!!
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-12-1
在线时间
8 小时
发表于 2015-7-13 11:20:10 | 显示全部楼层
谢谢 =  -=不过资料不够啊
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-7-11
在线时间
0 小时
发表于 2015-7-14 15:24:23 | 显示全部楼层
楼主可以帮整个代码发一下吗,,有些疑惑
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-4-25
在线时间
0 小时
发表于 2015-7-25 20:13:14 | 显示全部楼层
changetime代表什么呢
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-7-26
在线时间
0 小时
发表于 2015-7-26 10:41:11 | 显示全部楼层
回复【2楼】767904101:
---------------------------------为什么D没有加filter
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-7-18
在线时间
2 小时
发表于 2015-7-26 12:04:53 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶
回复

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2014-7-18
在线时间
2 小时
发表于 2015-7-26 15:02:23 | 显示全部楼层
再加个位置闭环吧,就可以不让它旋转了。这样看着都晕。。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-10
在线时间
0 小时
发表于 2015-7-29 17:50:35 | 显示全部楼层
MARK,正在学习PID算法
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-12-12
在线时间
0 小时
发表于 2015-7-31 11:04:28 | 显示全部楼层

回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-27
在线时间
3 小时
发表于 2015-8-2 08:59:31 | 显示全部楼层
最近也在做这个,必须顶
回复

使用道具 举报

5

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-7-27
在线时间
3 小时
发表于 2015-8-2 09:03:35 | 显示全部楼层
软件怎么用呢?设定参考线没法设置啊?求助
回复

使用道具 举报

14

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2015-8-5
在线时间
9 小时
发表于 2015-10-15 16:09:13 | 显示全部楼层
那个模拟pid的软件怎么调整参数都没有超调啊,这是什么问题?????
回复

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-12-13
在线时间
13 小时
发表于 2015-10-30 10:04:38 | 显示全部楼层
谢谢楼主分享 学习了
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-11-22
在线时间
3 小时
发表于 2015-11-24 12:02:14 | 显示全部楼层
回复【17楼】回首看那个曾经的我:
---------------------------------
回复【17楼】回首看那个曾经的我:
---------------------------------
大哥,有没有用pid控制一个电机的速度和位置的程序和资料,急用,非常感谢。
回复

使用道具 举报

7

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-12-13
在线时间
13 小时
发表于 2016-1-22 10:58:28 | 显示全部楼层
好东西  谢谢分享
回复

使用道具 举报

11

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
105
金钱
105
注册时间
2016-1-21
在线时间
29 小时
发表于 2016-1-22 11:07:12 | 显示全部楼层
大神能解释下  pid算法中的采样时间的选择和电机速度的更新时间的大概关系。。。。。还有电机控制中的位置控制介绍一下。。求指点、、、、、、、
回复

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1684
金钱
1684
注册时间
2014-2-25
在线时间
230 小时
发表于 2016-1-22 11:41:00 | 显示全部楼层
去年暑假我们做的是风力摆,前年做的是四轴都是用的PID
回复

使用道具 举报

1

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-2-4
在线时间
7 小时
发表于 2016-1-23 15:25:35 | 显示全部楼层
你这个是1相步进电机吗
只有一个pwm?????????
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 11:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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