一、前言
無刷水泵被廣泛應(yīng)用于許多領(lǐng)域,如工業(yè)生產(chǎn)、農(nóng)業(yè)灌溉以及家庭應(yīng)用。它具有高效、可靠和節(jié)能的特點,因此備受青睞。但是無刷水泵的供電是一個問題。怎么能隨時隨地的使用無刷水泵呢?總不能拿一個水泵,還要配一臺發(fā)電機吧。所以本次我們使用電動車供電,可以滿足用戶騎車到哪,水泵都可以使用的特點。
在戶外的各種場景下,肯定要選擇一顆穩(wěn)定的抗干擾的芯片才行。強烈推薦CW32系列芯片??垢蓴_能力值得您的信賴!
CW32F030C8T6支持工作溫度: -40℃ 至 105℃;
工作電壓:1.65V 至 5.5V
存儲容量: 64K 字節(jié)FLASH,數(shù)據(jù)保持25年@85℃ 8K 字節(jié)RAM,支持奇偶校驗,128字節(jié)OTP存儲器
使用一顆好芯片,為您照亮開發(fā)之路!
二、CW-W88水泵通用控制板-方案介紹
簡介
CW-W88水泵通用控制板適用于水泵電機抽水控制應(yīng)用。配合水泵電機,可使用48V或60V電池組(電動車電池組)抽水使用。使用前請將電池充滿(電池至少在一半電量以上使用)??刂瓢寰哂星穳罕Wo(hù)、過壓保護(hù)、過流保護(hù)、無水停止保護(hù)、堵轉(zhuǎn)保護(hù),速度異常等功能??蓮V泛應(yīng)用于各類水泵抽水控制。
系統(tǒng)功能
電源接線:紅色,黑色接電源,不分正負(fù),建議按使用習(xí)慣接:紅色接正、黑色接負(fù)。
相線接線:UVW隨機接入電機的相線,試看電機運行方向。如需要反轉(zhuǎn),隨意調(diào)換兩根相線,重新上電即可。
電源電壓接入不能超過70V。上電2S后,電機啟動開始抽水運行(可根據(jù)需求縮短上電穩(wěn)定時間)。速度增到最大功率以后,按設(shè)定的最大功率值控制運行。如果用戶電機功率達(dá)不到設(shè)定的功率,控制板則按電機的最大輸出能力輸出運行。
電機在無水檢測或其它任何故障時,會自動停止運行,且以指閃燈的閃爍頻率指示故障狀態(tài)。
工作參數(shù)
型號:CW-W88
使用環(huán)境:48V或60V電池組
工作電壓:40V~60V
工作電流:48V電池組13A、60V電池組10A
最大功率:600W
控制方式:電流閉環(huán)
尺寸:板子為圓形,直徑8CM,高度3CM。建議至少加3MM厚的散熱器
項目組成部分:
CW32主控芯片:
這是整個項目的關(guān)鍵組成部分,它負(fù)責(zé)控制無刷水泵電機的運行和參數(shù)調(diào)節(jié)。CW32主控芯片具有高性能和低功耗的特點,可以滿足無刷水泵電機控制器項目的需求。
無刷水泵電機:
無刷水泵電機是項目的核心部分,它可以通過電磁感應(yīng)實現(xiàn)轉(zhuǎn)子轉(zhuǎn)動的無刷電機效果。無刷水泵電機具有較高的效率和可靠性,適用于各種應(yīng)用場景。
硬件電路:
包含驅(qū)動電路,電流采集電路,母線電壓采集電路,反電動勢采集電路,電源電路。
軟件編寫:
包含電機驅(qū)動代碼,高壓,低壓保護(hù)及自恢復(fù)。電流保護(hù),速度異常保護(hù),空載保護(hù),啟動堵轉(zhuǎn)保護(hù)。
三、項目設(shè)計說明
硬件設(shè)計及PCB制板
此線控器是基于武漢芯源半導(dǎo)體推出的CW32F030C8T6產(chǎn)品設(shè)計研發(fā)而成的,其主要包括MCU、電源部分、電流采樣、電壓采樣、EG3014驅(qū)動、反電動勢采集等部分,設(shè)計系統(tǒng)原理框圖如圖1所示:
該控制器功能包含:
上電自啟動,緩慢加速。
啟動堵轉(zhuǎn)保護(hù)
速度異常保護(hù)
過欠壓自恢復(fù)保護(hù)
電流保護(hù)
空載保護(hù)
2.設(shè)計原理圖及PCB板實物圖
3.軟件部分
軟件部分主要分為以下幾部分內(nèi)容,軟件構(gòu)成如圖7所示:
狀態(tài)機代碼
switch(USER_sSysStateErr.sSystemState)//狀態(tài)機{ 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; // 開環(huán)模式 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; // 錯誤恢復(fù)判斷 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) // 連續(xù)檢測到固定數(shù)量的過零時,認(rèn)為啟動成功 { 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); } }
電機報警代碼及其自恢復(fù)功能
//(5):電機報警代碼及其自恢復(fù)功能 void US_vSysErrorCheck(void) { US_vSysCurrentCheck(); // 電流報警 US_vSysVoltageCheck(); // 電壓報警 US_vSysStuck_in(); // 啟動堵轉(zhuǎn)保護(hù) US_vSysSPEED_ERRORCheck(); // 速度異常保護(hù) US_vSyscarrying_idlerCheck(); // 空載保護(hù) } void MDS_v_Error_recovery(uint32_t WaitTime) // 錯誤恢復(fù) { 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; }
電機反電動勢及運行代碼
反電動勢過零檢測法基本原理:
忽略電動機電樞反應(yīng),無刷直流電動機在穩(wěn)態(tài)運行過程中,通過檢測關(guān)斷相的反電動勢過零點獲得轉(zhuǎn)子的位置信號,進(jìn)行對逆變器開關(guān)導(dǎo)通順序切換,控制電機運動。
較為典型的 BLDCM 的無位置傳感器控制方法有基于反電勢的檢測法、磁鏈估計法、電感檢測法等,在該系統(tǒng)中采用反電勢過零檢測法。
反電動勢過零檢測法是以直流無刷電機中性點電壓為基準(zhǔn)進(jìn)行反電動勢過零檢測的,屬于間接反電動勢檢測方法。該方法將端電壓作分壓濾 波處理得到直流無刷電機的位置信號,由于有濾波電路存在,獲得的位置信號比真實的反電動勢過零點延時了一定的角度。
在理想情況下,電機三相繞組反電勢 Ea 、Eb、Ec 的波形為梯形波。無刷電機采用 120°導(dǎo)通方式,在任何時刻只有兩相導(dǎo)通,這兩相電流的大小 相等、方向相反,另一相電流為零,故三相電流的 總和為零。
反電動勢零點 | 變化趨勢 |
---|---|
C- | C相反電動勢由正到負(fù) |
B+ | B相反電動勢由負(fù)到正 |
A- | A相反電動勢由正到負(fù) |
C+ | C相反電動勢由負(fù)到正 |
B- | B相反電動勢由正到負(fù) |
A+ | A相反電動勢由負(fù)到正 |
表:正向反電動勢過零點變化
反電動勢部分代碼
//反電動勢部分代碼 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) // 連續(xù)檢測到固定數(shù)量的過零時,認(rèn)為啟動成功 { 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); } }
母線電壓監(jiān)測-分壓電路原理及代碼
可以看原理圖中的分壓電路是兩個電阻
軟件保護(hù)
void US_vSysErrorCheck(void) { US_vSysCurrentCheck(); // 電流報警 US_vSysVoltageCheck(); // 電壓報警 US_vSysStuck_in(); // 啟動堵轉(zhuǎn)保護(hù) US_vSysSPEED_ERRORCheck(); // 速度異常保護(hù) US_vSyscarrying_idlerCheck(); // 空載保護(hù) }
1):電流保護(hù)
在無刷電機運行中,有時候堵轉(zhuǎn)很容易燒mos管,所以電流保護(hù)就尤為的重要。
在程序中配置了電流觸發(fā)保護(hù)值,是15A,因為我們額定功率是500W。還有電流采集電路沒有加入運放,采集不精確,所以需要把電流值設(shè)置大一點。之后也要根據(jù)實際的調(diào)試而改變。
//電流保護(hù) void US_vSysCurrentCheck(void) // 電流保護(hù) { #if (UPDS_ISUM_DETECTION == 1) if ((USER_sCurrentAll.IdcValue) >= UPDS_OVERISUM_limit_MAX) // 一級電流保護(hù) { 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 } /********************限流保護(hù)值***********************/ #define UPDS_OVERISUM_limit_MAX (15) //unit: A 限流保護(hù)值 #define UPDS_OVERISUM_limit_MS (500)//unit: ms 觸發(fā)保護(hù)時間 /**********************報警設(shè)置********************/ #define UPDS_ISUM_DETECTION (1) //電流保護(hù)使能
2):電壓保護(hù)
在高壓和低壓保護(hù)中,我們在程序中加入了自恢復(fù)功能,如果電壓高于58v就會觸發(fā)高壓保護(hù),電機停止,等待電壓下降到55v以下,就會觸發(fā)自恢復(fù)功能,等待自恢復(fù)時間結(jié)束,電機重新啟動。低壓也是同理。
//電壓保護(hù) void US_vSysVoltageCheck(void) // 電壓保護(hù) { #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; // 高壓保護(hù) } } 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; // 低壓保護(hù) } } #endif } /**********************報警設(shè)置********************/ #define UPDS_UDC_DETECTION (1) //電壓保護(hù)使能 /********************電壓保護(hù)值***********************/ #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;過壓恢復(fù)值 #define UPDS_OVERVOLTAGE_VOLTAGE_MS (10.0) //Unit: ms 過電壓持續(xù)時間1ms基準(zhǔn) #define UPDS_UDC_PROTECT_MIN_V (30.0f) //unit: V;欠壓值 #define UPDS_UDC_PROTECT_MIN_V_recover (32.0f) //unit: V;欠壓恢復(fù)值 #define UPDS_UNDERVOLTAGE_VOLTAGE_MS (14.0) //Unit: ms 欠電壓持續(xù)時間1ms基準(zhǔn)
3):啟動堵轉(zhuǎn)保護(hù)
在堵轉(zhuǎn)保護(hù)之中,我們同樣設(shè)置了自恢復(fù)啟動,但是自恢復(fù)啟動有次數(shù),只有五次。如果5次都沒有啟動成功,電機將停止轉(zhuǎn)動。不會啟動。
/啟動堵轉(zhuǎn)保護(hù) void US_vSysStuck_in(void) // 堵轉(zhuǎn)保護(hù)啟動5次 { if ((USER_stuck_in.locked_rotor_flag == 1) || (ErrorCode == 3)) // 檢測如果觸發(fā)了一次堵轉(zhuǎn)保護(hù)之后 電流大于額定值都沒有啟動 { USER_stuck_in.locked_rotor_flag = 0; USER_sSysStateErr.uSystemError.overStuck_in = true; // 啟動堵轉(zhuǎn)標(biāo)志 USER_sSysStateErr.uSystemError.GlobalErrorFlag = true; // 全局錯誤標(biāo)志位 USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState; USER_sSysStateErr.sSystemState = STATE_FAULT_G; // 跳入錯誤判斷 USER_sADSampleAll.s16VSPLPF = 0; // 清空一下電位器 USER_stuck_in.Phase_Stuck_num++; // 啟動堵轉(zhuǎn)報警加1 } }
4):速度異常保護(hù)
檢測目標(biāo)速度和實際速度之比,如果較小或者較大就是速度異常
//速度異常保護(hù) float value; void US_vSysSPEED_ERRORCheck(void) // 速度異常保護(hù) { 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):空載保護(hù)
空載保護(hù)是不讓水泵電機空轉(zhuǎn),檢測方法是檢測電流大小,如果在水里,電流會比較大,只需要在速度達(dá)到某一點時,檢測電流的大小就可以實現(xiàn)。
//空載保護(hù) void US_vSyscarrying_idlerCheck(void) // 空載保護(hù) { 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; } } }
調(diào)試部分
下載程序即可上電調(diào)試;
接上電機的UVW三相,記得在代碼中設(shè)置一下分壓電阻,電流采樣的電阻(如果沒有更改就不需要更換)。四線插入正確,按下燒錄鍵即可燒錄成功。燒錄后電機就3s緩啟動正常運行起來了。需要檢測電機的UVW三相,如果是如圖9這樣呈現(xiàn)梯形就可以。
4. 小結(jié)
以上即為本次無刷電機驅(qū)動板設(shè)計的全部基本內(nèi)容。芯源推出的CW32F030系列產(chǎn)品,已全面實現(xiàn)-40℃ 至 105℃超寬溫度范圍和 1.65V~5.5V 超寬工作電壓,面向最廣泛的各種基礎(chǔ)應(yīng)用。用戶可以根據(jù)自己的需求自行更改代碼功能。
審核編輯:湯梓紅
-
芯片
+關(guān)注
關(guān)注
452文章
50220瀏覽量
420968 -
控制板
+關(guān)注
關(guān)注
5文章
250瀏覽量
31139 -
無刷電機
+關(guān)注
關(guān)注
57文章
818瀏覽量
45696 -
CW32
+關(guān)注
關(guān)注
1文章
174瀏覽量
550
原文標(biāo)題:【基于CW32的無刷水泵】-- CW-W88水泵通用控制板設(shè)計方案
文章出處:【微信號:CW32生態(tài)社區(qū),微信公眾號:CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論