一、內容
1.無傳感無刷直流馬達控制原理
2.無傳感無刷直流馬達開發板部份硬件電路剖析
3.無傳感無刷直流馬達部份代碼剖析與運行結果
二、知識點1.無傳感無刷直流馬達控制原理1.1無傳感無刷直流馬達相比于有傳感的優勢:
①硬件上,降低了馬達本身的質量和規格,不易安裝與維護,且霍爾傳感本身存在著一定的磁不敏感區;
②應用上,霍爾傳感安裝的精度和靈敏度會影響馬達的運行性能,且傳感不能挺好的適應惡劣的工作環境。
1.2反電動勢法——檢測定子位置信息進行換相
直流電動機最初起動時,電樞定子構建一個磁場,集電極電壓形成另一個磁場,兩磁場互相作用,起動電動機運行。定子定子在磁場中旋轉,因而形成發電機效應。實際上旋轉定子形成一個感應電動勢,與定子電流極性相反,這些自感應電動勢稱為反電動勢。同理,在無刷直流馬達中,受定子定子形成的合成磁場的作用,定子順著一定的方向連續轉動。馬達繞組上放有電刷定子。因而,定子一旦旋轉,都會在空間產生導體切割磁力線的情況。依據電磁感應定理可知,導體切割磁力線會在導體中形成感應電勢。所以,在定子旋轉的時侯才會在轉子定子中形成感應電勢,即反電動勢。
同有傳感無刷直流馬達一樣,無傳感無刷直流馬達也采用六步換相控制,每一個換相周期,將有一相定子處于不導通狀態。因而通過測量第單相反電動勢訊號,可測量到定子微極在該定子經過的時刻。反電動勢檢查原理圖右圖所示反電動勢,在AB定子通電時應檢查C相反電動勢電流。
1.3反電動勢法過零點檢查
對于120°有傳感無刷直流馬達,其反電勢和傳感訊號右圖所示,須要注意的點如下:
①有傳感和無傳感無刷直流馬達的控制都采用六步換相控制;
②使用無傳感無刷直流馬達控制,當測量到過零點時,須要提早30個角度再換相。
1.4無傳感無刷直流馬達三段式啟動
無傳感無刷直流馬達須要采用三段式啟動的緣由:
①硬件上,對于小功率馬達,直接上電啟動時電壓是特別大的,容易造成硬件電路漏電或則降低電子元件的壽命;電壓過大容易造成過熱去磁問題,容易造成馬達啟動失敗;啟動過快就會造成機械負載的沖擊等。
②應用上,電樞定子的反電動勢同馬達的怠速成反比,也就是說,當馬達未上電時,未能按照反電動勢檢查定子的狀態,也就難以達到馬達的控制療效。
三段式啟動包括:定子預定位、加速和運動狀態轉換三步反電動勢,三段式啟動的用處是,可以是馬達達到可控療效,提升馬達控制的穩定性,同時也是對馬達本身的一種合理應用,降低其使用周期。下邊是對三段式啟動的具體剖析:
1)定子預定位
剛開始馬達在靜止情況下,并且開始不曉得定子的情況下,可以進行通過對單相馬達的其中兩相通電,等待一段時間,之后再對馬達相鄰狀態的兩相通電,此時定子會轉動,但是會轉動到當前兩相合成磁場的所在的位置。注意預定位中pwm以及的通電的等待時間,須要依照實際情況選定。
2)加速運行階段
pwm的開始信噪比,應當從克服外界負載的最小扭力開始,逐步提升,pwm信噪比的減小作用似乎等效于加在通電兩相的電流減小,逐步提升馬達換相的頻度,此時馬達才會加速上去。常見加速有三種形式,恒頻升壓法恒壓升頻法,升頻升壓法。
①恒頻升壓法:馬達換相頻度不變,馬達供電的電流逐步提升,借此達到加速療效。
②恒壓升頻法:馬達供電的電流不變,馬達換相時間逐步提升,借此達到加速療效。
③升壓升頻法:馬達供電的電流與馬達換相頻度都漸漸進行提升,達到加速療效。
升壓升頻法實現上去相比上面兩種方式實現較為復雜。須要協調好電流與頻度的遞增,換相信號的頻度須要依照實際馬達的馬達極對數以及馬達相內阻等其他原生參數確定。換相頻度太低,馬達加速不上去;換相頻度太高,馬達運行上去容易失步,造成加速失敗。
3)運動狀態轉換——開環切入閉環
當馬達加速到一定速率,最好直至當前速率下馬達反電動勢要呈矩形波,可以用示波器觀察。當反電動勢測量通過ADC連續穩定采集到3個過零點的情況,說明當前馬達的運行速率達到無位置傳感的運行要求。此時可以切入到閉環狀態。當注意的一個細節是,相同pwm信噪比馬達在開環時對應的速率與步入閉環時對應的速率相差越小,切換成功的概率越大,并且切換的也越平滑。
值得注意的是,馬達從開環切入閉環的過程是馬達啟動最為困難的一個階段,難度系數比較高。并且這個環節是馬達啟動最重要的一個階段,它決定著馬達是否能步入旁邊的閉環操作。
1.5PID控制原理
將誤差的比列()、積分()和微分()通過線性組合構成控制量,用這一控制量對被控對象進行控制,這樣的控制器稱PID控制器。在模擬控制系統中,控制器常用的控制規律是PID控制。右圖所示是一個小功率直流馬達的調速原理圖。給定速率與實際怠速進行比較,其差值經過PID控制器調整后輸出電流控制訊號,經過功率放大后,驅動直流電動機改變其怠速。
常規的模擬PID控制系統原理框圖右圖所示。該系統由模擬PID控制器和被控對象組成。圖中,r(t)是給定值,y(t)是系統的實際輸出值,給定值與實際輸出值構成控制誤差e(t),有:e(t)=r(t)-y(t)。
e(t)作為PID控制的輸入,u(t)作為PID控制器的輸出和被控對象的輸入。所以模擬PID控制器的控制規律為:
u(t)=Kp[e(t)+1/Ti∫0te(t)dt+Td*de(t)/dt]
其中:Kp為控制器的比列系數、Ti控制器的積分時間,俗稱積分系數、Td控制器的微分時間,俗稱微分系數。
PID控制系統物理表達式如下:
①比例部份的物理式表示是:Kp*e(t)
②積分部份的物理式表示是:Kp/Ti∫0te(t)dt
③微分部份的物理式表示是:(t)/dt
2.無傳感無刷直流馬達開發板部份硬件電路剖析(無霍爾傳感)2.1電源及變壓部份
首先,借助變壓器使220V交流電轉化為24V直流電,通入馬達開發板,按照馬達開發板上各個模塊的電流需求(如芯片、按鍵模塊須要3.3V供電),通過系列芯片,以及芯片,依次實現直流電源24V到15V、15V到12V、12V到5V、5V到3.3V的轉換,達到供電療效。其中,各個電流轉換電路原理圖右圖所示。
2.2主控芯片
馬達開發板所使用的主控芯片為,其引腳為64個,flash為128kb。主控芯片原理圖右圖所示,圖中包括晶振、復位鍵、程序下載口等部件。另外,主控芯片的部份引腳與相對應的模塊相聯接,控制著馬達的運動、運動狀態監測等功能。
2.3反電動勢法馬達控制電路
同有傳感無刷直流馬達相比,無傳感無刷直流馬達的控制電路只多了一個狀態數字取樣模塊,即右圖中紅框部份。狀態數字取樣模塊是反電動勢法馬達控制的核心,它的主要作用在于測量定子的位置信息,并通過PB11/口返回給主控芯片,使其對其運動狀態進行控制,因而取代傳感的工作療效。
3.無傳感無刷直流馬達部份代碼剖析與運行結果3.1主函數代碼及注釋
首先對中斷、時鐘、IO口、A/D端口、按鍵及定時器等模塊進行初始化,并給相關參數賦終值,在如下主程序中,實現的功能是通過判定key1的狀態,控制馬達轉動,判定key2的狀態,控制馬達停止,其對應的主控芯片端口為PC5、PC15,另外,通過調用()函數,控制馬達轉動的加減速。馬達轉動實物圖右圖所示。
int main (void )
{
//ClockDir=0;
ClockDir=1;
SystemInit();
NVIC_Configuration();//中斷設置
RCC_GetClocksFreq(&RCC_Clocks);
GPIO_Configuration();//GPIO 初始化
ADC_Configuration();//模擬端口初始化
TIM_Configuration2();//Tim1定時器初始化
BLDC_Init();
KEY_Init();
ShowMenu_init();
//My_PWM=1250;
My_PWM=250;
BEMF_Cnt = 0;
BEMF_ADC_Cnt = 0;
MotorA.Step = 0;
ucMotorStep=MotorA.Step;
ucMotorAD=0;
//BLDC_SwitchStep();//采用6步法驅動BLDC
MENOFF();
MENON();//芯片端使能
LcdReset();
fgDispMode=1;
while(1)
{
if(KEY_Read(KEY1))
{
//CoTickDelay(5);
Delay1Us();
if(KEY_Read(KEY1))
{
//BLDC_Init();
My_PWM=250;
TIM_Configuration1();
TIM_Configuration2();//Tim1定時器初始化
}
}
if(KEY_Read(KEY2))
{
//CoTickDelay(5);
Delay1Us();
if(KEY_Read(KEY2))
{
BLDC_Stop();
if(ucT10S>=1) //每秒的事件處理
{
My_PWM=250;
if(ClockDir==1)ClockDir=0;
else ClockDir=1;
ucT10S=0;
}
}
}
Timeproc();
}
}
3.2反電動勢法相關代碼
unsigned long
BEMF(void)
{
// unsigned short VoltBEMF = 0;
unsigned long dir = 0;
if (ucMotorStep!=MotorA.Step)
{
ucMotorStep=MotorA.Step;
ucMotorAD=0;
}
switch (MotorA.Step)
{
case 0:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[2]; dir = 1;/*下降*/ break;
case 1:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[1]; break;
case 2:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[0]; dir = 1; break;
case 3:VoltBEMF[ucMotorAD] = ADCConvertedValue_2[2]; break;
case 4:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[1]; dir = 1; break;
case 5:VoltBEMF[ucMotorAD] =ADCConvertedValue_2[0]; break;
default: break;
}
if(ucMotorAD<2)
{
ucMotorAD++;
}
else
{
//ucMotorAD=0;
if (((dir ==1)&&(ClockDir==0))||((dir == 0)&&(ClockDir==1))) //下降,PWM-OFF檢測BEMF,過零點標志是BEMF電壓為0
{
if((VoltBEMF[0]>0)&&(VoltBEMF[1]==0))
{
usOZTimeS++;
return 1;
}
}
else
{
if((VoltBEMF[0]==0)&&(VoltBEMF[1]>0))
{
usOZTimeS++;
return 1;
}
}
}
VoltBEMF[0]=VoltBEMF[1];
VoltBEMF[1]=VoltBEMF[2];
return 0;
}
3.3馬達加減速相關代碼
void Timeproc()
{
if(fgT10Ms ==0)
{
return;
}
//SendFrame();
fgT10Ms = 0;
ucT100ms++;
ucT1S++;
if(ucT100ms>=10)
{
if((My_PWM<1000)&&(flag== 0))
{
My_PWM=My_PWM+10;
}
if(My_PWM>=1000)flag = 1;
if(My_PWM>=200)
{
if(flag== 1) My_PWM=My_PWM-10;
}
else
{
flag= 0;
}
MENON();
ucT100ms=0;
}
if(ucT1S>=100) //每秒的事件處理
{
speed_1=My_PWM;//計算速度
//aim_speed=0;
ShowMenuMain();//菜單顯示
//ShowMenu_init();
ucT10S++;
ucT1S=0;
}
if(ucT10S>=10) //每秒的事件處理
{
//if(flag11== 1)flag12 = 1;
//ShowMenuMain();//菜單顯示
//ShowMenu_init();
ucT10S=0;
}
}
三、總結
這半個月以來,主要是在學習了有傳感無刷直流馬達相關內容的基礎上,對無傳感無刷直流馬達相關內容進行一個學習。其中,學習的成果主要是對無傳感無刷直流馬達控制原理有了較為深刻認識,而且比較了有、無傳感在馬達控制上的不同,加深了硬件原理圖部份的理解,并且在程序方面,還沒有完全吃透,須要進一步的學習。