伺服電動機是一種特殊的齒輪減速直流電動機,配備有用于控制電動機軸的旋轉方向以及位置的電子電路。由于伺服電機允許其輸出軸的精確角度定位,因此它們廣泛用于機器人技術和無線電控制的汽車,飛機和船只中,以控制其各個零件的運動。在本實驗課程中,我們將首先探討伺服電動機的組成及其工作原理,然后說明如何將其與PIC微控制器接口。
伺服電動機控制使用PIC微控制器
理論
伺服電動機(或伺服)是一個小盒子,其中裝有一個直流電動機,通過一系列齒輪連接至電動機的輸出軸(伺服臂)和控制該軸位置的電子電路。使用伺服的目的是實現對象的精確角度定位。
為了實現伺服功能,輸出軸的瞬時定位信息通過換能器反饋到控制電路。最簡單的方法是將電位計連接到輸出軸或齒輪系中的某個位置。控制電子設備將電位計的反饋信號(包含軸的當前位置)與控制輸入信號(包含軸的期望位置的信息)進行比較,并將實際值和期望值之間的差(稱為誤差信號)被放大并用于在減少或消除誤差所需的方向上驅動直流電動機。當輸出軸到達所需位置時,誤差為零。典型伺服電機的功能框圖如下所示。
伺服電機原理
伺服部件(來源:http://tutorial.cytron.com.my/2011/09/19/how-rc-servo-works/)
伺服是脈寬調制(PWM)信號,通常頻率為50 Hz。這意味著脈沖應每20ms重復一次。脈沖的寬度決定了輸出軸的角度位置。伺服器內部的電子電路將PWM信號轉換為成比例的輸出電壓,并將其與電位計的反饋電壓進行比較。如果兩者之間存在差異,則控制電路會沿適當的方向驅動電動機,直到差異變為零為止。脈沖寬度的典型值在1.0到2.0毫秒(ms)的范圍內。對于標準伺服器,脈沖寬度在1.0毫秒至1.5毫秒之間會使伺服器順時針旋轉(CW),在1.5毫秒至2.0毫秒之間使伺服器能夠逆時針旋轉(CCW),而1.5毫秒脈沖寬度會使伺服電動機轉向它的中心。但是,這些值可能會因電機的品牌和制造而有所不同。建議閱讀伺服器的數據表,以找到將伺服器定位在不同角度所需的脈沖寬度的真實值。
大多數伺服器旋轉180°。然而。有些可以旋轉360°或更大角度。 Servos由于其精確的角度定位而被廣泛用作機器人手臂中的活動關節。他們還發現了在無線電(RC)玩具中的應用。例如,在RC汽車中,它們用于轉向機構,在RC船中用于控制舵。
伺服電機具有三根電線:兩根用于電源(Vcc和地面),第三根用于電源。 Vcc線通常是紅色的,接地線是黑色或棕色的。控制信號線為白色,黃色或橙色。本實驗中使用的伺服電機來自iCircuit技術,并具有分別用于Vcc,Gnd和控制信號的紅色,棕色和黃色導線。它以5.0 V電源供電,并提供180°的角度旋轉
典型的伺服電機
不同角度位置的伺服定時信息
伺服臂的不同角度位置
電路
此電路的電路圖實驗如下所示。伺服器的控制輸入來自PIC16F628A微控制器的RB1引腳,該PIC16F628A微控制器使用外部陶瓷諧振器以4.0 MHz的頻率工作。輕觸開關連接到RB0引腳,以提供用戶輸入來控制伺服臂的位置。該實驗的操作部分在下面的軟件部分中進行介紹。
用于伺服電機控制演示的電路圖
電路板上的電路設置
軟件
PIC16F628A的固件是用用于PIC編譯器的MikroC Pro編寫的。 Timer0模塊用作帶預分頻器1:256的定時器,以在兩個連續的PWM脈沖之間產生大約20 ms的間隔。請記住,時鐘頻率為4.0 MHz,這導致1 s的機器周期,從而簡化了使用Timer0計算延遲的數學運算。 MikroC提供了一個內置的庫函數Delay_Cyc(),該函數生成可變的時鐘周期延遲。此功能用于將控制脈沖的寬度從0.7毫秒更改為2.3毫秒。當電路第一次上電或復位時,在RB1引腳上連續產生脈沖寬度為0.7 ms的50 Hz PWM信號。該控制信號一直沿順時針方向將伺服臂一直移動到末端,該末端被視為0角位置。按下連接到RB0引腳的輕觸開關時,脈沖寬度增加0.2 ms,這將使軸逆時針(CCW)旋轉大約22.5°。因此,每次按下開關,脈沖寬度都會增加0.2 ms,并且軸將進一步沿CCW方向旋轉。連續按下開關8次后,脈沖寬度變為2.3 ms,軸到達另一端(180°角位置)。在第9次按下時,脈沖寬度被重置為0.7 ms,并且電機軸沿順時針方向旋轉,直到回到0角位置。在程序中,變量“ i”存儲脈沖寬度信息(脈沖寬度= i * 10 * 10微秒),并以2為步長從7變為23。當i = 7時,脈沖寬度為7 * 10 * 10 = 700微秒(0.7 ms),當i = 23時,寬度為2.3 ms。
/*
Lab 21: Servo motor Control using PIC16F628A
MCU: PIC16F628A running at 4.0 MHz, MCLR enabled, WDT is OFF, Brown Out Detect
disabled
Written by: Rajendra Bhatt (www.embedded-lab.com)
2012/03/29
Description: User input switch is connected to RB0 and Servo Control signal
is generated from RB1 pin.
*/
sbit SW1 at RB0_bit;
sbit Control at RB1_bit;
unsigned short i=7, delay;
void interrupt() {
delay = i*10;
Control = 1;
Delay_Cyc(delay); // Generates delay equal to 10*delay clock cycles
Control = 0;
TMR0 = 180; // TMR0 returns to its initial value
INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur
}
void main() {
CMCON = 0x07; // Disable Comparators
TRISB = 0b00000001;
PORTB = 0;
OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0
TMR0 = 180; // Timer T0 counts from 180 to 255 to create ~20 ms period
INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts
do{
if(!SW1){ // Change pulse width when Switch is pressed
Delay_ms(300);
i = i+2;
if(i》23) i=7;
}
}while(1);
}
下載完整的源文件和HEX文件
輸出
將HEX文件加載到PIC16F628A微控制器之后,您可以觀察伺服控制器的運行情況。觀看底部的演示視頻,以查看該實驗的輸出。
責任編輯:wv
-
微控制器
+關注
關注
48文章
7553瀏覽量
151426 -
伺服電動機
+關注
關注
0文章
50瀏覽量
3226
發布評論請先 登錄
相關推薦
評論