資源簡(jiǎn)介
給出了伺服電機(jī)PWM控制的PID調(diào)節(jié)算法實(shí)現(xiàn),本算法已應(yīng)用與高速繪圖儀,僅作參考,弱用于商業(yè)用于,不承擔(dān)任何責(zé)任。

代碼片段和文件信息
#include?“pid_x.h“
/***?Beginheader?speed_relay*/
?void?speed_relay_X(void)
{
???float?Out_PWM;??/*繼電器的PWM輸出*/
/*********計(jì)算臨時(shí)變量****************/
???static?float?k1801w1801;
???static?float?c1?c2?f_relay?Current_Speed_Value;??
???static?float?fl_temp;
????c1=0.392699;
????c2=6.283185;
????f_relay=speed_relay;
????Current_Speed_Value=(float)errspeed_x;??????/*得到當(dāng)前的速度值*/
????
????if?(Current_Speed_Value<0.0)??/*如果當(dāng)前測(cè)量的速度值小于速度的穩(wěn)態(tài)值steady_v*/
Out_PWM=0-f_relay;??????/*繼電器的輸出為Out_PWMsteady_c*/
????else???????????????????????????????/*如果當(dāng)前測(cè)量的速度值大于等于速度的穩(wěn)態(tài)值*/
Out_PWM=0+f_relay;??????/*繼電器的輸出為Out_PWMsteady_c*/
?/*???
????if(Out_PWM>10)
???? Out_PWM=10;
????if(Out_PWM<0)
???? Out_PWM=0;
?????speedmv=Out_PWM*100.0/10;
????speedsetpoint=speedpv;
*/
????/*anaOutVolts(Out_PWM);?????????????????輸出PWM值移植到ARM9時(shí)需要
????*/
????
???/*繼電器的控制輸出*/
???input_x=?(int)Out_PWM;
???if?((Out_PWM<=0.0)&&(speed_flag==1))//steady_c
????????????????????speed_flag=0;
????if?((Out_PWM>0.0)&&(speed_flag==0))//steady_c
????????????{
???????speed_crossover++;
???????speed_flag=1;
????????if(speed_crossover==1)
? ??????????{
??? ????????speed_pv_max=Current_Speed_Value;
??? ????????speed_pv_min=Current_Speed_Value;
??? ????????speed_measure=1;?????
?? ???????????}
? ????????if(speed_crossover==2)??????/*speed_crossover等于2時(shí)表示一個(gè)震蕩周期結(jié)束要完成臨界值的計(jì)算*/
? ?????????{
??? ????????speed_crossover=0;
??? ????????speed_flag=1;
??? speed_measure=0;
fl_temp=speed_pv_max-speed_pv_min;
? fl_temp=fl_temp*c1;
? fl_temp=fl_temp/f_relay;
? k1801=fl_temp;
? fl_temp=(float)speed_relay_counter;
fl_temp=fl_temp/time;????????/*為什么除以10??*/
? fl_temp=c2/fl_temp;
? w1801=fl_temp;
speed_relay_counter=0;
? speed_relay_finish1++;???
if(speed_relay_finish1==speed_relay_finsh)?/*speed_relay_finish1表示震蕩完成的次數(shù)完成四次后可以看作開(kāi)始作等幅震蕩*/
? ??{???speed_k180=k1801;
??? ??????speed_w180=w1801;
??? ???????}
? ???}
????????}
????if(speed_measure==1)
????????{
if(Current_Speed_Value>speed_pv_max)
speed_pv_max=Current_Speed_Value;
if(Current_Speed_Value speed_pv_min=Current_Speed_Value;
speed_relay_counter++;
}
}??
static?void?speed_auto_tuning(void)
{
???speed_relay_X();
if(speed_relay_finish1==speed_relay_finsh)?/*speed_relay_finish1表示震蕩完成的次數(shù)完成四次后可以看作開(kāi)始作等幅震蕩*/
?{ /*speed_pid_tuning=1;
??speedmode=1;
*/
PID_Relay_Flag=0;
speed_relay_finish1=0;
/*
speedKp_X=cos(3.1415926*0.25)/(speed_k180*2.0);
speedTd_X=(tan(3.1415926*0.25)+sqrt(tan(3.1415926*0.25)*tan(3.1415926*0.25)+1?))/(speed_w180*2);
speedTi_X=speedTd_X*4.0;
*/
speedKp_X=540.1899;????//test
speedTd_X=57.6351;
speedTi_X=230.5404;
?}
}
void?PID_X(void)
{???????
??
?float?control_output;
??
??current_speed=pulse_error_x;
??
??speed_I=speed_last_I+(0+speedKp_X)*Sample_pe
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件??????16334??2007-05-21?17:29??motor\MotionControl--beifen.C
?????文件???????4322??2007-05-21?18:32??motor\pid_x.c
?????文件???????2193??2007-05-17?10:10??motor\pid_x.h
?????文件???????4245??2007-05-21?14:41??motor\pid_y?.c
?????文件???????2375??2007-05-17?10:11??motor\pid_y.h
?????目錄??????????0??2007-07-22?16:41??motor
-----------?---------??----------?-----??----
????????????????29469????????????????????6
評(píng)論
共有 條評(píng)論