一、什么是舵機?
產(chǎn)品參數(shù)
名稱:9克舵機180度
尺寸:23mm X 12.2mm X 29mm
重量:9克
扭矩:1.5kg/cm
工作電壓:4.2 - 6V
溫度范圍:0 - 55℃
運行速度:0.3s/60℃
死帶寬:10ms舵機有三條線定義:
- 暗灰:GND
- 紅色:VCC 4.8V - 7.2V
- 橙黃線:脈沖輸入
在機器人機電控制系統(tǒng)中,舵機控制效果是性能的重要影響因素。舵機可以在微機電系統(tǒng)和航模中作為基本的輸出執(zhí)行機構(gòu),其簡單的控制和輸出使得單片機系統(tǒng)非常容易與之接口。
舵機是一種位置(角度)伺服的驅(qū)動器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。目前在高檔遙控玩具,如航模,包括飛機模型,潛艇模型;遙控機器人中已經(jīng)使用得比較普遍。舵機是一種俗稱,其實是一種伺服馬達。
舵機是一種位置伺服的驅(qū)動器,適用于那些需要角度不斷變化并可以保持的控制系統(tǒng)。其工作原理是:控制信號由接收機的通道進入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅(qū)動芯片決定電機的正反轉(zhuǎn)。當電機轉(zhuǎn)速一定時,通過級聯(lián)減速齒輪帶動電位器旋轉(zhuǎn),使得電壓差為0,電機停止轉(zhuǎn)動。
二、工作原理
控制信號由接收機的通道進入信號調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個基準電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準信號,將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負輸出到電機驅(qū)動芯片決定電機的正反轉(zhuǎn)。當電機轉(zhuǎn)速一定時,通過級聯(lián)減速齒輪帶動電位器旋轉(zhuǎn),使得電壓差為0,電機停止轉(zhuǎn)動。當然我們可以不用去了解它的具體工作原理,知道它的控制原理就夠了。就象我們使用晶體管一樣,知道可以拿它來做開關(guān)管或放大管就行了,至于管內(nèi)的電子具體怎么流動是可以完全不用去考慮的。
舵機控制:
舵機的控制一般需要一個20ms左右的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內(nèi)的角度控制脈沖部分。以180度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
這只是一種參考數(shù)值,具體的參數(shù),請參見舵機的技術(shù)參數(shù)。
小型舵機的工作電壓一般為4.8V或6V,轉(zhuǎn)速也不是很快,一般為0.22/60度或0.18/60度,所以假如你更改角度控制脈沖的寬度太快時,舵機可能反應(yīng)不過來。如果需要更快速的反應(yīng),就需要更高的轉(zhuǎn)速了。
要精確的控制舵機,其實沒有那么容易,很多舵機的位置等級有1024個,那么,如果舵機的有效角度范圍為180度的話,其控制的角度精度是可以達到180/1024度約0.18度了,從時間上看其實要求的脈寬控制精度為2000/1024us約2us。如果你拿了個舵機,連控制精度為1度都達不到的話,而且還看到舵機在發(fā)抖。在這種情況下,只要舵機的電壓沒有抖動,那抖動的就是你的控制脈沖了。而這個脈沖為什么會抖動呢?當然和你選用的脈沖發(fā)生器有關(guān)了。
使用傳統(tǒng)單片機控制舵機的方案也有很多,多是利用定時器和中斷的方式來完成控制的,這樣的方式控制1個舵機還是相當有效的,但是隨著舵機數(shù)量的增加,也許控制起來就沒有那么方便而且可以達到約2微秒的脈寬控制精度了。
為什么FPPA就可以很方便地將脈寬的精度精確地控制在2微秒甚至2微秒一下呢。主要還是 delay memory這樣的具有創(chuàng)造性的指令發(fā)揮了功效。該指令的延時時間為數(shù)據(jù)單元中的立即數(shù)的值加1個指令周期(數(shù)據(jù)0出外,詳情請參見delay指令使用注意事項)因為是8位的數(shù)據(jù)存儲單元,所以memory中的數(shù)據(jù)為(0~255),記得前面有提過,舵機的角度級數(shù)一般為1024級,所以只用一個存儲空間來存儲延時參數(shù)好像還不夠用的,所以我們可以采用2個內(nèi)存單元來存放舵機的角度伺服參數(shù)了。所以這樣一來,我們可以采用這樣的軟件結(jié)構(gòu)了:
三、利用PWM控制
舵機的控制信號是PWM信號,利用占空比的變化改變舵機的位置。一般舵機的控制要求如下圖所示
單片機實現(xiàn)舵機轉(zhuǎn)角控制
可以使用FPGA、模擬電路、單片機來產(chǎn)生舵機的控制信號,但FPGA成本高且電路復(fù)雜。對于脈寬調(diào)制信號的脈寬變換,常用的一種方法是采用調(diào)制信號獲取有源濾波后的直流電壓,但是需要50Hz(周期是20ms)的信號,這對運放器件的選擇有較高要求,從電路體積和功耗考慮也不易采用。5mV以上的控制電壓的變化就會引起舵機的抖動,對于機載的測控系統(tǒng)而言,電源和其他器件的信號噪聲都遠大于5mV,所以濾波電路的精度難以達到舵機的控制精度要求。
也可以用單片機作為舵機的控制單元,使PWM信號的脈沖寬度實現(xiàn)微秒級的變化,從而提高舵機的轉(zhuǎn)角精度。單片機完成控制算法,再將計算結(jié)果轉(zhuǎn)化為PWM信號輸出到舵機,由于單片機系統(tǒng)是一個數(shù)字系統(tǒng),其控制信號的變化完全依靠硬件計數(shù),所以受外界干擾較小,整個系統(tǒng)工作可靠。
單片機系統(tǒng)實現(xiàn)對舵機輸出轉(zhuǎn)角的控制,必須首先完成兩個任務(wù):首先是產(chǎn)生基本的PWM周期信號,本設(shè)計是產(chǎn)生20ms的周期信號;其次是脈寬的調(diào)整,即單片機模擬PWM信號的輸出,并且調(diào)整占空比。
當系統(tǒng)中只需要實現(xiàn)一個舵機的控制,采用的控制方式是改變單片機的一個定時器中斷的初值,將20ms分為兩次中斷執(zhí)行,一次短定時中斷和一次長定時中斷。這樣既節(jié)省了硬件電路,也減少了軟件開銷,控制系統(tǒng)工作效率和控制精度都很高。
具體的設(shè)計過程:例如想讓舵機轉(zhuǎn)向左極限的角度,它的正脈沖為2ms,則負脈沖為20ms-2ms=18ms,所以開始時在控制口發(fā)送高電平,然后設(shè)置定時器在2ms后發(fā)生中斷,中斷發(fā)生后,在中斷程序里將控制口改為低電平,并將中斷時間改為18ms,再過18ms進入下一次定時中斷,再將控制口改為高電平,并將定時器初值改為2ms,等待下次中斷到來,如此往復(fù)實現(xiàn)PWM信號輸出到舵機。用修改定時器中斷初值的方法巧妙形成了脈沖信號,調(diào)整時間段的寬度便可使伺服機靈活運動。
為保證軟件在定時中斷里采集其他信號,并且使發(fā)生PWM信號的程序不影響中斷程序的運行(如果這些程序所占用時間過長,有可能會發(fā)生中斷程序還未結(jié)束,下次中斷又到來的后果),所以需要將采集信號的函數(shù)放在長定時中斷過程中執(zhí)行,也就是說每經(jīng)過兩次中斷執(zhí)行一次這些程序,執(zhí)行的周期還是20ms。軟件流程如下圖所示。
如果系統(tǒng)中需要控制幾個舵機的準確轉(zhuǎn)動,可以用單片機和計數(shù)器進行脈沖計數(shù)產(chǎn)生PWM信號。
脈沖計數(shù)可以利用單片機的內(nèi)部計數(shù)器來實現(xiàn),但是從軟件系統(tǒng)的穩(wěn)定性和程序結(jié)構(gòu)的合理性看,宜使用外部的計數(shù)器,還可以提高CPU的工作效率。實驗后從精度上考慮,對于FUTABA系列的接收機,當采用1MHz的外部晶振時,其控制電壓幅值的變化為0.6mV,而且不會出現(xiàn)誤差積累,可以滿足控制舵機的要求。最后考慮數(shù)字系統(tǒng)的離散誤差,經(jīng)估算誤差的范圍在±0.3%內(nèi),所以采用單片機和8253、8254這樣的計數(shù)器芯片的PWM信號產(chǎn)生電路是可靠的。下圖是硬件連接圖。
四、stm32舵機控制
1. PWM設(shè)計
TIM1 -> CH1 PA8文章來源:http://www.zghlxwxcb.cn/news/detail-628740.html
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外設(shè)時鐘使能
//設(shè)置該引腳為復(fù)用輸出功能,輸出TIM1 CH1的PWM脈沖波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個更新事件裝入活動的自動重裝載寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來作為TIMx時鐘頻率除數(shù)的預(yù)分頻值 不分頻
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數(shù)模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根據(jù) TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時間基數(shù)單位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時器模式:TIM脈沖寬度調(diào)制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = 0; //設(shè)置待裝入捕獲比較寄存器的脈沖值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根據(jù)TIM_OCInitStruct中指定的參數(shù)初始化外設(shè)TIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主輸出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1預(yù)裝載使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的預(yù)裝載寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
2.steering engine文章來源地址http://www.zghlxwxcb.cn/news/detail-628740.html
TIM1_PWM_Init(1999,719); // 72000000/720/2000=20ms
IM_SetCompare1(TIM1,1950); //對應(yīng)0度 2.5%
delay_ms(1000);
TIM_SetCompare1(TIM1, 1900); //對應(yīng)45度 5%
delay_ms(1000);
TIM_SetCompare1(TIM1, 1850); //對應(yīng)90度 7.5%
delay_ms(1000);
TIM_SetCompare1(TIM1, 1800); //對應(yīng)135度 10%
delay_ms(1000);
TIM_SetCompare1(TIM1,1750); //對應(yīng)180度 12.5%
delay_ms(1000);
到了這里,關(guān)于基于STM32 SG90 9g舵機控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!