很早之前就想做一款無刷電機(jī)控制器,忙于工作一直沒有弄。最近有點(diǎn)時(shí)間畫板,打樣,焊接,調(diào)試,總算順利的轉(zhuǎn)起來。期間也遇到很多問題,上網(wǎng)查資料,自己量波形前前后后搞了差不多近一個(gè)月,(中間又出差一周)總算搞的差不多了,特意寫個(gè)總結(jié)。
板子外觀100*60mm 中等大小。DC 12V輸入,設(shè)計(jì)最大電流10A.(實(shí)際沒試過那么大的電機(jī),手頭的電機(jī)也就5 6A的樣子)硬件上可以切換有感(HALL)和無感(EMF)兩種模式,外部滑動(dòng)變阻器調(diào)速 預(yù)留有 PWM輸入、剎車、正反轉(zhuǎn)、USB和uart等接口。
先來說下原理無刷電機(jī)其實(shí)就是直流電機(jī),和傳統(tǒng)的DC電機(jī)是一樣的,只是把有刷的電滑環(huán)變成了電子換向器。
因?yàn)樯倭穗娀h(huán)的摩擦所以壽命靜音方面有了很大的提升,轉(zhuǎn)速也更高。
當(dāng)然難點(diǎn)就在如何獲取當(dāng)前轉(zhuǎn)子的位置好換相,所以又分為兩種有感和無感。
有感就是在電機(jī)端蓋的部位加裝霍爾傳感器分別相隔30度或60度。無感就是靠檢測(cè)懸浮相的感應(yīng)電動(dòng)勢(shì)過零點(diǎn)(后面在細(xì)講)。
當(dāng)然各有各的優(yōu)缺點(diǎn),有感在低速方面好,可以頻繁啟停換相。無感的結(jié)構(gòu)簡單成本低,航模上應(yīng)用居多。
先說有感,電源首先被分成了3個(gè)繞組U V W這個(gè)交流電還是有區(qū)別的。
它只是3個(gè)h橋按一定的順序?qū)?a href="http://www.1cnz.cn/analog/" target="_blank">模擬出來的,本質(zhì)還是直流電。電機(jī)靠hall位置按一定順序換相,轉(zhuǎn)速與電壓電流有關(guān)。這一點(diǎn)切記,不是換的越快轉(zhuǎn)的越快。(位置決定換相時(shí)刻,電壓決定轉(zhuǎn)速)一般調(diào)速就是調(diào)電壓,6步pwm方式是目前常用的。當(dāng)然后續(xù)還有foc等更好算法。
硬件部分網(wǎng)上基本都是成熟的方案。三相H橋,H橋一般有上臂mos和下臂mos組成,如果只是簡單的做演示上臂選pmos下臂選nmos控制電路簡單直接用單片機(jī)的io就可以驅(qū)動(dòng)。但是pmos低內(nèi)阻的價(jià)格高。功率上面很難做大。
這也就是為什么基本所有的商業(yè)控制器全是nmos的原因。
但是上臂用nmos存在一個(gè)問題vgs控制電壓大與vcc 4v以上才能完全導(dǎo)通。為了簡化電路采用了ir公司出的驅(qū)動(dòng)ic,它內(nèi)部有自舉升壓電路。外部僅需一個(gè)續(xù)流的二極管及儲(chǔ)能電容即可。
有感模式控制相對(duì)簡單,3個(gè)霍爾傳感器輸出一般都是數(shù)字信號(hào),分壓后直接接單片機(jī)io。
當(dāng)然控制方式上也就簡單很多,三個(gè)霍爾接中斷輸入,在中斷處理程序中根據(jù)組合狀態(tài)換相,程序上也沒什么復(fù)雜的。主程序 一直檢測(cè)ad值,改變pwm占空比,及電流保護(hù)等。
如下一個(gè)典型的換相代碼。Stm32 有兩個(gè)高級(jí)定時(shí)器tim1 tim8 可以輸出4組互補(bǔ)型pwm,還可以設(shè)定死區(qū)時(shí)間等,使用上非常方便。
switch(step)
{
case 4: //B+ C-
/* Next step: Step 2 Configuration -------------------------------------- */
TIM_CCxCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCx_Disable);
TIM_CCxNCmd(BLDC_TIMx,TIM_Channel_1,TIM_CCxN_Disable);
}
下圖為uvw三相的霍爾檢測(cè)到的電平及w相的波形。
下圖為 uvw三相波形及w相霍爾電平
下圖為 w相電平, w相上臂on 下臂pwm ,w相霍爾信號(hào)。
下圖為w相ir2304芯片輸出,上臂電壓可明顯看到已高于vcc,下臂為pwm信號(hào)
在說說無感模式,由于沒有了霍爾,電機(jī)無法知道轉(zhuǎn)子當(dāng)前的位置所以就無法換相,而感應(yīng)電動(dòng)勢(shì)也只有在轉(zhuǎn)起來之后才有,所以無感模式的啟動(dòng)是個(gè)難點(diǎn)。
一般方法都是分三段法:1 預(yù)定位 2 啟動(dòng) 3 進(jìn)入閉環(huán)反饋
正如網(wǎng)友說的江湖一層紙,戳破不值半文錢。
1. 預(yù)定為就是強(qiáng)制給某一相通電一段時(shí)間,讓電機(jī)定位到這個(gè)位置。占空比30-50%不要太大,可能會(huì)發(fā)熱。
2. 啟動(dòng),就是逐步的強(qiáng)制換相,當(dāng)然要有個(gè)加速的過程,使電機(jī)轉(zhuǎn)起來。
這個(gè)過程太慢會(huì)抖動(dòng)反轉(zhuǎn),太快會(huì)丟步。參數(shù)需要一點(diǎn)點(diǎn)試,有點(diǎn)像控制步進(jìn)電機(jī)。要能使電機(jī)轉(zhuǎn)的能產(chǎn)生電動(dòng)勢(shì),我也是參照的德國MK 電調(diào)的算法。
每次延時(shí)時(shí)間比上一次少1/25,形成一個(gè)加速的過程,直到電機(jī)完全轉(zhuǎn)起來產(chǎn)生足夠的電動(dòng)勢(shì)。
3. 閉環(huán)反饋控制換相跟有感差不多一樣。
speed_duty=30; //30% start
BLDC_PHASE_CHANGE(Step[Phase]); //固定一相
Delay_MS(200);
speed_duty=pwm;
timer = 300;
while(1)
{
for(i=0;i《timer; i++)
{
Delay_US(120); //等待
}
timer-= timer/25+1;
if(timer 《 25)
{
if(TEST_MANUELL)
{
timer = 25; //開環(huán)強(qiáng)制換向
}
else
{
bldc_dev.motor_state=RUN;
break;
}
}
Phase++;
Phase %= 6;
BLDC_PHASE_CHANGE(Step[Phase]); //
}
說到感應(yīng)電動(dòng)勢(shì)很多人不明白,先來說說電流,電機(jī)線圈的內(nèi)阻通常很小比如0.2歐,電機(jī)的電壓比如10v,按理來說電流100a為何電機(jī)不燒哪?
其實(shí)電機(jī)線圈在通電的一瞬間并不是完全導(dǎo)通的,因?yàn)橛蟹聪螂妱?dòng)感應(yīng)勢(shì)的存在,可能有-9.8v。10v-9.8v = 0.2v /0.2 = 1A.這樣算起來電流還合理。
在說說那個(gè)初中學(xué)習(xí)的法拉第 ,當(dāng)線圈切割磁場(chǎng)時(shí)會(huì)產(chǎn)生感應(yīng)電動(dòng)勢(shì),根據(jù)右手定則。。。。。。。。不懂的自行上網(wǎng)搜。
如下圖當(dāng)ac相在通電12v的情況下,靜止?fàn)顟B(tài)下正中間中性點(diǎn)理論為6v,但是轉(zhuǎn)起來就不一定了,因?yàn)閎相實(shí)際是在切割磁場(chǎng),是會(huì)產(chǎn)生電動(dòng)勢(shì)的。而電動(dòng)勢(shì)的大小正負(fù)取決與當(dāng)前在磁場(chǎng)ns極的位置。當(dāng)切割ns時(shí)為-1,切割sn時(shí)為1,平行時(shí)為0.
利用這一特性不就剛好可以獲得轉(zhuǎn)子的位置嗎?
首先檢測(cè)電路網(wǎng)上已經(jīng)一大很成熟了。
如下圖,當(dāng)然很多時(shí)候需要在4.7k對(duì)地的電阻上并一個(gè)100nf的電容,做一個(gè)低通濾波。也可以在軟件中做濾波處理。
我們所要做的就是檢測(cè)這個(gè)懸浮相的電動(dòng)勢(shì)過零點(diǎn)。
網(wǎng)上常用的兩種方法:1 單片機(jī)ad采集;2 比較器比較。我選擇了比較器lm339價(jià)格已經(jīng)很便宜了,在高速上比ad有明顯優(yōu)勢(shì),只要比較cin bin ain 與n點(diǎn)的壓差即可獲得零點(diǎn)。
理想很完美,現(xiàn)實(shí)很殘酷,實(shí)際中根本得不到這么完美的波形。
如下圖,這個(gè)已經(jīng)是比較好的了,還是有很多毛刺。這個(gè)給單片機(jī)中斷,肯定一大堆問題,嚴(yán)重的換錯(cuò)相燒mos管。
為什么會(huì)有這些毛刺哪,有些還挺有規(guī)律。
參考了網(wǎng)上的介紹,這中間還有一個(gè)叫消磁的東西。
原理不深究了,反正時(shí)間很短,軟件上做一個(gè)濾波消掉就可以了。
進(jìn)入中斷函數(shù)后做如下處理 ,定時(shí)器的中斷我暫時(shí)用的20us。
const unsigned int FilterNums = 0xff;
static unsigned int nums =0;
static unsigned int Queue_UStatus =0;
static unsigned int Queue_VStatus =0;
static unsigned int Queue_WStatus =0;
static unsigned char EMF_SVal =0;
unsigned char Filter_U_Status=0;
unsigned char Filter_V_Status=0;
unsigned char Filter_W_Status=0;
unsigned char EMF_Val=0;
unsigned int status_h;
unsigned int status_l;
unsigned int Delay30deg =0;
/* 清除中斷標(biāo)志位 */
if ( TIM_GetITStatus(TIM3 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);
至于網(wǎng)上說檢測(cè)到過零點(diǎn)后,延時(shí)30度換相,對(duì)電源效率有影響。我試了下,好像沒什么明顯的差異。也有人說在大功率的電機(jī)下不延時(shí)反而更平滑等等。真實(shí)怎樣有待各位實(shí)際實(shí)驗(yàn)了。
最后秀幾張轉(zhuǎn)起來的照片
硬盤電機(jī) 無感模式
電動(dòng)工具電機(jī) 有感模式
加裝散熱片的樣子
評(píng)論
查看更多