最近幾年國內機器人開始起步發展,很多高校、中小學都開始進行機器人技術教學。小型的機器人、模塊化的機器人、組件式的機器人是教學機器人的首選。在這些機器人產品中,舵機是很關鍵,使用較多的部件。根據控制方式,舵機應該稱為微型伺服馬達。早期在模型上使用最多,主要用于控制模型的舵面,所以俗稱舵機。舵機接受一個簡單的控制指令就可以自動轉動到一個比較精確的角度,所以非常適合在關節型機器人產品使用。
1.舵機的結構
舵機簡單的說就是集成了直流電機、電機控制器和減速器等,并封裝在一個便于安裝的外殼里的伺服單元。能夠利用簡單的輸入信號比較精確的轉動給定角度的電機系統。舵機安裝了一個電位器(或其它角度傳感器)檢測輸出軸轉動角度,控制板根據電位器的信息能比較精確的控制和保持輸出軸的角度。這樣的直流電機控制方式叫閉環控制,所以舵機更準確的說是伺服馬達,英文servo。
舵機的主體結構如圖所示,主要有幾個部分:外殼、減速齒輪組、電機、電位器、控制電路。簡單的工作原理是控制電路接收信號源的控制信號,并驅動電機轉動;齒輪組將電機的速度成大倍數縮小,并將電機的輸出扭矩放大響應倍數,然后輸出;電位器和齒輪組的末級一起轉動,測量舵機軸轉動角度;電路板檢測并根據電位器判斷舵機轉動角度,然后控制舵機轉動到目標角度或保持在目標角度。舵機的外殼一般是塑料的,特殊的舵機可能會有金屬鋁合金外殼。金屬外殼能夠提供更好的散熱,可以讓舵機里面的電機運行在更高功率下,以提供更高的扭矩輸出。金屬外殼也可以提供更牢固的固定位置。舵機的齒輪箱有塑料齒輪、混合齒輪、金屬齒輪的差別。塑料齒輪成本低,噪音小,但強度較低;金屬齒輪強度高,但成本高,在裝配精度一般的情況下會有很大的噪音。小扭矩舵機、微舵、扭矩大但功率密度小的舵機一般都用塑料齒輪,如Futaba3003,輝盛的9g微舵。金屬齒輪一般用于功率密度較高的舵機上,比如輝盛的MG995舵機,在和3003一樣體積的情況下卻能提供13KG的扭矩。Hitec甚至用鈦合金作為齒輪材料,其高強度能保證3003大小的舵機能提供20幾公斤的扭矩。混合齒輪在金屬齒輪和塑料齒輪間做了折中,在電機輸出減速箱扭矩不大的部位,用塑料齒輪。
2.舵機的規格和選型
舵機轉速
轉速由舵機無負載的情況下轉過60°角所需時間來衡量,常見舵機的速度一般在0.11s/60°-0.21s/60°之間。
舵機扭矩
舵機扭矩的單位是KG·CM,這是一個扭矩單位。可以理解為在舵盤上距舵機軸中心水平距離1CM處,舵機能夠帶動的物體重量。
工作電壓
廠商提供的速度、轉矩數據和測試電壓有關,在4.8V和6V兩種測試電壓下這兩個參數有比較大的差別。如MG995在4.8V時速度為0.17秒,在6.0V時速度為0.13秒。舵機的工作電壓對性能有重大的影響,舵機推薦的電壓一般都是4.8V或6V。當然,有的舵機可以在7V以上工作,比如12V的舵機也不少。具體更加較高的電壓可以提高電機的速度和扭矩。選擇舵機還需要看我們的控制板所能提供的電壓。
尺寸重量和材質
舵機的功率(速度×轉矩)和舵機的尺寸比值可以理解為該舵機的功率密度,一般同樣品牌的舵機,功率密度大的價格高。塑料齒輪的舵機在超出極限負荷的條件下使用可能會崩齒,金屬齒輪的舵機則可能會電機過熱損毀或外殼變形。所以材質的選擇并沒有絕對的傾向,關鍵是將舵機使用在設計規格之內。用戶一般都對金屬制的物品比較信賴,齒輪箱期望選擇全金屬的,舵盤期望選擇金屬舵盤。但需要注意的是,金屬齒輪箱在長時間過載下也不會損毀,最后卻是電機過熱損壞或外殼變形,而這樣的損壞是致命的,不可修復的。塑料出軸的舵機如果使用金屬舵盤是很危險的,舵盤和舵機軸在相互扭轉過程中,金屬舵盤不會磨損,舵機軸會在一段時間后變得光禿,導致舵機完全不能使用。綜上,選擇舵機需要在計算自己所需扭矩和速度,并確定使用電壓的條件下,選擇有150%左右甚至更大扭矩富余的舵機。
3.舵機的工作原理
舵機是一個微型的伺服控制系統,具體的控制原理可以用下圖表示:
工作原理是控制電路接收信號源的控制脈沖,并驅動電機轉動;齒輪組將電機的速度成大倍數縮小,并將電機的輸出扭矩放大響應倍數,然后輸出;電位器和齒輪組的末級一起轉動,測量舵機軸轉動角度;電路板檢測并根據電位器判斷舵機轉動角度,然后控制舵機轉動到目標角度或保持在目標角度。模擬舵機需要一個外部控制器(遙控器的接收機或者單片機)產生脈寬調制信號來告訴舵機轉動角度,脈沖寬度是舵機控制器所需的編碼信息。舵機的控制脈沖周期20ms,脈寬從0.5ms-2.5ms,分別對應-90度到+90度的位置(對于180°舵機)。??
舵機的控制一般需要一個20ms的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms范圍內的角度控制脈沖部分。以180度角度舵機為例,那么對應的控制關系是這樣的:
0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 如下圖所示:
需要解釋的是舵機原來主要用在飛機、汽車、船只模型上,作為方向舵的調節和控制裝置。所以,一般的轉動范圍是45°、60°或者90°,這時候脈沖寬變一般只有1ms-2ms之間(比如你做一個遙控小車,用舵機控制方向,那么舵機轉的角度肯定不是180度,對吧。因為你見過你開的車方向能轉180度嗎?)。而后舵機開始在機器人上得到大幅度的運用,轉動的角度也在根據機器人關節的需要增加到-90°至90°之間,甚至還有-135°至135°之間,脈沖寬度也隨之有了變化。對于機器人控制而言,我們一般通過單片機產生PWM信號控制舵機。
4.STM32控制舵機代碼
0.5ms---------0度 0.6ms---------9度 0.7ms---------18度 0.8ms---------27度 0.9ms---------36度 1.0ms---------45度 1.1ms---------54度 1.2ms---------63度 1.3ms---------72度 1.4ms---------81度 1.5ms---------90度 1.6ms---------99度 1.7ms---------108度 1.8ms---------117度 1.9ms---------126度 2.0ms---------135度 2.1ms---------144度 2.2ms---------153度 2.3ms---------162度 2.4ms---------171度 2.5ms---------180度 |/ ---|---/ |/ |/ |/ -------------------------------------------------------------- 20ms的時基脈沖,如果想讓舵機轉63度,就應該發生一個高電平為1.2ms, 周期為20ms的方波,duty=1.2/20=6%,而定時器自動重裝載寄存器arr的值 為1000,所以令duty=60,時占空比才為60/1000=6%. 20ms的時基脈沖,如果想讓舵機轉90度,就應該發生一個高電平為1.5ms, 周期為20ms的方波,duty=1.5/20=7.5%,而定時器自動重裝載寄存器arr的值 為1000,所以令duty=75,時占空比才為75/1000=7.5%. 20ms的時基脈沖,如果想讓舵機轉126度,就應該發生一個高電平為1.9ms, 周期為20ms的方波,duty=1.9/20=9.5%,而定時器自動重裝載寄存器arr的值 為1000,所以令duty=95,時占空比才為95/1000=9.5%. ----------------------------------------------------------------- voidSERVO_Init(void) { GPIO_InitTypeDefGPIO_InitStruct; TIM_TimeBaseInitTypeDefTIM_TimeStructure; TIM_OCInitTypeDefTIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//配置為復用推挽輸出 GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStruct); TIM_TimeStructure.TIM_Period=1000;//1000自動重裝載寄存器的值,周期為50000Hz/1000=50Hz,即輸出PWM波形的頻率為20ms。 TIM_TimeStructure.TIM_Prescaler=1440-1;;// 1400時鐘預分頻系數為3600,72 000000Hz/1400=50000Hz =50KHZ。 TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM3,&TIM_TimeStructure); TIM_ARRPreloadConfig(TIM3,ENABLE);//使能ARR預裝載寄存器(影子寄存器) TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse=0;//占空比大小 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OC2Init(TIM3,&TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable); TIM_Cmd(TIM3,ENABLE); TIM_CtrlPWMOutputs(TIM3,ENABLE); } //舵機角度控制 voidSERVO_Angle_Control(uint16_tCompare2) { TIM_SetCompare2(TIM3,Compare2);//設置通道2為可變的pwm }
配置號上面的程序,如果你想讓舵機旋轉90度,只需要在你程序的某個位置放上這句話就可以了
SERVO_Angle_Control(75);//舵機旋轉90度
原因就是20ms的時基脈沖,如果想讓舵機轉90度,就應該發生一個高電平為1.5ms,周期為20ms的方波,duty=1.5/20=7.5% ,而定時器自動重裝載寄存器arr的值為 1000 ,所以令duty=75,時占空比才為75/1000=7.5%。以此類推,你想讓舵機轉多大的角度按照這個方法設置就行了。
責任編輯:xj
原文標題:STM32驅動舵機原理和實現
文章出處:【微信公眾號:玩轉單片機】歡迎添加關注!文章轉載請注明出處。
-
機器人
+關注
關注
210文章
28212瀏覽量
206554 -
STM32
+關注
關注
2266文章
10873瀏覽量
354832 -
舵機
+關注
關注
17文章
265瀏覽量
40955
原文標題:STM32驅動舵機原理和實現
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論