一、前言
無(wú)刷水泵被廣泛應(yīng)用于許多領(lǐng)域,如工業(yè)生產(chǎn)、農(nóng)業(yè)灌溉以及家庭應(yīng)用。它具有高效、可靠和節(jié)能的特點(diǎn),因此備受青睞。但是無(wú)刷水泵的供電是一個(gè)問(wèn)題。怎么能隨時(shí)隨地的使用無(wú)刷水泵呢?總不能拿一個(gè)水泵,還要配一臺(tái)發(fā)電機(jī)吧。所以本次我們使用電動(dòng)車供電,可以滿足用戶騎車到哪,水泵都可以使用的特點(diǎn)。
在戶外的各種場(chǎng)景下,肯定要選擇一顆穩(wěn)定的抗干擾的芯片才行。強(qiáng)烈推薦CW32系列芯片。抗干擾能力值得您的信賴!
CW32F030C8T6支持工作溫度: -40℃ 至 105℃;
工作電壓:1.65V 至 5.5V
存儲(chǔ)容量: 64K 字節(jié)FLASH,數(shù)據(jù)保持25年@85℃ 8K 字節(jié)RAM,支持奇偶校驗(yàn),128字節(jié)OTP存儲(chǔ)器
使用一顆好芯片,為您照亮開(kāi)發(fā)之路!
二、CW-W88水泵通用控制板-方案介紹
簡(jiǎn)介
CW-W88水泵通用控制板適用于水泵電機(jī)抽水控制應(yīng)用。配合水泵電機(jī),可使用48V或60V電池組(電動(dòng)車電池組)抽水使用。使用前請(qǐng)將電池充滿(電池至少在一半電量以上使用)。控制板具有欠壓保護(hù)、過(guò)壓保護(hù)、過(guò)流保護(hù)、無(wú)水停止保護(hù)、堵轉(zhuǎn)保護(hù),速度異常等功能??蓮V泛應(yīng)用于各類水泵抽水控制。
系統(tǒng)功能
電源接線:紅色,黑色接電源,不分正負(fù),建議按使用習(xí)慣接:紅色接正、黑色接負(fù)。
相線接線:UVW隨機(jī)接入電機(jī)的相線,試看電機(jī)運(yùn)行方向。如需要反轉(zhuǎn),隨意調(diào)換兩根相線,重新上電即可。
電源電壓接入不能超過(guò)70V。上電2S后,電機(jī)啟動(dòng)開(kāi)始抽水運(yùn)行(可根據(jù)需求縮短上電穩(wěn)定時(shí)間)。速度增到最大功率以后,按設(shè)定的最大功率值控制運(yùn)行。如果用戶電機(jī)功率達(dá)不到設(shè)定的功率,控制板則按電機(jī)的最大輸出能力輸出運(yùn)行。
電機(jī)在無(wú)水檢測(cè)或其它任何故障時(shí),會(huì)自動(dòng)停止運(yùn)行,且以指閃燈的閃爍頻率指示故障狀態(tài)。
工作參數(shù)
型號(hào):CW-W88
使用環(huán)境:48V或60V電池組
工作電壓:40V~60V
工作電流:48V電池組13A、60V電池組10A
最大功率:600W
控制方式:電流閉環(huán)
尺寸:板子為圓形,直徑8CM,高度3CM。建議至少加3MM厚的散熱器
項(xiàng)目組成部分:
CW32主控芯片:
這是整個(gè)項(xiàng)目的關(guān)鍵組成部分,它負(fù)責(zé)控制無(wú)刷水泵電機(jī)的運(yùn)行和參數(shù)調(diào)節(jié)。CW32主控芯片具有高性能和低功耗的特點(diǎn),可以滿足無(wú)刷水泵電機(jī)控制器項(xiàng)目的需求。
無(wú)刷水泵電機(jī):
無(wú)刷水泵電機(jī)是項(xiàng)目的核心部分,它可以通過(guò)電磁感應(yīng)實(shí)現(xiàn)轉(zhuǎn)子轉(zhuǎn)動(dòng)的無(wú)刷電機(jī)效果。無(wú)刷水泵電機(jī)具有較高的效率和可靠性,適用于各種應(yīng)用場(chǎng)景。
硬件電路:
包含驅(qū)動(dòng)電路,電流采集電路,母線電壓采集電路,反電動(dòng)勢(shì)采集電路,電源電路。
軟件編寫:
包含電機(jī)驅(qū)動(dòng)代碼,高壓,低壓保護(hù)及自恢復(fù)。電流保護(hù),速度異常保護(hù),空載保護(hù),啟動(dòng)堵轉(zhuǎn)保護(hù)。
三、項(xiàng)目設(shè)計(jì)說(shuō)明
硬件設(shè)計(jì)及PCB制板
此線控器是基于武漢芯源半導(dǎo)體推出的CW32F030C8T6產(chǎn)品設(shè)計(jì)研發(fā)而成的,其主要包括MCU、電源部分、電流采樣、電壓采樣、EG3014驅(qū)動(dòng)、反電動(dòng)勢(shì)采集等部分,設(shè)計(jì)系統(tǒng)原理框圖如圖1所示:

該控制器功能包含:
上電自啟動(dòng),緩慢加速。
啟動(dòng)堵轉(zhuǎn)保護(hù)
速度異常保護(hù)
過(guò)欠壓自恢復(fù)保護(hù)
電流保護(hù)
空載保護(hù)
2.設(shè)計(jì)原理圖及PCB板實(shí)物圖





3.軟件部分
軟件部分主要分為以下幾部分內(nèi)容,軟件構(gòu)成如圖7所示:

狀態(tài)機(jī)代碼
switch(USER_sSysStateErr.sSystemState)//狀態(tài)機(jī){
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;//等待啟動(dòng)信號(hào)
case STATE_ALIGNMENT_D: MDS_v_The_motor_starts();break;//啟動(dòng)
case STATE_ADCLOOP_E:MDS_v_OPEN_starts();break; // 開(kāi)環(huán)模式
case STATE_BRAKE_F:MDS_v_brake();break; // 剎車
case STATE_FAULT_G:MDS_v_Misjudgment();break; // 錯(cuò)誤判斷
case STATE_WAIT_L:
MDS_v_Error_recovery(USER_sSysStateErr.sSysTime.u32ReStartTime);
break; // 錯(cuò)誤恢復(fù)判斷
case STATE_STOP_M:Stop_Motor();break; // 停止
default:break;}
電流電壓采集計(jì)算代碼
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;
}
}
電機(jī)啟動(dòng)代碼,判斷啟動(dòng)是否失敗
//(3):電機(jī)啟動(dòng)代碼,判斷啟動(dòng)是否失敗。
void Sensorless_MOTOR_START(void)
{
unsigned char coun = 0;
USER_BLDC.HALLcountS = 0;
USER_BLDC.QDPwm = 20; // 啟動(dòng)占空比
do
{
if (Sensorless_START() == 0)
{
coun++;
USER_BLDC.QDPwm += 5;
}
else
break;
} while (coun < 5 && ErrorCode == 0);
if (coun >= 5 && ErrorCode == 0)
{
ErrorCode = 3;
} // 啟動(dòng)失敗
}
電機(jī)運(yùn)行代碼
//(4):電機(jī)運(yùn)行代碼
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時(shí)刻采集。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++; // 正確檢測(cè)到第三相反電動(dòng)勢(shì)
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++; // 正確檢測(cè)到第三相反電動(dòng)勢(shì)
FFlag = 1;
hx = 1;
}
}
else
{
cou = 0;
}
}
if (USER_BLDC.StCountComm >= STCount && USER_BLDC.StOk == 0) // 連續(xù)檢測(cè)到固定數(shù)量的過(guò)零時(shí),認(rèn)為啟動(dòng)成功
{
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);
}
}
電機(jī)報(bào)警代碼及其自恢復(fù)功能
//(5):電機(jī)報(bào)警代碼及其自恢復(fù)功能
void US_vSysErrorCheck(void)
{
US_vSysCurrentCheck(); // 電流報(bào)警
US_vSysVoltageCheck(); // 電壓報(bào)警
US_vSysStuck_in(); // 啟動(dòng)堵轉(zhuǎn)保護(hù)
US_vSysSPEED_ERRORCheck(); // 速度異常保護(hù)
US_vSyscarrying_idlerCheck(); // 空載保護(hù)
}
void MDS_v_Error_recovery(uint32_t WaitTime) // 錯(cuò)誤恢復(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;
}
電機(jī)反電動(dòng)勢(shì)及運(yùn)行代碼
反電動(dòng)勢(shì)過(guò)零檢測(cè)法基本原理:
忽略電動(dòng)機(jī)電樞反應(yīng),無(wú)刷直流電動(dòng)機(jī)在穩(wěn)態(tài)運(yùn)行過(guò)程中,通過(guò)檢測(cè)關(guān)斷相的反電動(dòng)勢(shì)過(guò)零點(diǎn)獲得轉(zhuǎn)子的位置信號(hào),進(jìn)行對(duì)逆變器開(kāi)關(guān)導(dǎo)通順序切換,控制電機(jī)運(yùn)動(dòng)。
較為典型的 BLDCM 的無(wú)位置傳感器控制方法有基于反電勢(shì)的檢測(cè)法、磁鏈估計(jì)法、電感檢測(cè)法等,在該系統(tǒng)中采用反電勢(shì)過(guò)零檢測(cè)法。
反電動(dòng)勢(shì)過(guò)零檢測(cè)法是以直流無(wú)刷電機(jī)中性點(diǎn)電壓為基準(zhǔn)進(jìn)行反電動(dòng)勢(shì)過(guò)零檢測(cè)的,屬于間接反電動(dòng)勢(shì)檢測(cè)方法。該方法將端電壓作分壓濾 波處理得到直流無(wú)刷電機(jī)的位置信號(hào),由于有濾波電路存在,獲得的位置信號(hào)比真實(shí)的反電動(dòng)勢(shì)過(guò)零點(diǎn)延時(shí)了一定的角度。
在理想情況下,電機(jī)三相繞組反電勢(shì) Ea 、Eb、Ec 的波形為梯形波。無(wú)刷電機(jī)采用 120°導(dǎo)通方式,在任何時(shí)刻只有兩相導(dǎo)通,這兩相電流的大小 相等、方向相反,另一相電流為零,故三相電流的 總和為零。

| 反電動(dòng)勢(shì)零點(diǎn) | 變化趨勢(shì) |
|---|---|
| C- | C相反電動(dòng)勢(shì)由正到負(fù) |
| B+ | B相反電動(dòng)勢(shì)由負(fù)到正 |
| A- | A相反電動(dòng)勢(shì)由正到負(fù) |
| C+ | C相反電動(dòng)勢(shì)由負(fù)到正 |
| B- | B相反電動(dòng)勢(shì)由正到負(fù) |
| A+ | A相反電動(dòng)勢(shì)由負(fù)到正 |
表:正向反電動(dòng)勢(shì)過(guò)零點(diǎn)變化
反電動(dòng)勢(shì)部分代碼
//反電動(dòng)勢(shì)部分代碼
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時(shí)刻采集。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++; // 正確檢測(cè)到第三相反電動(dòng)勢(shì)
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++; // 正確檢測(cè)到第三相反電動(dòng)勢(shì)
FFlag = 1;
hx = 1;
}
}
else
{
cou = 0;
}
}
if (USER_BLDC.StCountComm >= STCount && USER_BLDC.StOk == 0) // 連續(xù)檢測(cè)到固定數(shù)量的過(guò)零時(shí),認(rèn)為啟動(dòng)成功
{
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)測(cè)-分壓電路原理及代碼
可以看原理圖中的分壓電路是兩個(gè)電阻
軟件保護(hù)
void US_vSysErrorCheck(void)
{
US_vSysCurrentCheck(); // 電流報(bào)警
US_vSysVoltageCheck(); // 電壓報(bào)警
US_vSysStuck_in(); // 啟動(dòng)堵轉(zhuǎn)保護(hù)
US_vSysSPEED_ERRORCheck(); // 速度異常保護(hù)
US_vSyscarrying_idlerCheck(); // 空載保護(hù)
}
1):電流保護(hù)
在無(wú)刷電機(jī)運(yùn)行中,有時(shí)候堵轉(zhuǎn)很容易燒mos管,所以電流保護(hù)就尤為的重要。
在程序中配置了電流觸發(fā)保護(hù)值,是15A,因?yàn)槲覀冾~定功率是500W。還有電流采集電路沒(méi)有加入運(yùn)放,采集不精確,所以需要把電流值設(shè)置大一點(diǎn)。之后也要根據(jù)實(shí)際的調(diào)試而改變。
//電流保護(hù)
void US_vSysCurrentCheck(void) // 電流保護(hù)
{
#if (UPDS_ISUM_DETECTION == 1)
if ((USER_sCurrentAll.IdcValue) >= UPDS_OVERISUM_limit_MAX) // 一級(jí)電流保護(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í)間
/**********************報(bào)警設(shè)置********************/
#define UPDS_ISUM_DETECTION (1) //電流保護(hù)使能
2):電壓保護(hù)
在高壓和低壓保護(hù)中,我們?cè)诔绦蛑屑尤肓俗曰謴?fù)功能,如果電壓高于58v就會(huì)觸發(fā)高壓保護(hù),電機(jī)停止,等待電壓下降到55v以下,就會(huì)觸發(fā)自恢復(fù)功能,等待自恢復(fù)時(shí)間結(jié)束,電機(jī)重新啟動(dòng)。低壓也是同理。
//電壓保護(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
}
/**********************報(bào)警設(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;過(guò)壓值
#define UPDS_UDC_PROTECT_MAX_V_recover (54.0f) //unit: V;過(guò)壓恢復(fù)值
#define UPDS_OVERVOLTAGE_VOLTAGE_MS (10.0) //Unit: ms 過(guò)電壓持續(xù)時(shí)間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ù)時(shí)間1ms基準(zhǔn)
3):?jiǎn)?dòng)堵轉(zhuǎn)保護(hù)
在堵轉(zhuǎn)保護(hù)之中,我們同樣設(shè)置了自恢復(fù)啟動(dòng),但是自恢復(fù)啟動(dòng)有次數(shù),只有五次。如果5次都沒(méi)有啟動(dòng)成功,電機(jī)將停止轉(zhuǎn)動(dòng)。不會(huì)啟動(dòng)。
/啟動(dòng)堵轉(zhuǎn)保護(hù)
void US_vSysStuck_in(void) // 堵轉(zhuǎn)保護(hù)啟動(dòng)5次
{
if ((USER_stuck_in.locked_rotor_flag == 1) || (ErrorCode == 3)) // 檢測(cè)如果觸發(fā)了一次堵轉(zhuǎn)保護(hù)之后 電流大于額定值都沒(méi)有啟動(dòng)
{
USER_stuck_in.locked_rotor_flag = 0;
USER_sSysStateErr.uSystemError.overStuck_in = true; // 啟動(dòng)堵轉(zhuǎn)標(biāo)志
USER_sSysStateErr.uSystemError.GlobalErrorFlag = true; // 全局錯(cuò)誤標(biāo)志位
USER_sSysStateErr.sSystemStatePre = USER_sSysStateErr.sSystemState;
USER_sSysStateErr.sSystemState = STATE_FAULT_G; // 跳入錯(cuò)誤判斷
USER_sADSampleAll.s16VSPLPF = 0; // 清空一下電位器
USER_stuck_in.Phase_Stuck_num++; // 啟動(dòng)堵轉(zhuǎn)報(bào)警加1
}
}
4):速度異常保護(hù)
檢測(cè)目標(biāo)速度和實(shí)際速度之比,如果較小或者較大就是速度異常
//速度異常保護(hù)
float value;
void US_vSysSPEED_ERRORCheck(void) // 速度異常保護(hù)
{
if (USER_sADSampleAll.s16VSPLPF > 2500) // 啟動(dòng)之后
{
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ù)是不讓水泵電機(jī)空轉(zhuǎn),檢測(cè)方法是檢測(cè)電流大小,如果在水里,電流會(huì)比較大,只需要在速度達(dá)到某一點(diǎn)時(shí),檢測(cè)電流的大小就可以實(shí)現(xiàn)。
//空載保護(hù)
void US_vSyscarrying_idlerCheck(void) // 空載保護(hù)
{
if (USER_sADSampleAll.s32SpdCommand > 3000) // 啟動(dòng)之后
{
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)試;
接上電機(jī)的UVW三相,記得在代碼中設(shè)置一下分壓電阻,電流采樣的電阻(如果沒(méi)有更改就不需要更換)。四線插入正確,按下燒錄鍵即可燒錄成功。燒錄后電機(jī)就3s緩啟動(dòng)正常運(yùn)行起來(lái)了。需要檢測(cè)電機(jī)的UVW三相,如果是如圖9這樣呈現(xiàn)梯形就可以。


4. 小結(jié)
以上即為本次無(wú)刷電機(jī)驅(qū)動(dòng)板設(shè)計(jì)的全部基本內(nèi)容。芯源推出的CW32F030系列產(chǎn)品,已全面實(shí)現(xiàn)-40℃ 至 105℃超寬溫度范圍和 1.65V~5.5V 超寬工作電壓,面向最廣泛的各種基礎(chǔ)應(yīng)用。用戶可以根據(jù)自己的需求自行更改代碼功能。
審核編輯:湯梓紅
-
芯片
+關(guān)注
關(guān)注
463文章
54009瀏覽量
465969 -
控制板
+關(guān)注
關(guān)注
5文章
299瀏覽量
33228 -
無(wú)刷電機(jī)
+關(guān)注
關(guān)注
60文章
954瀏覽量
49350 -
CW32
+關(guān)注
關(guān)注
1文章
299瀏覽量
1846
原文標(biāo)題:【基于CW32的無(wú)刷水泵】-- CW-W88水泵通用控制板設(shè)計(jì)方案
文章出處:【微信號(hào):CW32生態(tài)社區(qū),微信公眾號(hào):CW32生態(tài)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于CW32的門禁綜合系統(tǒng)
【項(xiàng)目展示】基于CW32的遙控循跡小車
CW32 MCU有哪些系列?
cw32和stm32的區(qū)別
cw32和gd32的區(qū)別
CW32單片機(jī)在智能馬桶的應(yīng)用介紹
基于CW32的CW-W88水泵通用控制板設(shè)計(jì)方案
評(píng)論