Improving the Beginners PID.docx
- 文档编号:25394598
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:35
- 大小:221.66KB
Improving the Beginners PID.docx
《Improving the Beginners PID.docx》由会员分享,可在线阅读,更多相关《Improving the Beginners PID.docx(35页珍藏版)》请在冰豆网上搜索。
ImprovingtheBeginnersPID
ImprovingtheBeginner’sPID–Introduction
InconjunctionwiththereleaseofthenewArduinoPIDLibraryI’vedecidedtoreleasethisseriesofposts.Thelastlibrary,whilesolid,didn’treallycomewithanycodeexplanation.Thistimearoundtheplanistoexplainingreatdetailwhythecodeisthewayitis.I’mhopingthiswillbeofusetotwogroupsofpeople:
∙Peopledirectlyinterestedinwhat’sgoingoninsidetheArduinoPIDlibrarywillgetadetailedexplanation.
∙AnyonewritingtheirownPIDalgorithmcantakealookathowIdidthingsandborrowwhatevertheylike.
It’sgoingtobeatoughslog,butIthinkIfoundanot-too-painfulwaytoexplainmycode. I’mgoingtostartwithwhatIcall“TheBeginner’sPID.” I’llthenimproveitstep-by-stepuntilwe’releftwithanefficient,robustpidalgorithm.
TheBeginner’sPID
Here’sthePIDequationaseveryonefirstlearnsit:
AD采样之后(离散化),积分变成求和,微分变成差分,如下式
Ts—采样周期
Ti—积分时间
Td—微分时间
ThisleadsprettymucheveryonetowritethefollowingPIDcontroller:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*workingvariables*/
unsignedlonglastTime;
doubleInput,Output,Setpoint;
doubleerrSum,lastErr;
doublekp,ki,kd;
voidCompute()
{
/*Howlongsincewelastcalculated*/
unsignedlongnow=millis();
doubletimeChange=(double)(now-lastTime);
/*Computealltheworkingerrorvariables*/
doubleerror=Setpoint-Input;
errSum+=(error*timeChange);
doubledErr=(error-lastErr)/timeChange;
/*ComputePIDOutput*/
Output=kp*error+ki*errSum+kd*dErr;
/*Remembersomevariablesfornexttime*/
lastErr=error;
lastTime=now;
}
voidSetTunings(doubleKp,doubleKi,doubleKd)
{
kp=Kp;
ki=Ki;
kd=Kd;
}
Compute()iscalledeitherregularlyorirregularly(要么定期或不定期),anditworksprettywell.Thisseriesisn’tabout“worksprettywell”though.Ifwe’regoingtoturnthiscodeintosomethingonparwith(与谁同一水平)industrialPIDcontrollers,we’llhavetoaddressafewthings:
1.SampleTime(采样周期)-ThePIDalgorithmfunctionsbestifitisevaluatedataregularinterval.Ifthealgorithmisawareofthisinterval,wecanalsosimplifysomeoftheinternalmath.
2.DerivativeKick(微分的超调)-Notthebiggestdeal,buteasytogetridof,sowe’regoingtodojustthat.
3.On-The-FlyTuningChanges-AgoodPIDalgorithmisonewheretuningparameters(调试参数)canbechangedwithoutjoltingtheinternalworkings(影响内部的计算过程).
4.ResetWindupMitigation(缓解积分饱和)-We’llgointowhatResetWindup(积分饱和)is,andimplement(完成)asolutionwithsidebenefits。
5.On/Off(Auto/Manual)-Inmostapplications,thereisadesireto(总希望)sometimesturnoffthePIDcontrollerandadjusttheoutputbyhand,withoutthecontrollerinterfering
6.Initialization(初始化)-Whenthecontrollerfirstturnson,wewanta“bumplesstransfer无扰动.”Thatis,wedon’twanttheoutputtosuddenlyjerk(v.痉挛)tosomenewvalue
7.ControllerDirection-Thislastoneisn’tachangeinthenameofrobustness鲁棒性perse.it’sdesignedtoensurethattheuserenterstuningparameterswiththecorrectsign.
Oncewe’veaddressed处理alltheseissues,we’llhaveasolid可靠的PIDalgorithm.Sowhetheryou’retryingtowriteyourownalgorithm,ortryingtounderstandwhat’sgoingoninsidethePIDlibrary,Ihopethishelpsyouout.Let’sgetstarted.
TheProblem
TheBeginner’sPIDisdesignedtobecalledirregularly不全面.Thiscauses2issues:
∙Youdon’tgetconsistentbehaviorfromthePID,sincesometimesit’scalledfrequentlyandsometimesit’snot.没有规律
∙Youneedtodoextramathcomputingthederivativeandintegral微积分,sincethey’rebothdependentonthechangeintime.
TheSolution
EnsurethatthePIDiscalledataregularinterval.ThewayI’vedecidedtodothisistospecifythatthecomputefunctiongetcalledeverycycle.basedonapre-determinedSampleTime,thePIDdecidesifitshouldcomputeorreturnimmediately.(等间距采样之后,再计算)
OnceweknowthatthePIDisbeingevaluatedataconstantinterval,thederivativeandintegralcalculationscanalsobesimplified.Bonus!
TheCode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*workingvariables*/
unsignedlonglastTime;
doubleInput,Output,Setpoint;
doubleerrSum,lastErr;
doublekp,ki,kd;
intSampleTime=1000;//1sec
voidCompute()
{
unsignedlongnow=millis();
inttimeChange=(now-lastTime);
if(timeChange>=SampleTime)
{
/*Computealltheworkingerrorvariables*/
doubleerror=Setpoint-Input;
errSum+=error;
doubledErr=(error-lastErr);
/*ComputePIDOutput*/
Output=kp*error+ki*errSum+kd*dErr;
/*Remembersomevariablesfornexttime*/
lastErr=error;
lastTime=now;
}
}
voidSetTunings(doubleKp,doubleKi,doubleKd)
{
doubleSampleTimeInSec=((double)SampleTime)/1000;
kp=Kp;//大小写
ki=Ki*SampleTimeInSec;//Ki=Kp/Ti
kd=Kd/SampleTimeInSec;//Kd=Kp*Td
}
/*设定新的采样周期之后,ki和kd自动调整*/
voidSetSampleTime(intNewSampleTime)
{
if(NewSampleTime>0)
{
doubleratio =(double)NewSampleTime
/(double)SampleTime;
ki*=ratio;
kd/=ratio;
SampleTime=(unsignedlong)NewSampleTime;
}
}
Onlines10&11,thealgorithmnowdecidesforitselfifit’stimetocalculate.Also,becausewenowKNOWthatit’sgoingtobethesametimebetweensamples,wedon’tneedtoconstantly不断的multiplybytimechange.Wecanmerelyadjust仅仅调整theKiandKdappropriately适当的(lines31&32)andresultismathematicallyequivalent,butmoreefficient.
onelittlewrinkle波动withdoingitthiswaythough.iftheuserdecidestochangethesampletimeduringoperation,theKiandKdwillneedtobere-tweakedtoreflectthisnewchange.that’swhatlines39-42areallabout.
AlsoNotethatIconvertthesampletimetoSecondsonline29.Strictlyspeaking严格的说thisisn’tnecessary,butallowstheusertoenterKiandKdinunitsof1/secands,ratherthan1/mSandmS.
TheResults
thechangesabovedo3thingsforus
1.RegardlessofhowfrequentlyCompute()iscalled,thePIDalgorithmwillbeevaluatedataregularinterval[Line11]
2.Becauseofthetimesubtraction[Line10]therewillbenoissueswhenmillis()wrapsbackto0.Thatonlyhappensevery55days,butwe’regoingforbulletproofremember?
3.Wedon’tneedtomultiplyanddividebythetimechangeanymore.Sinceit’saconstantwe’reabletomoveitfromthecomputecode[lines15+16]andlumpitinwiththetuningconstants[lines31+32].Mathematicallyitworksoutthesame,butitsavesamultiplicationandadivisioneverytimethePIDisevaluated
Sidenoteaboutinterrupts关于中断
IfthisPIDisgoingintoamicrocontroller,averygoodargument理由canbemadeforusinganinterrupt.SetSampleTimesetstheinterruptfrequency,thenComputegetscalledwhenit’stime.Therewouldbenoneed,inthatcase,forlines9-12,23,and24.IfyouplanondoingthiswithyourPIDimplentation,goforit!
Keepreadingthisseriesthough.You’llhopefullystillgetsomebenefitfromthemodificationsthatfollow.
TherearethreereasonsIdidn’tuseinterrupts
1.Asfarasthisseriesisconcerned,noteveryonewillbeabletouseinterrupts.
2.Thingswouldgettricky棘手的ifyouwanteditimplementmanyPIDcontrollersatthesametime.
3.IfI’mhonest,itdidn’toccurtome.JimmieRodgerssuggesteditwhileproof-readingtheseriesforme.ImaydecidetouseinterruptsinfutureversionsofthePIDlibrary.
TheProblem
Thismodification改变isgoingtotweakthederivativetermabit.Thegoalistoeliminateaphenomenonknownas“DerivativeKick”.微分的超调?
Theimageaboveillustratestheproblem.Sinceerror=Setpoint-Input,anychangeinSetpointcausesaninstantaneous瞬间的changeinerror.Thederivativeofthischangeisinfinity理想情况下,导数的变化无限大(inpractice,sincedtisn’t0itjustwindsupbeingareallybignumber.)Thisnumbergetsfedinto注入thepidequation,whichresultsinanundesirablespikeintheoutput.Luckilythereisaneasywaytogetridofthis.
TheSolution
ItturnsoutthatthederivativeoftheErrorisequaltonegativederivativeofInput,EXCEPTwhentheSetpointischanging.Thiswindsupbeingaperfectsolution.Insteadofadding(Kd*derivativeofError),wesubtract(Kd*derivativeofInput).Thisisknownasusing“DerivativeonMeasurement”指的是微分环节在这种突变下的反应是最快速,最激烈的。
TheCode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*workingvariables*/
unsignedlonglastTime;
doubleInput,Output,Setpoint;
doubleerrSum,lastInput;
doublekp,ki,kd;
intSampleTime=1000;//1sec
voidCompute()
{
unsignedlongnow=millis();
inttimeChange=(now-lastTime);
if(timeChange>=SampleTime)
{
/*Computealltheworkingerrorvariables*/
doubleerror=Setpoint-Input;
errSum+=error;
doubledInput=(Input-lastInput);
/*ComputePIDOutput*/
Output=kp*error+ki*errSum-kd*dInput;
/*Remembersomevariablesfornexttime*/
lastInput=Input;
lastTime=now;
}
}
voidSetTunings(doubleKp,doubleKi,doubleKd)
{
doubleSampleTimeInSec=((double)SampleTime)/1000;
kp=Kp;
ki=Ki*SampleTimeInSec;
kd=Kd/SampleTimeInSec;
}
voidSet
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Improving the Beginners PID