请教:软件PID是怎么实现的?

[复制链接]
2447|0
 楼主| liuc0731 发表于 2007-8-10 15:26 | 显示全部楼层 |阅读模式
目前我正在做一个控制类的设计&nbsp;&nbsp;其中就有电机的控制.&nbsp;但是我不知道怎么样通过软件PID来实现修正.<br />在网上找了几段软件PID程序&nbsp;&nbsp;&nbsp;也弄不懂,请教高手赐教!<br /><br />/*====================================================================================================<br />&nbsp;&nbsp;&nbsp;&nbsp;这是从网上找来的一个比较典型的PID处理程序,在使用单片机作为控制cpu时,请稍作简化,具体的PID<br />参数必须由具体对象通过实验确定。由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算,<br />而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可<br />大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余<br />数补偿。这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。<br />=====================================================================================================*/<br />#include&nbsp;&ltstring.h&gt<br />#include&nbsp;&ltstdio.h&gt<br />/*====================================================================================================<br />&nbsp;&nbsp;&nbsp;&nbsp;PID&nbsp;Function<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;PID&nbsp;(比例、积分、微分)&nbsp;function&nbsp;is&nbsp;used&nbsp;in&nbsp;mainly<br />&nbsp;&nbsp;&nbsp;&nbsp;control&nbsp;applications.&nbsp;PIDCalc&nbsp;performs&nbsp;one&nbsp;iteration&nbsp;of&nbsp;the&nbsp;PID<br />&nbsp;&nbsp;&nbsp;&nbsp;algorithm.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;While&nbsp;the&nbsp;PID&nbsp;function&nbsp;works,&nbsp;main&nbsp;is&nbsp;just&nbsp;a&nbsp;dummy&nbsp;program&nbsp;showing<br />&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;typical&nbsp;usage.<br />=====================================================================================================*/<br /><br />typedef&nbsp;struct&nbsp;PID&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;SetPoint;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;设定目标&nbsp;Desired&nbsp;Value<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;Proportion;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;比例常数&nbsp;Proportional&nbsp;Const<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;Integral;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;积分常数&nbsp;Integral&nbsp;Const<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;Derivative;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;微分常数&nbsp;Derivative&nbsp;Const<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;LastError;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Error[-1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;PrevError;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Error[-2]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;SumError;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Sums&nbsp;of&nbsp;Errors<br /><br />}&nbsp;PID;<br /><br />/*====================================================================================================<br />&nbsp;&nbsp;&nbsp;PID计算部分<br />=====================================================================================================*/<br /><br />double&nbsp;PIDCalc(&nbsp;PID&nbsp;*pp,&nbsp;double&nbsp;NextPoint&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;dError,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Error&nbsp;=&nbsp;pp-&gtSetPoint&nbsp;-&nbsp;&nbsp;NextPoint;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;偏差<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pp-&gtSumError&nbsp;+=&nbsp;Error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;积分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dError&nbsp;=&nbsp;pp-&gtLastError&nbsp;-&nbsp;pp-&gtPrevError;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;当前微分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pp-&gtPrevError&nbsp;=&nbsp;pp-&gtLastError;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pp-&gtLastError&nbsp;=&nbsp;Error;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(pp-&gtProportion&nbsp;*&nbsp;Error&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;比例项<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;pp-&gtIntegral&nbsp;*&nbsp;pp-&gtSumError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;积分项<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;pp-&gtDerivative&nbsp;*&nbsp;dError&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;微分项<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />}<br /><br />/*====================================================================================================<br />&nbsp;&nbsp;&nbsp;Initialize&nbsp;PID&nbsp;Structure<br />=====================================================================================================*/<br /><br />void&nbsp;PIDInit&nbsp;(PID&nbsp;*pp)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;memset&nbsp;(&nbsp;pp,0,sizeof(PID));<br />}<br /><br />/*====================================================================================================<br />&nbsp;&nbsp;&nbsp;&nbsp;Main&nbsp;Program<br />=====================================================================================================*/<br /><br />double&nbsp;sensor&nbsp;(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Dummy&nbsp;Sensor&nbsp;Function<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;100.0;<br />}<br /><br />void&nbsp;actuator(double&nbsp;rDelta)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Dummy&nbsp;Actuator&nbsp;Function<br />{}<br /><br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;PID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sPID;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;PID&nbsp;Control&nbsp;Structure<br />&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rOut;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;PID&nbsp;Response&nbsp;(Output)<br />&nbsp;&nbsp;&nbsp;&nbsp;double&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIn;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;PID&nbsp;Feedback&nbsp;(Input)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PIDInit&nbsp;(&nbsp;&sPID&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Initialize&nbsp;Structure<br />&nbsp;&nbsp;&nbsp;&nbsp;sPID.Proportion&nbsp;=&nbsp;0.5;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Set&nbsp;PID&nbsp;Coefficients<br />&nbsp;&nbsp;&nbsp;&nbsp;sPID.Integral&nbsp;&nbsp;&nbsp;=&nbsp;0.5;<br />&nbsp;&nbsp;&nbsp;&nbsp;sPID.Derivative&nbsp;=&nbsp;0.0;<br />&nbsp;&nbsp;&nbsp;&nbsp;sPID.SetPoint&nbsp;&nbsp;&nbsp;=&nbsp;100.0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Set&nbsp;PID&nbsp;Setpoint<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Mock&nbsp;Up&nbsp;of&nbsp;PID&nbsp;Processing<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rIn&nbsp;=&nbsp;sensor&nbsp;();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Read&nbsp;Input<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rOut&nbsp;=&nbsp;PIDCalc&nbsp;(&nbsp;&sPID,rIn&nbsp;);&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Perform&nbsp;PID&nbsp;Interation<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actuator&nbsp;(&nbsp;rOut&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;Effect&nbsp;Needed&nbsp;Changes<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />这段程序是网上找的&nbsp;&nbsp;&nbsp;我就没有弄懂........
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部