一、前言
無刷水泵被廣泛應用于許多領域,如工業生產、農業灌溉以及家庭應用。它具有高效、可靠和節能的特點,因此備受青睞。但是無刷水泵的供電是一個問題。怎么能隨時隨地的使用無刷水泵呢?總不能拿一個水泵,還要配一臺發電機吧。所以本次我們使用電動車供電,可以滿足用戶騎車到哪,水泵都可以使用的特點。
在戶外的各種場景下,肯定要選擇一顆穩定的抗干擾的芯片才行。強烈推薦CW32系列芯片??垢蓴_能力值得您的信賴!
CW32F030C8T6支持工作溫度: -40℃ 至 105℃;
工作電壓:1.65V 至 5.5V
存儲容量: 64K 字節FLASH,數據保持25年@85℃ 8K 字節RAM,支持奇偶校驗,128字節OTP存儲器
使用一顆好芯片,為您照亮開發之路!
二、CW-W88水泵通用控制板-方案介紹
簡介
CW-W88水泵通用控制板適用于水泵電機抽水控制應用。配合水泵電機,可使用48V或60V電池組(電動車電池組)抽水使用。使用前請將電池充滿(電池至少在一半電量以上使用)??刂瓢寰哂星穳罕Wo、過壓保護、過流保護、無水停止保護、堵轉保護,速度異常等功能??蓮V泛應用于各類水泵抽水控制。
系統功能
電源接線:紅色,黑色接電源,不分正負,建議按使用習慣接:紅色接正、黑色接負。
相線接線:UVW隨機接入電機的相線,試看電機運行方向。如需要反轉,隨意調換兩根相線,重新上電即可。
電源電壓接入不能超過70V。上電2S后,電機啟動開始抽水運行(可根據需求縮短上電穩定時間)。速度增到最大功率以后,按設定的最大功率值控制運行。如果用戶電機功率達不到設定的功率,控制板則按電機的最大輸出能力輸出運行。
電機在無水檢測或其它任何故障時,會自動停止運行,且以指閃燈的閃爍頻率指示故障狀態。
工作參數
型號:CW-W88
使用環境:48V或60V電池組
工作電壓:40V~60V
工作電流:48V電池組13A、60V電池組10A
最大功率:600W
控制方式:電流閉環
尺寸:板子為圓形,直徑8CM,高度3CM。建議至少加3MM厚的散熱器
項目組成部分:
CW32主控芯片:
這是整個項目的關鍵組成部分,它負責控制無刷水泵電機的運行和參數調節。CW32主控芯片具有高性能和低功耗的特點,可以滿足無刷水泵電機控制器項目的需求。
無刷水泵電機:
無刷水泵電機是項目的核心部分,它可以通過電磁感應實現轉子轉動的無刷電機效果。無刷水泵電機具有較高的效率和可靠性,適用于各種應用場景。
硬件電路:
包含驅動電路,電流采集電路,母線電壓采集電路,反電動勢采集電路,電源電路。
軟件編寫:
包含電機驅動代碼,高壓,低壓保護及自恢復。電流保護,速度異常保護,空載保護,啟動堵轉保護。
三、項目設計說明
硬件設計及PCB制板
此線控器是基于武漢芯源半導體推出的CW32F030C8T6產品設計研發而成的,其主要包括MCU、電源部分、電流采樣、電壓采樣、EG3014驅動、反電動勢采集等部分,設計系統原理框圖如圖1所示:
該控制器功能包含:
上電自啟動,緩慢加速。
啟動堵轉保護
速度異常保護
過欠壓自恢復保護
電流保護
空載保護
2.設計原理圖及PCB板實物圖
3.軟件部分
軟件部分主要分為以下幾部分內容,軟件構成如圖7所示:
狀態機代碼
switch(USER_sSysStateErr.sSystemState)//狀態機{ case STATE_IDLE_A: MDS_v_charge();break;//充電 case STATE_INIT_B: MDS_v_Init();break;//初始化 case STATE_START_C: MDS_v_Start_the_judgment(); break;//等待啟動信號 case STATE_ALIGNMENT_D: MDS_v_The_motor_starts();break;//啟動 case STATE_ADCLOOP_E:MDS_v_OPEN_starts();break; // 開環模式 case STATE_BRAKE_F:MDS_v_brake();break; // 剎車 case STATE_FAULT_G:MDS_v_Misjudgment();break; // 錯誤判斷 case STATE_WAIT_L: MDS_v_Error_recovery(USER_sSysStateErr.sSysTime.u32ReStartTime); break; // 錯誤恢復判斷 case STATE_STOP_M:Stop_Motor();break; // 停止 default:break;}
電流電壓采集計算代碼
void V_A_calculation(void) { USER_sVoltageAll.s16Udc=(float)(SampleData[2]*UPDS_resistance_compute); keep_adcvlaue+=SampleData[4]; keep_adcvnum++; if(keep_adcvnum>2) { keep_adcvnum=0; keep_adcvlaue=keep_adcvlaue/2; USER_sCurrentAll.s32IdcUse=(SampleData[4]*UPDS_Current_compute)/10;//100mA USER_sCurrentAll.IdcValue=(float)USER_sCurrentAll.s32IdcUse/100.0; } }
電機啟動代碼,判斷啟動是否失敗
//(3):電機啟動代碼,判斷啟動是否失敗。 void Sensorless_MOTOR_START(void) { unsigned char coun = 0; USER_BLDC.HALLcountS = 0; USER_BLDC.QDPwm = 20; // 啟動占空比 do { if (Sensorless_START() == 0) { coun++; USER_BLDC.QDPwm += 5; } else break; } while (coun < 5 && ErrorCode == 0); if (coun >= 5 && ErrorCode == 0) { ErrorCode = 3; } // 啟動失敗 }
電機運行代碼
//(4):電機運行代碼 void ADCS_chuli(void) { static unsigned char cou = 0; unsigned char hx = 0; unsigned int thre = 0; if (USER_BLDC.Sta != 2) return; BEMFConvertedValue = SampleData[TAB_BEMFChannel[Forward_rotation][bHallStartStep1]]; RisingFalling = TAB_RFling[Forward_rotation][bHallStartStep1]; if (USER_BLDC.Tonoroff == 0) thre = 50; // 30;//248; //OFF時刻采集。0.2V閥值248 else thre = SampleData[2] / 2; if (RisingFalling == FALLING) // 下降沿 { if (BEMFConvertedValue < thre) { cou++; if (cou >= 2) { cou = 0; USER_BLDC.Sta = 3; USER_BLDC.StCountComm++; // 正確檢測到第三相反電動勢 FFlag = 1; hx = 1; } } else { cou = 0; } } else if (RisingFalling == RISING) { if (BEMFConvertedValue > thre) { cou++; if (cou >= 2) { cou = 0; USER_BLDC.Sta = 3; USER_BLDC.StCountComm++; // 正確檢測到第三相反電動勢 FFlag = 1; hx = 1; } } else { cou = 0; } } if (USER_BLDC.StCountComm >= STCount && USER_BLDC.StOk == 0) // 連續檢測到固定數量的過零時,認為啟動成功 { USER_BLDC.StOk = 1; } if (USER_BLDC.StOk == 1 && hx == 1) { hx = 0; BTIM_SetAutoreload(CW_BTIM3, USER_BLDC.StepTime / 5); BTIM_SetCounter(CW_BTIM3, 0); BTIM_Cmd(CW_BTIM3, ENABLE); } }
電機報警代碼及其自恢復功能
//(5):電機報警代碼及其自恢復功能 void US_vSysErrorCheck(void) { US_vSysCurrentCheck(); // 電流報警 US_vSysVoltageCheck(); // 電壓報警 US_vSysStuck_in(); // 啟動堵轉保護 US_vSysSPEED_ERRORCheck(); // 速度異常保護 US_vSyscarrying_idlerCheck(); // 空載保護 } void MDS_v_Error_recovery(uint32_t WaitTime) // 錯誤恢復 { static uint32_t lg_u32WaitCount = 0; if (lg_u32WaitCount >= WaitTime) { USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_INIT_B; USER_sSysStateErr.uSystemError.OverGUdcFlag = false; USER_sSysStateErr.uSystemError.OverLUdcFlag = false; USER_sSysStateErr.uSystemError.overStuck_in = false; USER_sSysStateErr.uSystemError.GlobalErrorFlag = false; ErrorCode = 0; lg_u32WaitCount = 0; } else if (((USER_sVoltageAll.s16Udc < UPDS_UDC_PROTECT_MAX_V_recover) && (USER_sSysStateErr.uSystemError.OverGUdcFlag == true)) || ((USER_sVoltageAll.s16Udc > UPDS_UDC_PROTECT_MIN_V_recover) && (USER_sSysStateErr.uSystemError.OverLUdcFlag == true)) || (USER_sSysStateErr.uSystemError.overStuck_in == true)) { lg_u32WaitCount++; } else lg_u32WaitCount = 0; }
電機反電動勢及運行代碼
反電動勢過零檢測法基本原理:
忽略電動機電樞反應,無刷直流電動機在穩態運行過程中,通過檢測關斷相的反電動勢過零點獲得轉子的位置信號,進行對逆變器開關導通順序切換,控制電機運動。
較為典型的 BLDCM 的無位置傳感器控制方法有基于反電勢的檢測法、磁鏈估計法、電感檢測法等,在該系統中采用反電勢過零檢測法。
反電動勢過零檢測法是以直流無刷電機中性點電壓為基準進行反電動勢過零檢測的,屬于間接反電動勢檢測方法。該方法將端電壓作分壓濾 波處理得到直流無刷電機的位置信號,由于有濾波電路存在,獲得的位置信號比真實的反電動勢過零點延時了一定的角度。
在理想情況下,電機三相繞組反電勢 Ea 、Eb、Ec 的波形為梯形波。無刷電機采用 120°導通方式,在任何時刻只有兩相導通,這兩相電流的大小 相等、方向相反,另一相電流為零,故三相電流的 總和為零。
反電動勢零點 | 變化趨勢 |
---|---|
C- | C相反電動勢由正到負 |
B+ | B相反電動勢由負到正 |
A- | A相反電動勢由正到負 |
C+ | C相反電動勢由負到正 |
B- | B相反電動勢由正到負 |
A+ | A相反電動勢由負到正 |
表:正向反電動勢過零點變化
反電動勢部分代碼
//反電動勢部分代碼 void ADCS_chuli(void) { static unsigned char cou = 0; unsigned char hx = 0; unsigned int thre = 0; if (USER_BLDC.Sta != 2) return; BEMFConvertedValue = SampleData[TAB_BEMFChannel[Forward_rotation][bHallStartStep1]]; RisingFalling = TAB_RFling[Forward_rotation][bHallStartStep1]; if (USER_BLDC.Tonoroff == 0) thre = 50; // 30;//248; //OFF時刻采集。0.2V閥值248 else thre = SampleData[2] / 2; if (RisingFalling == FALLING) // 下降沿 { if (BEMFConvertedValue < thre) { cou++; if (cou >= 2) { cou = 0; USER_BLDC.Sta = 3; USER_BLDC.StCountComm++; // 正確檢測到第三相反電動勢 FFlag = 1; hx = 1; } } else { cou = 0; } } else if (RisingFalling == RISING) { if (BEMFConvertedValue > thre) { cou++; if (cou >= 2) { cou = 0; USER_BLDC.Sta = 3; USER_BLDC.StCountComm++; // 正確檢測到第三相反電動勢 FFlag = 1; hx = 1; } } else { cou = 0; } } if (USER_BLDC.StCountComm >= STCount && USER_BLDC.StOk == 0) // 連續檢測到固定數量的過零時,認為啟動成功 { USER_BLDC.StOk = 1; } if (USER_BLDC.StOk == 1 && hx == 1) { hx = 0; BTIM_SetAutoreload(CW_BTIM3, USER_BLDC.StepTime / 5); BTIM_SetCounter(CW_BTIM3, 0); BTIM_Cmd(CW_BTIM3, ENABLE); } }
母線電壓監測-分壓電路原理及代碼
可以看原理圖中的分壓電路是兩個電阻
軟件保護
void US_vSysErrorCheck(void) { US_vSysCurrentCheck(); // 電流報警 US_vSysVoltageCheck(); // 電壓報警 US_vSysStuck_in(); // 啟動堵轉保護 US_vSysSPEED_ERRORCheck(); // 速度異常保護 US_vSyscarrying_idlerCheck(); // 空載保護 }
1):電流保護
在無刷電機運行中,有時候堵轉很容易燒mos管,所以電流保護就尤為的重要。
在程序中配置了電流觸發保護值,是15A,因為我們額定功率是500W。還有電流采集電路沒有加入運放,采集不精確,所以需要把電流值設置大一點。之后也要根據實際的調試而改變。
//電流保護 void US_vSysCurrentCheck(void) // 電流保護 { #if (UPDS_ISUM_DETECTION == 1) if ((USER_sCurrentAll.IdcValue) >= UPDS_OVERISUM_limit_MAX) // 一級電流保護 { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount++; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount >= UPDS_OVERISUM_limit_MS) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = UPDS_OVERISUM_limit_MS; USER_sSysStateErr.uSystemError.OverIdcFirstlevelFlag = true; USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; } } else { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount--; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount <= 0) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = 0; USER_sSysStateErr.uSystemError.OverIdcFirstlevelFlag = false; } } #endif } /********************限流保護值***********************/ #define UPDS_OVERISUM_limit_MAX (15) //unit: A 限流保護值 #define UPDS_OVERISUM_limit_MS (500)//unit: ms 觸發保護時間 /**********************報警設置********************/ #define UPDS_ISUM_DETECTION (1) //電流保護使能
2):電壓保護
在高壓和低壓保護中,我們在程序中加入了自恢復功能,如果電壓高于58v就會觸發高壓保護,電機停止,等待電壓下降到55v以下,就會觸發自恢復功能,等待自恢復時間結束,電機重新啟動。低壓也是同理。
//電壓保護 void US_vSysVoltageCheck(void) // 電壓保護 { #if (UPDS_UDC_DETECTION == 1) if (USER_sVoltageAll.s16Udc > UPDS_UDC_PROTECT_MAX_V) { USER_sSysStateErr.sSysTime.s32OverGUdcCount++; if (USER_sSysStateErr.sSysTime.s32OverGUdcCount >= UPDS_OVERVOLTAGE_VOLTAGE_MS) { USER_sSysStateErr.sSysTime.s32OverGUdcCount = UPDS_OVERVOLTAGE_VOLTAGE_MS; USER_sSysStateErr.uSystemError.OverGUdcFlag = true; USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; // 高壓保護 } } if (USER_sVoltageAll.s16Udc < UPDS_UDC_PROTECT_MIN_V && USER_sVoltageAll.s16Udc > 5) { USER_sSysStateErr.sSysTime.s32OverLUdcCount++; if (USER_sSysStateErr.sSysTime.s32OverLUdcCount >= UPDS_UNDERVOLTAGE_VOLTAGE_MS) { USER_sSysStateErr.sSysTime.s32OverLUdcCount = UPDS_UNDERVOLTAGE_VOLTAGE_MS; USER_sSysStateErr.uSystemError.OverLUdcFlag = true; USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; // 低壓保護 } } #endif } /**********************報警設置********************/ #define UPDS_UDC_DETECTION (1) //電壓保護使能 /********************電壓保護值***********************/ #define UPDS_UDC_REAL (48.0f) //unit: V;電壓源電壓 #define UPDS_UDC_PROTECT_MAX_V (58.0f) //unit: V;過壓值 #define UPDS_UDC_PROTECT_MAX_V_recover (54.0f) //unit: V;過壓恢復值 #define UPDS_OVERVOLTAGE_VOLTAGE_MS (10.0) //Unit: ms 過電壓持續時間1ms基準 #define UPDS_UDC_PROTECT_MIN_V (30.0f) //unit: V;欠壓值 #define UPDS_UDC_PROTECT_MIN_V_recover (32.0f) //unit: V;欠壓恢復值 #define UPDS_UNDERVOLTAGE_VOLTAGE_MS (14.0) //Unit: ms 欠電壓持續時間1ms基準
3):啟動堵轉保護
在堵轉保護之中,我們同樣設置了自恢復啟動,但是自恢復啟動有次數,只有五次。如果5次都沒有啟動成功,電機將停止轉動。不會啟動。
/啟動堵轉保護 void US_vSysStuck_in(void) // 堵轉保護啟動5次 { if ((USER_stuck_in.locked_rotor_flag == 1) || (ErrorCode == 3)) // 檢測如果觸發了一次堵轉保護之后 電流大于額定值都沒有啟動 { USER_stuck_in.locked_rotor_flag = 0; USER_sSysStateErr.uSystemError.overStuck_in = true; // 啟動堵轉標志 USER_sSysStateErr.uSystemError.GlobalErrorFlag = true; // 全局錯誤標志位 USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; // 跳入錯誤判斷 USER_sADSampleAll.s16VSPLPF = 0; // 清空一下電位器 USER_stuck_in.Phase_Stuck_num++; // 啟動堵轉報警加1 } }
4):速度異常保護
檢測目標速度和實際速度之比,如果較小或者較大就是速度異常
//速度異常保護 float value; void US_vSysSPEED_ERRORCheck(void) // 速度異常保護 { if (USER_sADSampleAll.s16VSPLPF > 2500) // 啟動之后 { value = (float)USER_sADSampleAll.s16VSPLPF / (float)USER_sADSampleAll.s32SpdUse; if ((value > 1.5) || (value < 0.5)) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount++; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount >= UPDS_SPEED_IDLER_MS) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = UPDS_CARRYING_IDLER_MS; USER_sSysStateErr.uSystemError.over_speed_error = true; USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; } } else { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount--; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount <= 0) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = 0; USER_sSysStateErr.uSystemError.over_speed_error = false; } } } }
5):空載保護
空載保護是不讓水泵電機空轉,檢測方法是檢測電流大小,如果在水里,電流會比較大,只需要在速度達到某一點時,檢測電流的大小就可以實現。
//空載保護 void US_vSyscarrying_idlerCheck(void) // 空載保護 { if (USER_sADSampleAll.s32SpdCommand > 3000) // 啟動之后 { if ((USER_sCurrentAll.IdcValue) < UPDS_CARRYING_IDLER_MAX) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount++; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount >= UPDS_CARRYING_IDLER_MS) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = UPDS_CARRYING_IDLER_MS; USER_sSysStateErr.uSystemError.overload_protection = true; USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; } } else { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount--; if (USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount <= 0) { USER_sSysStateErr.sSysTime.s32OverIdcFirstlevelCount = 0; USER_sSysStateErr.uSystemError.overload_protection = false; } } }
調試部分
下載程序即可上電調試;
接上電機的UVW三相,記得在代碼中設置一下分壓電阻,電流采樣的電阻(如果沒有更改就不需要更換)。四線插入正確,按下燒錄鍵即可燒錄成功。燒錄后電機就3s緩啟動正常運行起來了。需要檢測電機的UVW三相,如果是如圖9這樣呈現梯形就可以。
4. 小結
以上即為本次無刷電機驅動板設計的全部基本內容。芯源推出的CW32F030系列產品,已全面實現-40℃ 至 105℃超寬溫度范圍和 1.65V~5.5V 超寬工作電壓,面向最廣泛的各種基礎應用。用戶可以根據自己的需求自行更改代碼功能。
審核編輯:湯梓紅
-
芯片
+關注
關注
455文章
50714瀏覽量
423138 -
控制板
+關注
關注
5文章
254瀏覽量
31191 -
無刷電機
+關注
關注
57文章
838瀏覽量
45823 -
CW32
+關注
關注
1文章
203瀏覽量
626
原文標題:【基于CW32的無刷水泵】-- CW-W88水泵通用控制板設計方案
文章出處:【微信號:CW32生態社區,微信公眾號:CW32生態社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論