舵機控制演算法
① 輝盛MG995舵機的控制脈寬時間
舵機控制都是一樣的。
基於單片機的舵機控制方法具有簡單、精度高、成本低、體積小的特點,並可根據不同的舵機數量加以靈活應用。
在機器人機電控制系統中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統和航模中作為基本的輸出執行機構,其簡單的控制和輸出使得單片機系統非常容易與之介面。
舵機是一種位置伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。其工作原理是:控制信號由接收機的通道進入信號調制晶元,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶元決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
圖1 舵機的控制要求
舵機的控制信號是PWM信號,利用占空比的變化改變舵機的位置。一般舵機的控制要求如圖1所示。
單片機實現舵機轉角控制
可以使用FPGA、模擬電路、單片機來產生舵機的控制信號,但FPGA成本高且電路復雜。對於脈寬調制信號的脈寬變換,常用的一種方法是採用調制信號獲取有源濾波後的直流電壓,但是需要50Hz(周期是20ms)的信號,這對運放器件的選擇有較高要求,從電路體積和功耗考慮也不易採用。5mV以上的控制電壓的變化就會引起舵機的抖動,對於機載的測控系統而言,電源和其他器件的信號雜訊都遠大於5mV,所以濾波電路的精度難以達到舵機的控制精度要求。
也可以用單片機作為舵機的控制單元,使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將計算結果轉化為PWM信號輸出到舵機,由於單片機系統是一個數字系統,其控制信號的變化完全依靠硬體計數,所以受外界干擾較小,整個系統工作可靠。
單片機系統實現對舵機輸出轉角的控制,必須首先完成兩個任務:首先是產生基本的PWM周期信號,本設計是產生20ms的周期信號;其次是脈寬的調整,即單片機模擬PWM信號的輸出,並且調整占空比。
當系統中只需要實現一個舵機的控制,採用的控制方式是改變單片機的一個定時器中斷的初值,將20ms分為兩次中斷執行,一次短定時中斷和一次長定時中斷。這樣既節省了硬體電路,也減少了軟體開銷,控制系統工作效率和控制精度都很高。
② 攝像頭組舵機PID演算法的偏差ek要怎麼求
不知道你的pid 表是控制什麼的,我們用來控制蒸汽薄膜閥動作來控制溫度的,而且一般表都有pid 自診定,表自身能計算出適合的pid 值。我的經驗是,p值最重要,一般p值越小,控制的動作反應越快,I 值和D 值只是幫助控制的效果更好。
和你說下在我們設備的一個經驗值里,P=3,I=60,D=90,希望對你有所幫助。很多的控制也都是慢慢試驗出來的pid 值。因為各種應用場合千差萬別,不好根據公式計算出pid 值。
以下摘自網路:
PID控制方式的具體流程是計算誤差和溫度的變化速度進行PID計算,先以P參數和誤差計算出基礎輸出量,在根據誤差的累積值和I參數計算出修正量,最終找出控制點和溫度設定點之間的平衡狀態,最後在通過溫度的變化速率與D參數控制溫度的變化速度以防止溫度的劇烈變化。進行整定時先進行P調節,使I和D作用無效,觀察溫度變化曲線,若變化曲線多次出現波形則應該放大比例(P)參數,若變化曲線非常平緩,則應該縮小比例(P)參數。比例(P)參數設定好後,設定積分(I)參數,積分(I)正好與P參數相反,曲線平緩則需要放大積分(I),出現多次波形則需要縮小積分(I)。比例(P)和積分(I)都設定好以後設定微分(D)參數,微分(D)參數與比例(P)參數的設定方法是一樣的。
③ 求教:舵機如何通過程序減速舵機的轉速太快,如何通過程序給減速。
PWM就不用說了。我給你一段PID的代碼:
#define AA_KPVALUE 150 #define AA_KIVALUE 100 #define AA_KDVALUE 30
typedef struct PID { sint an_Ref; //角度PID,角度設定值 sint an_FeedBack; //角度PID,角度反饋值 sint an_PreError; //角度PID,前一次,角度誤差,,an_Ref - an_FeedBack sint an_PreDerror; //角度PID,前一次,角度誤差之差,d_error-PreDerror; sint an_Kp; //角度PID,Ka = Kp sint an_Ki; //角度PID,Kb = Kp * ( T / Ti ) sint an_Kd; //角度PID, sint an_PreU; //舵機控制輸出值}PID;
PID sPID;//申請一個PID類型的變數
void PIDInit(void)//PID初始化 { sPID.an_Ref = 0 ; sPID.an_FeedBack = 0 ; sPID.an_PreError = 0 ; sPID.an_PreDerror = 0 ; sPID.an_Kp = AA_KPVALUE; sPID.an_Ki = AA_KIVALUE; sPID.an_Kd = AA_KDVALUE; sPID.an_PreU = 0 ; }
unsigned int PIDCalc( PID *pp )//返回值賦給舵機 { sint error,d_error,dd_error; error = pp->an_Ref - pp->an_FeedBack; d_error = error - pp->an_PreError; dd_error = d_error - pp->an_PreDerror; pp->an_PreError = error; pp->an_PreDerror = d_error; pp->an_PreU +=pp->an_Kp*error+pp->an_Ki*d_error+pp->an_Kd*dd_error ; return ( pp->an_PreU ); }在主函數中初始化PID,將設定值與返回值設置好後,調用unsigned int PIDCalc( PID *pp )把返回值給舵機。
設定值就是你想要讓舵機轉的角度賦給sPID.an_Ref,返回值就是舵機現在的角度。因為是一個閉環控制系統,需要將角度量化以後的值返回,賦給sPID.an_FeedBack,這個演算法會根據設定值與現在所處的角度計算出下一次所偏轉的角度,這是一種增量式數字PID的演算法。若想修改轉的速度就修改宏定義中這三個參數的值,其中AA_KPVALUE影響最大。PID的東西很多,我也只是初窺門徑。希望對你有所幫助
④ 如何用51單片機控制舵機的單片機程序是怎麼寫的希望你也能給我發一個編寫程序和電路圖
單片機系統實現對舵機輸出轉角的控制,必須首先完成兩項任務:首先,產生基本的PWM周期信號,即產生20ms的周期信號;其次,調整脈寬,即單片機調節PWM信號的占空比。單片機能使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將PWM信號輸出到舵機。
發一個自己原來寫的簡單的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延時函數
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
//定時器初始化
void Time0_init()
{
TMOD=0x01; //定時器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定時器0中斷程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判斷0.5ms次數是否小於角度標識
pwm=1; //是,pwm輸出高電平
else
pwm=0; //否,輸出低電平
count=count+1;
count=count%40; //次數始終保持為40,即保持周期為20ms
}
//按鍵掃描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按鍵按下則20ms周期重新開始計時
if(jd==6)
jd=5; //已經是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已經0度,保持
while(jian==0);
}
}
}
//數碼管顯示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
電路圖很簡單的,幾個按鍵,再在單片機最小系統上接出一個信號線,再給舵機供上電就可以了。
⑤ 怎麼讓舵機停下來
以後程序記得寫清楚點,規范化一點,還有,需要有必要的注釋好不好,不然人家怎麼知道你的d1是幹嘛的?
這里我當做是你的筆誤吧
「
// oji1();
」
前面的「//」應該沒有的吧
你的意思應該是:
不斷執行oji1();
同時不斷檢測按鍵之類的。
你想想,你進入了oji1();
當你按下d1後,它怎麼能停下來呢,因為d1放在了oji1();的後面
而且你想要實現及時反應的話,你的演算法本身就有問題。
想過另外一個演算法吧。
要不就把問題補充詳細點,我幫你想一個。
對了我這里有個自己以前做巡線小車的程序,拿去看看吧
#include<reg52.h> //頭文件
#define uchar unsigned char //宏定義
#define uint unsigned int
sbit infl1=P3^4; //inf代表紅外對管,1為外,2為內。
sbit infl2=P3^5;
sbit infr2=P3^6;
sbit infr1=P3^7;
sbit pwm=P1^0; //信號線
uchar jd,count;
void time_init() //中斷初始化
{
TMOD=0x01;
TH0=0xff; //高電平單位脈沖時間定為方式1,晶振頻率為11.0592,0.1ms
TL0=0xa3;
IE=0x82;
TR0=1;
}
void time_ini()interrupt 1 //中斷函數
{
TH0=0xff; //重新賦新值
TL0=0xa3;
if(count<jd)
pwm=1;
else pwm=0;
count++;
count=count%200; //脈沖周期20ms
}
void keyscan() //按鍵掃描
{
if(infr1==0)
{
jd=11;
count=0;
while(infr1==0);
}
if(infr2==0)
{
jd=13;
count=0;
while(infr2==0);
}
if(infl1==0)
{
jd=19;
count=0;
while(infl1==0);
}
if(infl2==0)
{
jd=17;
count=0;
while(infl2==0);
}
}
void main()
{
jd=15; //舵機初始角度為90度,自己定義為0度
count=0;
time_init();
while(1)
{
keyscan();
}
}
⑥ 怎麼控制舵機手爪張合、抬升
舵機相對直流電機來講,是一個精確位置控制的執行機構。通過脈沖的寬度來控制舵機的轉動角度,從而控制機械手的開合與抬升。
有關舵機的具體介紹請到億學通網站「資料下載」去下載:http://www.61mcu.com/?article-65.html 《Roboy機器人調試說明書》
該文件主要介紹了舵機控制,具體又分單個和多個舵機控制、調速演算法、PWM指令、機器人動作解析等內容,讓用戶對人形機器人的控制方法有初步了解。
⑦ 如果控制舵機
利用單片機PWM信號進行舵機控制
[日期:2005-10-15] 來源:今日電子 作者:北京交通大學 時瑋 [字體:大 中 小]
基於單片機的舵機控制方法具有簡單、精度高、成本低、體積小的特點,並可根據不同的舵機數量加以靈活應用。
在機器人機電控制系統中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統和航模中作為基本的輸出執行機構,其簡單的控制和輸出使得單片機系統非常容易與之介面。
舵機是一種位置伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。其工作原理是:控制信號由接收機的通道進入信號調制晶元,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶元決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
圖1 舵機的控制要求
舵機的控制信號是PWM信號,利用占空比的變化改變舵機的位置。一般舵機的控制要求如圖1所示。
單片機實現舵機轉角控制
可以使用FPGA、模擬電路、單片機來產生舵機的控制信號,但FPGA成本高且電路復雜。對於脈寬調制信號的脈寬變換,常用的一種方法是採用調制信號獲取有源濾波後的直流電壓,但是需要50Hz(周期是20ms)的信號,這對運放器件的選擇有較高要求,從電路體積和功耗考慮也不易採用。5mV以上的控制電壓的變化就會引起舵機的抖動,對於機載的測控系統而言,電源和其他器件的信號雜訊都遠大於5mV,所以濾波電路的精度難以達到舵機的控制精度要求。
也可以用單片機作為舵機的控制單元,使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將計算結果轉化為PWM信號輸出到舵機,由於單片機系統是一個數字系統,其控制信號的變化完全依靠硬體計數,所以受外界干擾較小,整個系統工作可靠。
單片機系統實現對舵機輸出轉角的控制,必須首先完成兩個任務:首先是產生基本的PWM周期信號,本設計是產生20ms的周期信號;其次是脈寬的調整,即單片機模擬PWM信號的輸出,並且調整占空比。
當系統中只需要實現一個舵機的控制,採用的控制方式是改變單片機的一個定時器中斷的初值,將20ms分為兩次中斷執行,一次短定時中斷和一次長定時中斷。這樣既節省了硬體電路,也減少了軟體開銷,控制系統工作效率和控制精度都很高。
具體的設計過程:例如想讓舵機轉向左極限的角度,它的正脈沖為2ms,則負脈沖為20ms-2ms=18ms,所以開始時在控制口發送高電平,然後設置定時器在2ms後發生中斷,中斷發生後,在中斷程序里將控制口改為低電平,並將中斷時間改為18ms,再過18ms進入下一次定時中斷,再將控制口改為高電平,並將定時器初值改為2ms,等待下次中斷到來,如此往復實現PWM信號輸出到舵機。用修改定時器中斷初值的方法巧妙形成了脈沖信號,調整時間段的寬度便可使伺服機靈活運動。
為保證軟體在定時中斷里採集其他信號,並且使發生PWM信號的程序不影響中斷程序的運行(如果這些程序所佔用時間過長,有可能會發生中斷程序還未結束,下次中斷又到來的後果),所以需要將採集信號的函數放在長定時中斷過程中執行,也就是說每經過兩次中斷執行一次這些程序,執行的周期還是20ms。軟體流程如圖2所示。
如圖2 產生PWM信號的軟體流程
如果系統中需要控制幾個舵機的准確轉動,可以用單片機和計數器進行脈沖計數產生PWM信號。
脈沖計數可以利用51單片機的內部計數器來實現,但是從軟體系統的穩定性和程序結構的合理性看,宜使用外部的計數器,還可以提高CPU的工作效率。實驗後從精度上考慮,對於FUTABA系列的接收機,當採用1MHz的外部晶振時,其控制電壓幅值的變化為0.6mV,而且不會出現誤差積累,可以滿足控制舵機的要求。最後考慮數字系統的離散誤差,經估算誤差的范圍在±0.3%內,所以採用單片機和8253、8254這樣的計數器晶元的PWM信號產生電路是可靠的。圖3是硬體連接圖。
圖3 PWA信號的計數和輸出電路
基於8253產生PWM信號的程序主要包括三方面內容:一是定義8253寄存器的地址,二是控制字的寫入,三是數據的寫入。軟體流程如圖4所示,具體代碼如下。
//關鍵程序及注釋:
//定時器T0中斷,向8253發送控制字和數據
void T0Int() interrupt 1
{
TH0 = 0xB1;
TL0 = 0xE0;
//20ms的時鍾基準
//先寫入控制字,再寫入計數值
SERVO0 = 0x30; //選擇計數器0,寫入控制字
PWM0 = BUF0L; //先寫低,後寫高
PWM0 = BUF0H;
SERVO1 = 0x70; //選擇計數器1,寫入控制字
PWM1 = BUF1L;
PWM1 = BUF1H;
SERVO2 = 0xB0; //選擇計數器2,寫入控制字
PWM2 = BUF2L;
PWM2 = BUF2H;
}
圖4 基於8253產生PWA信號的軟體流程
當系統的主要工作任務就是控制多舵機的工作,並且使用的舵機工作周期均為20ms時,要求硬體產生的多路PWM波的周期也相同。使用51單片機的內部定時器產生脈沖計數,一般工作正脈沖寬度小於周期的1/8,這樣可以在1個周期內分時啟動各路PWM波的上升沿,再利用定時器中斷T0確定各路PWM波的輸出寬度,定時器中斷T1控制20ms的基準時間。
第1次定時器中斷T0按20ms的 1/8設置初值,並設置輸出I/O口,第1次T0定時中斷響應後,將當前輸出I/O口對應的引腳輸出置高電平,設置該路輸出正脈沖寬度,並啟動第2次定時器中斷,輸出I/O口指向下一個輸出口。第2次定時器定時時間結束後,將當前輸出引腳置低電平,設置此中斷周期為20ms的1/8減去正脈沖的時間,此路PWM信號在該周期中輸出完畢,往復輸出。在每次循環的第16次(2×8=16)中斷實行關定時中斷T0的操作,最後就可以實現8路舵機控制信號的輸出。
也可以採用外部計數器進行多路舵機的控制,但是因為常見的8253、8254晶元都只有3個計數器,所以當系統需要產生多路PWM信號時,使用上述方法可以減少電路,降低成本,也可以達到較高的精度。調試時注意到由於程序中脈沖寬度的調整是靠調整定時器的初值,中斷程序也被分成了8個狀態周期,並且需要嚴格的周期循環,而且運行其他中斷程序代碼的時間需要嚴格把握。
在實際應用中,採用51單片機簡單方便地實現了舵機控制需要的PWM信號。對機器人舵機控制的測試表明,舵機控制系統工作穩定,PWM占空比 (0.5~2.5ms 的正脈沖寬度)和舵機的轉角(-90°~90°)線性度較好。
參考文獻
1 胡漢才.單片機原理及介面技術.清華大學出版社.1996
2 王時勝,姜建平.採用單片機實現PWM式D/A轉換技術.電子質量.2004
3 劉歌群.盧京潮.閆建國.薛堯舜.用單片機產生7路舵機控制PWM波的方法.機械與電子.2004
舵機是一種位置伺服的驅動器,適用於那些需要角度不斷變化並可以保持的控制系統。其工作原理是:控制信號由接收機的通道進入信號調制晶元,獲得直流偏置電壓。它內部有一個基準電路,產生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最後,電壓差的正負輸出到電機驅動晶元決定電機的正反轉。當電機轉速一定時,通過級聯減速齒輪帶動電位器旋轉,使得電壓差為0,電機停止轉動。
⑧ 舵機PID控制的參數該如何確定
你好。
可以通過計算得到一個參考值然後調整.
但是車模的安裝間隙太大,計算很難精確,所以仍然需要大量的參數調試.
經典的PID就是積分,微分,比例三個系數啊,看看自動控制的書,上面介紹很清楚的,也有演算法的,至於系數怎麼調,有計算的辦法,包括車模的負載,電機的驅動力,摩擦等,但是太麻煩啦,試湊法也很快,只要你能根據現象來及時調整參數。
⑨ 數字舵機與模擬舵機有什麼區別
數字舵機與模擬舵機有的區別:
1、在處理輸入信號的方式不同:數字舵機是由主要由馬達、減速齒輪、控制電路等組成,只需要發送一次PWM信號就能保持在規定的某個位置。
而模擬舵機是相同於傳統的舵機,是需要多次發送PWM信號才能夠保持在規定的位置上,實現對舵機的控制,按照規定的要求進行的速度進行轉動。
2、在控制電路上不同:數字舵機的控制電路比模擬舵機多了微處理器和晶振;因此兩者在控制電路的處理方式不同,同時數字舵機的性能方面上也不同於模擬舵機。
3、兩者的反應速度不同:模擬舵機是需要一個短促的動力脈沖,緊接著很長時間的停頓,因此並不能夠給馬達過多的激勵,來使其轉動。
數字舵機是新型時代出現的舵機,因此數字在反應速度方面與模擬舵機相比是由優勢的。因為數字舵機是擁有微處理器,所有數字舵機可以將動力脈沖發生到馬達之前,對輸入的信號進行的根據的設定參數進行處理。
⑩ 智能車 攝像頭 舵機控制 怎麼調用
感測器啊,就是攝像頭採集道路信息,通過演算法,得出來你的偏移量,我們之前是,先根據採集的道路信息辨識出賽道類型,s彎,大彎等,然後根本編碼器測得的自身速度和自身便宜賽道的位置,給出一個小車方向和速度的期望值,貌似就是一個加速度,而不是說給了他多少,他就達到多少,就是給他一個加速度的量,比如速度加的快與慢,方向轉的快慢,比如見到急彎了,自身速度還是很快,就得反轉電機一小段時間,把速度迅速降下來,設為0,有慣性是降不下來速度的