01
方案概述
本方案采用CW32F030C8T6作為主控芯片,采用無(wú)感方波控制算法控制無(wú)刷直流空心杯電機(jī)。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有豐富的片上外設(shè)資源,可以適合用于電機(jī)控制。無(wú)感方波控制算法是一種簡(jiǎn)單有效的電機(jī)控制算法,不需要使用霍爾傳感器,可以降低硬件成本。 本次采用的電機(jī)驅(qū)動(dòng)板仍然為CW32_BLDC_EVA V5開(kāi)發(fā)板,具體開(kāi)發(fā)板的信息可以翻看上一節(jié)《基于CW32的無(wú)刷空心杯電機(jī)有感控制驅(qū)動(dòng)方案》,采用的空心杯電機(jī)與上一節(jié)有所不同,這次使用的空心杯電機(jī)的額定電壓為 24 V。 由于本次采用無(wú)感方案,所以只需要將 U、V、W三相電源接上即可,并且三相的順序并無(wú)強(qiáng)制要求,下面我們重心將放在對(duì)于無(wú)感方波控制的原理部分。
02
無(wú)感方波控制原理
無(wú)感方波控制(Sensorless Square Wave Control)是一種用于無(wú)刷直流電機(jī)(BLDC)驅(qū)動(dòng)的控制方法。與傳統(tǒng)的有感控制方法相比,無(wú)感方波控制不需要使用位置或速度傳感器來(lái)反饋電機(jī)狀態(tài),而是通過(guò)檢測(cè)電機(jī)自身的懸空相反電動(dòng)勢(shì)變化(Back Electromotive Force,簡(jiǎn)稱(chēng)BEMF)來(lái)實(shí)現(xiàn)控制。 在無(wú)感方波控制中,通過(guò)檢測(cè)電機(jī)的懸空相電壓的過(guò)零點(diǎn),可以推斷出電機(jī)轉(zhuǎn)子的位置,根據(jù)轉(zhuǎn)子位置進(jìn)行步狀態(tài)的切換即可控制電機(jī)轉(zhuǎn)動(dòng)。
2.1 梯形波
無(wú)感方波的驅(qū)動(dòng)電路采用三相全橋逆變電路,在理想的情況下,三相全橋逆變電路的電壓波形如下圖2-1所示,每相導(dǎo)通角度為120°,相與相之間相隔120°。
無(wú)刷直流電機(jī)驅(qū)動(dòng)所需的電流波形也是上圖里的方波,因?yàn)殡姍C(jī)存在漏感 L ,定子電流會(huì)有一定的上升和下降時(shí)間,所以使得理想的方波變成了梯形波。
從圖2-2中可以看出,無(wú)刷直流電機(jī)實(shí)際運(yùn)行時(shí)的三相電壓波形并不是圖2-1里的方波,而是梯形波。由于采用了脈寬調(diào)制計(jì)數(shù)(PWM),所以波形看上去由一道道脈沖組成。
2.2 確定換相信號(hào)
無(wú)感方波驅(qū)動(dòng)與有感最大的區(qū)別就在于獲取換相信號(hào)的方式不同,有感方波通過(guò)檢測(cè)三相霍爾信號(hào)的電平,再根據(jù)三相電平確定電機(jī)此時(shí)應(yīng)該運(yùn)行在的步狀態(tài);無(wú)感方波是檢測(cè)梯形波“斜線”上的反電動(dòng)勢(shì)電壓來(lái)確定換相時(shí)刻。霍爾信號(hào)對(duì)應(yīng)的相是確定的,所以電機(jī)的供電相也要根據(jù)霍爾相的順序來(lái)連接,而無(wú)感方波驅(qū)動(dòng)只需要檢測(cè)“斜線”上的“過(guò)零點(diǎn)”確定換相時(shí)刻后自動(dòng)換相到下一步狀態(tài),而每一個(gè)步狀態(tài)對(duì)應(yīng)事先已經(jīng)安排好的開(kāi)關(guān)管通斷,所以電機(jī)的供電相可以隨意連接。
PA0、PA1、PA5分別對(duì)應(yīng)CW32F030 ADC的0、1、5通道,我們使用ADC采集三相的電壓,但在“過(guò)零點(diǎn)”比較中我們實(shí)際使用的是未導(dǎo)通相,即懸空相的電壓。
2.3電機(jī)驅(qū)動(dòng)思路
驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)的原理與上一章有感驅(qū)動(dòng)的原理相同,本質(zhì)上是對(duì)電機(jī)定子的通電情況進(jìn)行控制,也稱(chēng)為換相。這里我們結(jié)合上一章霍爾傳感器的信號(hào)波形與電機(jī)運(yùn)行時(shí)的三相電壓波形來(lái)看,如下圖。
我們將電機(jī)運(yùn)行狀態(tài)分為三種:停止、啟動(dòng)、運(yùn)行,其中停止?fàn)顟B(tài)不需要過(guò)多關(guān)注。首先是電機(jī)的啟動(dòng),啟動(dòng)狀態(tài)首先要對(duì)轉(zhuǎn)子進(jìn)行定位,因?yàn)殡姍C(jī)在停止時(shí)轉(zhuǎn)子可以在任何位置。確定轉(zhuǎn)子的位置可以給某一步狀態(tài)對(duì)應(yīng)的 MOS 管通電,等待一小段轉(zhuǎn)子復(fù)位的時(shí)間后,轉(zhuǎn)子就在此步狀態(tài)中,然后進(jìn)入啟動(dòng)階段。
無(wú)感電機(jī)的啟動(dòng)也稱(chēng)為“強(qiáng)拖”,以復(fù)位時(shí)的步狀態(tài)為基準(zhǔn),手動(dòng)換步,之后若檢測(cè)到 “過(guò)零點(diǎn)”,則切入第三種正常運(yùn)行的狀態(tài),如果沒(méi)有檢測(cè)到,則提高占空比再手動(dòng)換步,嘗試一定次數(shù)后如果沒(méi)有成功則電機(jī)啟動(dòng)失敗。
正常運(yùn)行狀態(tài)時(shí),在每次輸出 PWM 脈沖時(shí)由比較器觸發(fā) ADC 采樣,根據(jù)當(dāng)前步狀態(tài)確定要使用的反電動(dòng)勢(shì)在哪一相。取得反電動(dòng)勢(shì)后需要判斷是否已經(jīng)來(lái)到 “過(guò)零點(diǎn)”,這里還需要判斷當(dāng)前步狀態(tài)是電壓上升還是下降狀態(tài):上升狀態(tài)需要判斷反電動(dòng)勢(shì)大于 “過(guò)零點(diǎn)” 值,下降狀態(tài)需要判斷反電動(dòng)勢(shì)小于 “過(guò)零點(diǎn)”值。還需要注意的是,ADC的采樣時(shí)刻的選擇會(huì)影響到 “過(guò)零點(diǎn)”值的大小:如果是在 PWM 高電平時(shí)采集,則過(guò)零點(diǎn)值為電源電壓的一半;低電平時(shí)的比較值需要自己根據(jù)實(shí)際大小去調(diào)試。通常在 PWM 占空比大于 50% 時(shí)采樣高電平,低于 50%時(shí)采樣低電平。
暫時(shí)無(wú)法在飛書(shū)文檔外展示此內(nèi)容 在檢測(cè)到 “過(guò)零點(diǎn)” 之后,需要延遲一定的時(shí)間再進(jìn)行換相,以保證電機(jī)的轉(zhuǎn)矩。延遲時(shí)間由定時(shí)器記錄的上次換相到本次換相的時(shí)間間隔,取其部分大小作為延遲時(shí)間。
注意,電機(jī)在換相時(shí)由于新的電流通路的建立,電壓在換相處會(huì)產(chǎn)生尖峰毛刺,此時(shí)進(jìn)行 ADC 電壓采集到的數(shù)據(jù)是不準(zhǔn)確的,所以在換相后還需要進(jìn)行退磁狀態(tài)的判斷,如果處于退磁狀態(tài),則本次不采樣。
03
軟件設(shè)計(jì)
3.1MCU資源分配
本次使用到的CW32內(nèi)部資源如下:
ATIM :CH1、CH2、CH3 三個(gè)通道比較產(chǎn)生 PWM 波用于驅(qū)動(dòng)電機(jī),CH4為芯片內(nèi)部通道,無(wú)外部引腳,只有一路比較捕獲寄存器 (ATIM_CH4CCR),且只能用于比較,不能用來(lái)捕獲。我們使用 CH4 的比較功能觸發(fā) DMA 傳輸。
DMA :使用4路 DMA 通道:CH1、CH2、CH3、 CH4:
CH1 將 ADC 單次單通道的采樣結(jié)果傳入 RAM
CH2 將 ADC 的 CR1 寄存器的配置值從 RAM 傳入寄存器
CH3 將 ADC 的 START 寄存器的配置值從 RAM 傳入寄存器
CH1、CH2、CH3由 ADC 硬件觸發(fā),CH4 由 ATIM 硬件觸發(fā),啟動(dòng) ADC
ADC :ADC 采樣的時(shí)鐘設(shè)置需要與 PWM 載波頻率結(jié)合,計(jì)算采樣時(shí)間;采用單通道單次采樣,首次采樣由 ATIM 硬件觸發(fā),ADC 轉(zhuǎn)換完畢后觸發(fā) DMA 傳輸,通過(guò) DMA 傳輸自動(dòng)改變采樣通道。這樣設(shè)置可以實(shí)現(xiàn) ATIM 觸發(fā)一次就采樣五個(gè)數(shù)據(jù)(U、V、W 相電壓、母線電壓、外部電位器調(diào)速電壓)
BTIM1 :BTIM1 設(shè)置 1ms 進(jìn)入一次中斷,在中斷里改變標(biāo)志位實(shí)現(xiàn)主程序的控制
BTIM2 :BTIM2 作為換相時(shí)間間隔的記錄定時(shí)器,決定延遲多長(zhǎng)時(shí)間后換相
BTIM3 :BTIM3 設(shè)置中斷,在中斷里完成退磁和換相
3.2 部分重要程序介紹
操作 ATIM CH4 的 CCR 寄存器,可以選擇 ADC 在一個(gè) PWM 周期內(nèi)不同位置的采樣:
CW_ATIM->CH4CCR=(數(shù)字);
首先是核心函數(shù):調(diào)制換相
/*step,為當(dāng)前換相序號(hào),PWM_ON_flag=1時(shí)啟動(dòng)PWM輸出 **Step_Last,記錄上一次步狀態(tài)用于 PWM 占空比的刷新 **Step_Time,記錄上一次換相時(shí)間 **Flag_Start_OK,判斷電機(jī)是否啟動(dòng)成功 **Flag_Demagnetize_State,判斷退磁狀態(tài),1:需要退磁;2:退磁完成;3:檢測(cè)到過(guò)零點(diǎn),可以換相 **HALLcount,記錄換相次數(shù)用于轉(zhuǎn)速計(jì)算 */ void Commutation(uint32_t step,uint32_t PWM_ON_flag) { if(PWM_ON_flag==0) //不啟動(dòng)則關(guān)閉輸出 { CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0; PWM_AL_OFF; PWM_BL_OFF;PWM_CL_OFF; CW_ATIM->CH4CCR=PWM_TS-800; return; } //關(guān)閉下管 if(step==0||step==5){PWM_AL_OFF;PWM_CL_OFF;} else if(step==1||step==2){PWM_AL_OFF;PWM_BL_OFF;} else if(step==3||step==4){PWM_BL_OFF;PWM_CL_OFF;} //打開(kāi)上管 if(step==0||step==1){CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0;CW_ATIM->CH1CCRA=OutPwm;} if(step==2||step==3){CW_ATIM->CH1CCRA=0;CW_ATIM->CH3CCRA=0;CW_ATIM->CH2CCRA=OutPwm;} if(step==4||step==5){CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=OutPwm;} //打開(kāi)下管 if(step==0||step==5){PWM_BL_ON;}//AB else if(step==1||step==2){PWM_CL_ON;}//AC else if(step==3||step==4){PWM_AL_ON;}//BA Step_Last=step; //判斷占空比修改采樣時(shí)刻 if(OutPwm>=1200&&Flag_ON_or_OFF==0){Flag_ON_or_OFF=1;CW_ATIM->CH4CCR=300;} else if(OutPwm<1200&&Flag_ON_or_OFF==1){Flag_ON_or_OFF=0;CW_ATIM->CH4CCR=PWM_TS-600; } //記錄上一次的換相時(shí)間 Step_Time=BTIM_GetCounter(CW_BTIM2); BTIM_SetCounter(CW_BTIM2,0); //電機(jī)未啟動(dòng)則快速換相 if(Flag_Start_OK==0) BTIM_SetAutoreload(CW_BTIM3,Step_Time/8); else BTIM_SetAutoreload(CW_BTIM3,Step_Time/6);//退磁延遲時(shí)間 BTIM_SetCounter(CW_BTIM3,0); BTIM_Cmd(CW_BTIM3, ENABLE); //啟動(dòng)退磁 Flag_Demagnetize_State=1;//退磁狀態(tài) HALLcount++; }
接著是第二個(gè)核心:換相。
/*Direction,電機(jī)運(yùn)行方向,0:步狀態(tài)012345,1:步狀態(tài)054321 **Cur_Step,電機(jī)目前的步狀態(tài),步狀態(tài)正常運(yùn)行順序?yàn)?012345、543210。0:AB、1:AC …… */ void BTIM3_IRQHandler(void) { if(BTIM_GetITStatus(CW_BTIM3, BTIM_IT_OV)) { BTIM_ClearITPendingBit(CW_BTIM3, BTIM_IT_OV); if(Flag_Demagnetize_State == 1) //說(shuō)明退磁結(jié)束后第一次進(jìn)入BTIM3中斷 { Flag_Demagnetize_State = 2; //退磁結(jié)束標(biāo)志 BTIM_Cmd(CW_BTIM3, DISABLE); } else if(Flag_Demagnetize_State == 3 && Flag_Start_OK == 1) //退磁完成和啟動(dòng)成功后,決定下一次換相 { BTIM_Cmd(CW_BTIM3, DISABLE); if(Direction == 0) //與RisingFalling的順序要對(duì)應(yīng) { Cur_Step++; if(Cur_Step == 6)Cur_Step = 0; } else { if(Cur_Step == 0)Cur_Step = 5; else Cur_Step--; } Commutation(Cur_Step,Motor_Start_F); } } }
過(guò)零點(diǎn)比較函數(shù)如下,此函數(shù)在 ADC 完成五次采樣后調(diào)用。
/*SampleData[5] U反電動(dòng)勢(shì) V反電動(dòng)勢(shì) 母線電壓 W反電動(dòng)勢(shì) 電位器調(diào)速電壓值 **TAB_BEMFChannel[6]={3,1,0,3,1,0}; **TAB_RisingFalling[2][6]={//判斷此刻電壓為上升沿還是下降沿,Rising=1;Falling=2 {FALLING,RISING,FALLING,RISING,FALLING,RISING}, {RISING,FALLING,RISING,FALLING,RISING,FALLING} } **Flag_ON_or_OFF,高低電平采樣標(biāo)志位 **RisingFalling,上升沿下降沿比較標(biāo)志位 **Count_0V,過(guò)零點(diǎn)檢測(cè)計(jì)數(shù) STCount = 15 **Flag_Confirm,啟動(dòng)確認(rèn)標(biāo)志位 */ void ADC_Process(void) { static uint8_t count = 0; //過(guò)零檢測(cè)計(jì)數(shù) uint32_t Voltage_Bus = 0; //母線電壓 uint8_t Flag_0V = 0; //成功檢測(cè)到過(guò)零點(diǎn)標(biāo)志 if(Flag_Demagnetize_State != 2)return; //說(shuō)明退磁未結(jié)束 BEMFConvertedValue =SampleData[TAB_BEMFChannel[Cur_Step]]; //取得反電動(dòng)勢(shì) RisingFalling=TAB_RisingFalling[Direction][Cur_Step]; //判斷上升沿還是下降沿 if(Flag_ON_or_OFF == 0)Voltage_Bus = 50; //在PWM低電平時(shí)采樣則與地比較電壓 else Voltage_Bus = SampleData[2]; //在PWM高電平時(shí)采樣則與電源正極比較電壓 if(RisingFalling == FALLING) { if(BEMFConvertedValue < Voltage_Bus) { count++; if(count >= 2) //連續(xù)兩次都檢測(cè)到過(guò)零,則認(rèn)為確實(shí)過(guò)零了 { count = 0; Flag_Demagnetize_State = 3; //退磁完成,可以換相 Count_0V++; Flag_Confirm = 1; Flag_0V = 1; //成功檢測(cè)到過(guò)零點(diǎn) } } else count = 0; } else if(RisingFalling == RISING) { if(BEMFConvertedValue > Voltage_Bus) { count++; if(count >= 2) { count = 0; Flag_Demagnetize_State = 3; Count_0V++; Flag_Confirm = 1; Flag_0V = 1; } } else count = 0; } if(Count_0V >= STCount && Flag_Start_OK == 0) { Flag_Start_OK = 1; //連續(xù)檢測(cè)到固定數(shù)量的過(guò)零時(shí),認(rèn)為啟動(dòng)成功 } if(Flag_Start_OK == 1 && Flag_0V == 1) { Flag_0V = 0; BTIM_SetAutoreload(CW_BTIM3,Step_Time/8); //換相延遲時(shí)間 BTIM_SetCounter(CW_BTIM3,0); BTIM_Cmd(CW_BTIM3, ENABLE); } }
最后是電機(jī)的啟動(dòng)部分:
/*TimeCountTemp,計(jì)時(shí),1ms增加1 **Com_time, 啟動(dòng)次數(shù) **RAMP_TABLE[64],存儲(chǔ)時(shí)間的數(shù)組 */ do { if(Direction == 0) //與RisingFalling的順序要對(duì)應(yīng) { Cur_Step++; if(Cur_Step >= 6)Cur_Step = 0; //以復(fù)位時(shí)的步狀態(tài)為基準(zhǔn),手動(dòng)換步 } else { if(Cur_Step == 0)Cur_Step = 5; else Cur_Step--; } Flag_Confirm = 0; if(Flag_Start_OK == 0) { Commutation(Cur_Step,Motor_Start_F); } TimeCountTemp = 0; while(TimeCountTemp < RAMP_TABLE[Com_time]) //等待過(guò)零點(diǎn)檢測(cè) { if(Flag_Confirm == 1 || Flag_Start_OK == 1)break; //啟動(dòng)成功則不再執(zhí)行do.....while里的內(nèi)容 } Com_time++; OutPwm+=10; //沒(méi)有啟動(dòng)則依次提高占空比 }while(Flag_Start_OK==0 && Com_time<60 && ErrorCode==0); //跳出循環(huán)則 啟動(dòng)成功/超出啟動(dòng)次數(shù)/啟動(dòng)報(bào)錯(cuò)
04
調(diào)試心得
在調(diào)試電機(jī)的過(guò)程中要做好限流保護(hù),電機(jī)換相失敗會(huì)導(dǎo)致其停在某一相,對(duì)應(yīng)的MOS 管持續(xù)導(dǎo)通。
退磁延遲時(shí)間和延遲換相時(shí)間的設(shè)置會(huì)影響電機(jī)的性能,過(guò)早地?fù)Q相會(huì)降低電機(jī)轉(zhuǎn)矩,過(guò)晚地?fù)Q相會(huì)使電機(jī)電流過(guò)大,效率較低發(fā)熱嚴(yán)重。
電壓比較值的設(shè)置同樣會(huì)造成上一條的影響,在低電平時(shí)采樣比較的值如果設(shè)置過(guò)小,會(huì)造成上升沿處換相過(guò)早、下降沿處換相過(guò)晚的后果。
電機(jī)的啟動(dòng)需要緩慢進(jìn)行,不可以將 PWM 的占空比增加過(guò)快,否則電機(jī)容易換相失敗。
BTIM3中斷服務(wù)程序里的方向檢測(cè)設(shè)置要與數(shù)組 TAB_RisingFalling 里的 Rising 和 Falling 順序?qū)?yīng),否則會(huì)啟動(dòng)失敗。
由于空心杯電機(jī)的內(nèi)部為三角形接線,在 PWM 低電平時(shí)仍保有較多的能量,所以在 MOS 管關(guān)斷期間的反電動(dòng)勢(shì)較高,并且隨著轉(zhuǎn)速的增加此電壓的大小呈上升態(tài)勢(shì)。對(duì)于 “過(guò)零點(diǎn)” 電壓數(shù)據(jù)的設(shè)置也需要適應(yīng)這種變化,下圖展示了空心杯電機(jī)運(yùn)行在 35000 rpm 時(shí)的一相電壓波形。
?
審核編輯:劉清
-
霍爾傳感器
+關(guān)注
關(guān)注
27文章
723瀏覽量
63171 -
額定電壓
+關(guān)注
關(guān)注
0文章
330瀏覽量
14320 -
無(wú)刷直流電機(jī)
+關(guān)注
關(guān)注
61文章
689瀏覽量
46120 -
反電動(dòng)勢(shì)
+關(guān)注
關(guān)注
1文章
56瀏覽量
12314 -
三相電壓
+關(guān)注
關(guān)注
0文章
103瀏覽量
14528
原文標(biāo)題:【產(chǎn)品方案】基于CW32的無(wú)刷直流空心杯電機(jī)無(wú)感方波控制驅(qū)動(dòng)方案
文章出處:【微信號(hào):武漢芯源半導(dǎo)體,微信公眾號(hào):武漢芯源半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論