基于CW32F030C8T6 32位微控制器的無刷直流空心杯電機無感方波控制驅動方案


1. 方案概述
本方案采用CW32F030C8T6作為主控芯片,采用無感方波控制算法控制無刷直流空心杯電機。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有豐富的片上外設資源,可以適合用于電機控制。無感方波控制算法是一種簡單有效的電機控制算法,不需要使用霍爾傳感器,可以降低硬件成本。
本次采用的電機驅動板仍然為CW32_BLDC_EVA V5開發(fā)板,具體開發(fā)板的信息可以翻看上一節(jié)《基于CW32的無刷空心杯電機有感控制驅動方案》,采用的空心杯電機與上一節(jié)有所不同,這次使用的空心杯電機的額定電壓為 24 V。
由于本次采用無感方案,所以只需要將 U、V、W三相電源接上即可,并且三相的順序并無強制要求,下面我們重心將放在對于無感方波控制的原理部分。
2. 無感方波控制原理
無感方波控制(Sensorless Square Wave Control)是一種用于無刷直流電機(BLDC)驅動的控制方法。與傳統(tǒng)的有感控制方法相比,無感方波控制不需要使用位置或速度傳感器來反饋電機狀態(tài),而是通過檢測電機自身的懸空相反電動勢變化(Back Electromotive Force,簡稱BEMF)來實現(xiàn)控制。
在無感方波控制中,通過檢測電機的懸空相電壓的過零點,可以推斷出電機轉子的位置,根據(jù)轉子位置進行步狀態(tài)的切換即可控制電機轉動。
2.1 梯形波電壓
無感方波的驅動電路采用三相全橋逆變電路,在理想的情況下,三相全橋逆變電路的電壓波形如下圖2-1所示,每相導通角度為120°,相與相之間相隔120°。

圖2-1 三相全橋逆變電壓波形
無刷直流電機驅動所需的電流波形也是上圖里的方波,因為電機存在漏感 L ,定子電流會有一定的上升和下降時間,所以使得理想的方波變成了梯形波。

圖2-2 BLDC運行三相電壓波形
從圖2-2中可以看出,無刷直流電機實際運行時的三相電壓波形并不是圖2-1里的方波,而是梯形波。由于采用了脈寬調制計數(shù)(PWM),所以波形看上去由一道道脈沖組成。
2.2 確定換相信號
無感方波驅動與有感最大的區(qū)別就在于獲取換相信號的方式不同,有感方波通過檢測三相霍爾信號的電平,再根據(jù)三相電平確定電機此時應該運行在的步狀態(tài);無感方波是檢測梯形波“斜線”上的反電動勢電壓來確定換相時刻?;魻栃盘枌南嗍谴_定的,所以電機的供電相也要根據(jù)霍爾相的順序來連接,而無感方波驅動只需要檢測“斜線”上的“過零點”確定換相時刻后自動換相到下一步狀態(tài),而每一個步狀態(tài)對應事先已經(jīng)安排好的開關管通斷,所以電機的供電相可以隨意連接。
PA0、PA1、PA5分別對應CW32F030 ADC的0、1、5通道,我們使用ADC采集三相的電壓,但在“過零點”比較中我們實際使用的是未導通相,即懸空相的電壓。
2.3 電機驅動思路
驅動電機旋轉的原理與上一章有感驅動的原理相同,本質上是對電機定子的通電情況進行控制,也稱為換相。這里我們結合上一章霍爾傳感器的信號波形與電機運行時的三相電壓波形來看,如下圖。

暫時無法在飛書文檔外展示此內容
我們將電機運行狀態(tài)分為三種: 停止、啟動、運行 ,其中停止狀態(tài)不需要過多關注。首先是電機的啟動,啟動狀態(tài)首先要對轉子進行定位,因為電機在停止時轉子可以在任何位置。確定轉子的位置可以給某一步狀態(tài)對應的 MOS 管通電,等待一小段轉子復位的時間后,轉子就在此步狀態(tài)中,然后進入啟動階段。
無感電機的啟動也稱為“強拖”,以復位時的步狀態(tài)為基準,手動換步,之后若檢測到 “過零點”,則切入第三種正常運行的狀態(tài),如果沒有檢測到,則提高占空比再手動換步,嘗試一定次數(shù)后如果沒有成功則電機啟動失敗。
正常運行狀態(tài)時,在每次輸出 PWM 脈沖時由比較器觸發(fā) ADC 采樣,根據(jù)當前步狀態(tài)確定要使用的反電動勢在哪一相。取得反電動勢后需要判斷是否已經(jīng)來到 “過零點”,這里還需要判斷當前步狀態(tài)是電壓上升還是下降狀態(tài):上升狀態(tài)需要判斷反電動勢大于 “過零點” 值,下降狀態(tài)需要判斷反電動勢小于 “過零點”值。還需要注意的是,ADC的采樣時刻的選擇會影響到 “過零點”值的大?。喝绻窃?PWM 高電平時采集,則過零點值為電源電壓的一半;低電平時的比較值需要自己根據(jù)實際大小去調試。通常在 PWM 占空比大于 50% 時采樣高電平,低于 50%時采樣低電平。

圖2-5 采樣點比較值選擇
在檢測到 “過零點” 之后,需要延遲一定的時間再進行換相,以保證電機的轉矩。延遲時間由定時器記錄的上次換相到本次換相的時間間隔,取其部分大小作為延遲時間。
注意,電機在換相時由于新的電流通路的建立,電壓在換相處會產(chǎn)生尖峰毛刺,此時進行 ADC 電壓采集到的數(shù)據(jù)是不準確的,所以在換相后還需要進行退磁狀態(tài)的判斷,如果處于退磁狀態(tài),則本次不采樣。
3. 軟件設計
3.1 MCU資源分配
本次使用到的CW32內部資源如下:
ATIM :CH1、CH2、CH3 三個通道比較產(chǎn)生 PWM 波用于驅動電機,CH4為芯片內部通道,無外部引腳,只有一路比較捕獲寄存器 (ATIM_CH4CCR),且只能用于比較,不能用來捕獲。我們使用 CH4 的比較功能觸發(fā) DMA 傳輸。
DMA :使用4路 DMA 通道:CH1、CH2、CH3、 CH4:
CH1 將 ADC 單次單通道的采樣結果傳入 RAM
CH2 將 ADC 的 CR1 寄存器的配置值從 RAM 傳入寄存器
CH3 將 ADC 的 START 寄存器的配置值從 RAM 傳入寄存器
CH1、CH2、CH3由 ADC 硬件觸發(fā),CH4 由 ATIM 硬件觸發(fā),啟動 ADC
ADC :ADC 采樣的時鐘設置需要與 PWM 載波頻率結合,計算采樣時間;采用單通道單次采樣,首次采樣由 ATIM 硬件觸發(fā),ADC 轉換完畢后觸發(fā) DMA 傳輸,通過 DMA 傳輸自動改變采樣通道。這樣設置可以實現(xiàn) ATIM 觸發(fā)一次就采樣五個數(shù)據(jù)(U、V、W 相電壓、母線電壓、外部電位器調速電壓)
BTIM1 :BTIM1 設置 1ms 進入一次中斷,在中斷里改變標志位實現(xiàn)主程序的控制
BTIM2 :BTIM2 作為換相時間間隔的記錄定時器,決定延遲多長時間后換相
BTIM3 :BTIM3 設置中斷,在中斷里完成退磁和換相
3.2 部分重要程序介紹
操作 ATIM CH4 的 CCR 寄存器,可以選擇 ADC 在一個 PWM 周期內不同位置的采樣:
CW_ATIM- >CH4CCR=(數(shù)字);
首先是核心函數(shù):調制換相
/*step,為當前換相序號,PWM_ON_flag=1時啟動PWM輸出
**Step_Last,記錄上一次步狀態(tài)用于 PWM 占空比的刷新
**Step_Time,記錄上一次換相時間
**Flag_Start_OK,判斷電機是否啟動成功
**Flag_Demagnetize_State,判斷退磁狀態(tài),1:需要退磁;2:退磁完成;3:檢測到過零點,可以換相
**HALLcount,記錄換相次數(shù)用于轉速計算
*/
void Commutation(uint32_t step,uint32_t PWM_ON_flag)
{
if(PWM_ON_flag==0) //不啟動則關閉輸出
{
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;
}
//關閉下管
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;}
//打開上管
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;}
//打開下管
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;
//判斷占空比修改采樣時刻
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; }
//記錄上一次的換相時間
Step_Time=BTIM_GetCounter(CW_BTIM2);
BTIM_SetCounter(CW_BTIM2,0);
//電機未啟動則快速換相
if(Flag_Start_OK==0)
BTIM_SetAutoreload(CW_BTIM3,Step_Time/8);
else
BTIM_SetAutoreload(CW_BTIM3,Step_Time/6);//退磁延遲時間
BTIM_SetCounter(CW_BTIM3,0);
BTIM_Cmd(CW_BTIM3, ENABLE);
//啟動退磁
Flag_Demagnetize_State=1;//退磁狀態(tài)
HALLcount++;
}
接著是第二個核心:換相。
/*Direction,電機運行方向,0:步狀態(tài)012345,1:步狀態(tài)054321
**Cur_Step,電機目前的步狀態(tài),步狀態(tài)正常運行順序為 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) //說明退磁結束后第一次進入BTIM3中斷
{
Flag_Demagnetize_State = 2; //退磁結束標志
BTIM_Cmd(CW_BTIM3, DISABLE);
}
else if(Flag_Demagnetize_State == 3 && Flag_Start_OK == 1) //退磁完成和啟動成功后,決定下一次換相
{
BTIM_Cmd(CW_BTIM3, DISABLE);
if(Direction == 0) //與RisingFalling的順序要對應
{
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);
}
}
}
過零點比較函數(shù)如下,此函數(shù)在 ADC 完成五次采樣后調用。
/*SampleData[5] U反電動勢 V反電動勢 母線電壓 W反電動勢 電位器調速電壓值
**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,高低電平采樣標志位
**RisingFalling,上升沿下降沿比較標志位
**Count_0V,過零點檢測計數(shù) STCount = 15
**Flag_Confirm,啟動確認標志位
*/
void ADC_Process(void)
{
static uint8_t count = 0; //過零檢測計數(shù)
uint32_t Voltage_Bus = 0; //母線電壓
uint8_t Flag_0V = 0; //成功檢測到過零點標志
if(Flag_Demagnetize_State != 2)return; //說明退磁未結束
BEMFConvertedValue =SampleData[TAB_BEMFChannel[Cur_Step]]; //取得反電動勢
RisingFalling=TAB_RisingFalling[Direction][Cur_Step]; //判斷上升沿還是下降沿
if(Flag_ON_or_OFF == 0)Voltage_Bus = 50; //在PWM低電平時采樣則與地比較電壓
else Voltage_Bus = SampleData[2]; //在PWM高電平時采樣則與電源正極比較電壓
if(RisingFalling == FALLING)
{
if(BEMFConvertedValue < Voltage_Bus)
{
count++;
if(count >= 2) //連續(xù)兩次都檢測到過零,則認為確實過零了
{
count = 0;
Flag_Demagnetize_State = 3; //退磁完成,可以換相
Count_0V++;
Flag_Confirm = 1;
Flag_0V = 1; //成功檢測到過零點
}
}
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ù)檢測到固定數(shù)量的過零時,認為啟動成功
}
if(Flag_Start_OK == 1 && Flag_0V == 1)
{
Flag_0V = 0;
BTIM_SetAutoreload(CW_BTIM3,Step_Time/8); //換相延遲時間
BTIM_SetCounter(CW_BTIM3,0);
BTIM_Cmd(CW_BTIM3, ENABLE);
}
}
最后是電機的啟動部分:
/*TimeCountTemp,計時,1ms增加1
**Com_time, 啟動次數(shù)
**RAMP_TABLE[64],存儲時間的數(shù)組
*/
do
{
if(Direction == 0) //與RisingFalling的順序要對應
{
Cur_Step++;
if(Cur_Step >= 6)Cur_Step = 0; //以復位時的步狀態(tài)為基準,手動換步
}
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]) //等待過零點檢測
{
if(Flag_Confirm == 1 || Flag_Start_OK == 1)break; //啟動成功則不再執(zhí)行do.....while里的內容
}
Com_time++;
OutPwm+=10; //沒有啟動則依次提高占空比
}while(Flag_Start_OK==0 && Com_time< 60 && ErrorCode==0);
//跳出循環(huán)則 啟動成功/超出啟動次數(shù)/啟動報錯
4. 調試心得
在調試電機的過程中要做好限流保護,電機換相失敗會導致其停在某一相,對應的MOS 管持續(xù)導通。
退磁延遲時間和延遲換相時間的設置會影響電機的性能,過早地換相會降低電機轉矩,過晚地換相會使電機電流過大,效率較低發(fā)熱嚴重。
電壓比較值的設置同樣會造成上一條的影響,在低電平時采樣比較的值如果設置過小,會造成上升沿處換相過早、下降沿處換相過晚的后果。
電機的啟動需要緩慢進行,不可以將 PWM 的占空比增加過快,否則電機容易換相失敗。
BTIM3中斷服務程序里的方向檢測設置要與數(shù)組 TAB_RisingFalling 里的 Rising 和 Falling 順序對應,否則會啟動失敗。
由于空心杯電機的內部為三角形接線,在 PWM 低電平時仍保有較多的能量,所以在 MOS 管關斷期間的反電動勢較高,并且隨著轉速的增加此電壓的大小呈上升態(tài)勢。對于 “過零點” 電壓數(shù)據(jù)的設置也需要適應這種變化,下圖展示了空心杯電機運行在 35000 rpm 時的一相電壓波形。


圖4-1 空心杯電機運行電壓波形
CW32F030C8T6 32位微控制器
CW32F030C8T6是一款由中國廠商宇瞻(YZ)公司生產(chǎn)的32位微控制器,它具有高性能、低功耗和豐富的外設特點。以下是該微控制器的詳細介紹:
處理器核心: CW32F030C8T6采用ARM高效Cortex-M0處理器核心,這是一種高性能的32位處理器,適用于各種嵌入式應用。它能夠提供出色的性能,同時保持較低的功耗。
存儲器:該微控制器內置了存儲器和RAM,用于存儲程序代碼和數(shù)據(jù)。存儲器的容量可以根據(jù)具體型號而變化,通常用于存儲程序代碼,而RAM用于存儲運行時數(shù)據(jù)。
外部設置和接口: CW32F030C8T6集成了常用的多種外部設置和接口,包括但不限于:
模數(shù)轉換器(ADC):用于模擬信號的數(shù)字化轉換。
通用異步收發(fā)器(UART):用于串口通信。
定時器(Timer):用于生成精確的時間間隔。
PWM控制器:用于產(chǎn)生脈沖寬度調制信號。
SPI接口:用于串行外設接口通信。
I2C接口:用于兩線式串行接口通信。
功耗優(yōu)化: CW32F030C8T6設計針對低功耗應用,可以在不犧牲性能的情況下實現(xiàn)節(jié)能。這使得它特別適合電池供電或對功耗有嚴格要求的應用。
應用領域:由于其高性能、低功耗和豐富的外設,CW32F030C8T6適用于各種嵌入式應用領域,包括但不限于:
工業(yè)自動化和控制系統(tǒng)。
智能家居和物聯(lián)網(wǎng)設備。
消費類電子產(chǎn)品,如智能穿戴設備、智能家電等。
醫(yī)療設備,如醫(yī)療監(jiān)測設備和醫(yī)療圖像處理系統(tǒng)。
總的來說,CW32F030C8T6是一款功能強大、性能卓越的微控制器,適用于廣泛的嵌入式應用,能夠滿足各種需求并提供可靠的性能表現(xiàn)。
工作原理: CW32F030C8T6是基于ARM Cortex-M0內核的微控制器。它通過執(zhí)行嵌入式軟件程序來控制與連接的外圍設備并執(zhí)行各種任務。該微控制器具有各種內置外部設置和功能模塊,可以通過Smashing實現(xiàn)不同的應用功能。
特點:
32位架構:基于32位處理器核心,具有更強的計算能力和數(shù)據(jù)處理能力。
低功耗設計:針對低功耗應用的設計,適用于電池供電設備和便攜式設備。
豐富的外圍配置:包括模數(shù)轉換器(ADC)、通用異步收發(fā)器(UART)、定時器、PWM控制器等,可滿足各種應用需求。
豐富的存儲器:包括存儲器和RAM,用于存儲程序代碼和數(shù)據(jù)。
豐富的接口:支持多種接口標準,如SPI、I2C、USB等,方便與外部設備通信。
應用:
嵌入式系統(tǒng):用于各種嵌入式系統(tǒng),如工業(yè)控制、自動化系統(tǒng)、儀器儀表等。
消費類電子產(chǎn)品:適用于智能家居、智能穿戴設備、智能傳感器等消費類電子產(chǎn)品。
工業(yè)控制:用于工業(yè)自動化、過程控制、傳感器接口等應用。
醫(yī)療設備:適用于醫(yī)療監(jiān)測設備、醫(yī)療圖像處理等醫(yī)療領域應用。
參數(shù):
處理器核心: ARM Cortex-M0
大?。捍鎯Τ绦虼a的容量
RAM大?。捍鎯?shù)據(jù)的容量
工作頻率:處理器的工作頻率
外部設置接口:支持的外部設備接口類型和數(shù)量
封裝類型:如LQFP、QFN等
總的來說,CW32F030C8T6是一款功能強大的32位微控制器,具有豐富的外圍設置和接口,適用于各種嵌入式系統(tǒng)和消費類電子產(chǎn)品的設計。
責任編輯:David
【免責聲明】
1、本文內容、數(shù)據(jù)、圖表等來源于網(wǎng)絡引用或其他公開資料,版權歸屬原作者、原發(fā)表出處。若版權所有方對本文的引用持有異議,請聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業(yè)目的。
3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經(jīng)允許私自轉載拍明芯城將保留追究其法律責任的權利。
拍明芯城擁有對此聲明的最終解釋權。