李 敏,田開坤
(湖北師范大學 物理與電子科學學院,湖北 黃石 435002)
直流電機是一種結(jié)構(gòu)簡單、轉(zhuǎn)速高、響應快的電機,在生活中有著非常廣泛的應用。但直流電機[1]力矩小、高轉(zhuǎn)速導致的低精度等缺陷,使得它多用于民用領域。相對于傳統(tǒng)的直流電機,齒輪減速同步電機[2]主要在普通電機上增加了減速箱,這樣不僅降低了轉(zhuǎn)速,還增加了扭力,使得電機在精度控制上能夠更加精確。這一優(yōu)勢能夠讓齒輪減速電機成為工業(yè)或軍工領域自動化機械設備不可或缺的動力傳動設備,特別是智能家居、醫(yī)療器械、機器人、航模等領域。所以,對齒輪減速電機的控制[2]算法的研究是十分必要的。
相對于傳統(tǒng)電機,齒輪減速電機[3]主要是在普通電機的基礎上,增加了減速箱,減速箱的減速原理是利用各級齒輪傳動來達到降速的目的。齒輪減速機一般用于低轉(zhuǎn)速大扭矩的傳動設備,把電動機、內(nèi)燃機等高速運轉(zhuǎn)的動力設備,通過減速機的輸入軸上齒數(shù)少的齒輪嚙合輸出軸上的大齒輪來達到減速的目的,減速電機上的大小齒輪的齒輪數(shù)之比,就是傳動比。
以偉盛的WS-32GX365OR減速電機為例,該電機有5個連接線:
紅線——電源正極
黑線——電源負極
白線——正反轉(zhuǎn)線
黃線——FG信號線(一圈6個信號)
藍線——PWM脈寬調(diào)制線(頻率為20~25kHz的PWM信號)

圖1 偉盛齒輪速電機實物圖
WS-32GX365OR電機主要通過調(diào)節(jié)輸入給PWM脈寬調(diào)制線20~25kHz的PWM信號[4]的占空比,從而改變電機的做功時間,達到對電機速度的精準調(diào)節(jié)。占空比越大,電機轉(zhuǎn)速越快,占空比越小,電機轉(zhuǎn)速越慢。所以,對電機角度的控制,主要在于對電機轉(zhuǎn)動速度的精準控制。

齒輪減速電機轉(zhuǎn)動一定的角度,整個過程必然有加速、減速階段,電機加速過程需要快,便于電機啟動;高轉(zhuǎn)速時間可控,減少慣性影響;減速過程盡量柔和,便于電機執(zhí)行下個一動作。整個運動過程的較為符合正弦曲線。因此,方案一輸入信號的控制過程是將PWM信號和時間形成曲線模擬成正弦曲線的過程。
相對于正弦曲線的調(diào)節(jié),線性調(diào)節(jié)更為簡單直接。設電機占空比的值為A,每一個PWM信號發(fā)送的時間為△t,在電機完成指定動作過程中,電機加速、勻速、減速需要的PWM[6]信號數(shù)分別為K1、K2、K3.共需要K個脈沖。則可以很容易地將電機的轉(zhuǎn)動過程進行分解控制。函數(shù)圖像如圖2所示:

圖2 電機轉(zhuǎn)動過程控制函數(shù)圖
加速階段:加速度:a1=A/(K1*△t);
減速階段:加速度:a2=A/(K3*△t);
通過調(diào)節(jié)K2更加靈活的調(diào)節(jié)電機控制信號高占空比帶來的電機高速運轉(zhuǎn)的時間,則電機轉(zhuǎn)動的路程S=1/2*(K1*△t*A)+ (K2*△t*A)+ 1/2*(K3*△t*A)。可以達到對電機PWM的精準調(diào)節(jié),從而精確地控制電機。
綜合考慮,選擇方案二。
本設計選用了STM32F103ZET6單片機作為主控芯片,該芯片帶4個片選靜態(tài)儲存器的控制器,多達4個16位定時器,每個定時器有多達4個用于輸入捕獲/輸出比較/PWM或脈沖計數(shù)的通道和增量編碼器輸入。本設計軟件程序主要讓單片機PD13引腳產(chǎn)生20kHz的脈沖信號,通過程序調(diào)節(jié)脈沖信號的占空比,調(diào)節(jié)電機的轉(zhuǎn)速,通過控制脈沖數(shù),從而達到對電機角度的控制,再用PG14引腳控制電機轉(zhuǎn)動的方向,控制功能框圖如圖3所示:

圖3 控制功能框圖
如2.3節(jié)知,延時時間,也就是△t的準確性直接決定了電機轉(zhuǎn)動角度是否精確。定時器中斷相對于延時函數(shù)的優(yōu)勢在于,定時器中斷能夠保證△t的準確性,而延時函數(shù)在運行過程一旦產(chǎn)生其他中斷,就不能保證△t為延時函數(shù)設定的時間,故本設計采用定時器中斷對電機的控制函數(shù)進行處理,中斷觸發(fā)時間為1ms,其中配置中斷定時器為TIM5,搶占優(yōu)先級為0,響應優(yōu)先級為1,具體實現(xiàn)代碼如下:
void NVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
#ifdef VECT_TAB_RAM
//向量表基地址選擇
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
//將0x20000000地址作為向量表基地址(RAM)
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
//將0x08000000地址作為向量表基地址(FLASH)
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//設置中斷組為2
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
//中斷事件為TIM5
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//搶占優(yōu)先級0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
//響應優(yōu)先級1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//允許中斷
NVIC_Init(&NVIC_InitStructure);
//根據(jù)指定參數(shù)初始化中斷寄存
}
由2.3節(jié)可知,齒輪減速電機轉(zhuǎn)動角度的精確性由兩點保證。一是每一個PWM信號產(chǎn)生相隔的時間△t;二是對每一個控制信號的占空比的控制。如圖4所示,核心控制函數(shù)具體內(nèi)容由定時器中斷函數(shù)進行處理,充分保證了每一個△t的時間都是精準的。核心函數(shù)主要是對2.3節(jié)思想的具體的程序?qū)崿F(xiàn),通過核心控制函數(shù)來控制電機轉(zhuǎn)動角度。
核心控制函數(shù)嵌套在定時器中斷函數(shù)里面,若定時器中斷產(chǎn)生,則運行控制函數(shù),中斷結(jié)束,運行主函數(shù)內(nèi)容,如圖4所示:

圖4 控制函數(shù)設計流程圖
下面是核心函數(shù)具體代碼實現(xiàn):
void Pwm_Set( uint16_t Time_Step,uint16_t Speed_Max ,uint16_t accelerator_step ,uint16_t uniform_step )
{
uint16_t Reducer_Step ,accelerator ,reducer; //設定減速脈沖數(shù)值、加速度、減速度
Reducer_Step =(Time_Step -accelerator_step -uniform_step);//計算減速步數(shù)
accelerator =(uint16_t ) (Speed_Max /accelerator_step); //計算加速度
reducer = (uint16_t)(Speed_Max /Reducer_Step); //計算減速度
if(step { Dutyfactor =Dutyfactor +accelerator; if(Dutyfactor>=Speed_Max ) Dutyfactor =Speed_Max; } if((step>=accelerator_step)&&(step<=(accelerator_step+uniform_step))) //勻速 { Dutyfactor = Speed_Max; } if((step >(accelerator_step +uniform_step)) &&(step <=Time_Step)) //減速 { Dutyfactor=(Dutyfactor -reducer); if(Dutyfactor<= 360) Dutyfactor =0; } while(step >Time_Step) //當電機轉(zhuǎn)動到指定位置,反向轉(zhuǎn)動 { step =0; Dutyfactor =0; direction++; direction = (direction %2); } if(direction == 0) GPIO_SetBits(GPIOG ,GPIO_Pin_14); if(direction == 1) GPIO_ResetBits(GPIOG ,GPIO_Pin_14); } Pwm_Set(uint16_t Time_Step,uint16_t Speed_Max ,uint16_t accelerator_step ,uint16_t uniform_step )函數(shù)為本設計算法的核心函數(shù),Time_Step為設定完成動作所需要的的總的脈沖數(shù),由上文2.3中可知,Time_Step相當于K,Speed_Max的值決定了電機最高轉(zhuǎn)速,Speed_Max最小值為0,電機最高占空比為0,最大值為3 600,此時電機的占空比為1. accelerator_step為電機完成指定動作加速達到最大轉(zhuǎn)速所需要的脈沖數(shù),相當與2.3的K1, uniform_step為勻速轉(zhuǎn)動的脈沖數(shù),相當于2.3中的K2. 在設定好函數(shù)的基本參數(shù)后,需要對電機控制的脈沖減速步數(shù)、電機的加速度、減速度進行計算。減速脈沖步數(shù)K3=K-K1-K2;加速度accelerator=(Speed_Max/accelerator_step); 減速度reducer=(uint16_t)(Speed_Max /Reducer_Step); Dutyfactor值決定了電機輸入信號的占空比。 計算完成后,程序分為3個階段對電機進行控制。 加速階段:在電機未達到最高速度時,Dutyfactor=Dutyfactor +accelerator;按照線性關(guān)系保持加速,達到或超過最大速度,保持設定最大速度。勻速階段:保持最高速度轉(zhuǎn)動,轉(zhuǎn)動時間可由uniform_step值確定。減速階段:Dutyfactor =(Dutyfactor-reducer);因為Dutyfactor的數(shù)據(jù)類型為無符號整型,所以防止數(shù)據(jù)小于0產(chǎn)生溢出,最小值不能為0,本設計采用的電機占空比小于10%時電機停止轉(zhuǎn)動,故最小值設置為360.本設計動作為電機進行指定角度正反轉(zhuǎn),故寫了while(step>Time_Step)條件下的內(nèi)容。 Step數(shù)值的設定用于電機每產(chǎn)生一個PWM信號所間隔的時間,相當于2.3節(jié)的△t.Step數(shù)值的處理放在中斷函數(shù)中,中斷產(chǎn)生的時間為1ms.程序源碼如下: void TIM5_IRQHandler(void) { if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //判斷中斷標志位是否為1;為1則中斷響應啦,0則沒有 { TIM_ClearITPendingBit(TIM5,TIM_IT_Update); //清除TIMx的中斷待處理位:TIM1 中斷源 step++; //每進入一次中斷,Step加一; Pwm_Set(250 ,1000,100 ,50); } } 通過以上程序,只需改變Pwm_Set()函數(shù)里面的參數(shù),就可以對用PWM信號控制的電機進行較為精準的動作控制。本設計調(diào)節(jié)的幾個基本角度的參數(shù)如表1所示: 表1 調(diào)節(jié)電機角度參數(shù)圖 本設計通過較為簡單的線性算法思想,只需要調(diào)節(jié)函數(shù)基本參數(shù),實現(xiàn)對電機的較為精確的角度控制,充分發(fā)揮齒輪減速電機大力矩和高集成度的優(yōu)勢,在單個電機動作的基礎上,若增加通信接口,可以實現(xiàn)用戶對多個電機的同時控制,有十分廣闊的應用前景。
4 總結(jié)與展望