基于CW32的CW-W88水泵通用控制板设计方案

一、前言
无刷水泵被广泛应用于许多领域,如工业生产、农业灌溉以及家庭应用。它具有高效、可靠和节能的特点,因此备受青睐。但是无刷水泵的供电是一个问题。怎么能随时随地的使用无刷水泵呢?总不能拿一个水泵,还要配一台发电机吧。所以本次我们使用电动车供电,可以满足用户骑车到哪,水泵都可以使用的特点。
在户外的各种场景下,肯定要选择一颗稳定的抗干扰的芯片才行。强烈推荐cw32系列芯片。抗干扰能力值得您的信赖!
cw32f030c8t6支持工作温度: -40℃ 至 105℃;
工作电压:1.65v 至 5.5v
存储容量:  64k 字节flash,数据保持25年@85℃ 8k 字节ram,支持奇偶校验,128字节otp存储器
使用一颗好芯片,为您照亮开发之路!
二、cw-w88水泵通用控制板-方案介绍
简介
cw-w88水泵通用控制板适用于水泵电机抽水控制应用。配合水泵电机,可使用48v或60v电池组(电动车电池组)抽水使用。使用前请将电池充满(电池至少在一半电量以上使用)。控制板具有欠压保护、过压保护、过流保护、无水停止保护、堵转保护,速度异常等功能。可广泛应用于各类水泵抽水控制。
系统功能
电源接线:红色,黑色接电源,不分正负,建议按使用习惯接:红色接正、黑色接负。
相线接线: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) { 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 = 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_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 = 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 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 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 = 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 3000) // 启动之后 { if ((user_scurrentall.idcvalue) = 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 超宽工作电压,面向最广泛的各种基础应用。用户可以根据自己的需求自行更改代码功能。


BOSHIDA电源模块 电源故障管理 防止外部引起的故障
组合逻辑控制器组成结构及工作原理解析
三星豪掷1100亿元赴美建厂,全力赶超台积电
提高锂电池系统能量密度的方法
隔离式多路复用HART1模拟输出电路的功能与应用优势分析
基于CW32的CW-W88水泵通用控制板设计方案
空调制冷系统工作流程图(单位换算、结构、原理)
CIS(CMOS图像传感器)厂商:格科微电子(上海)有限公司简介
边缘计算如何助力军事智能化
微雪电子QFP48 TQFP48 测试座简介
坚果Pro 3手机开启了限时秒杀活动该机搭载骁龙855Plus处理器
小型风能发电装置的原理图
SMT加工表面贴装对PCB的要求
BrachioGraph:树莓派笔式绘图仪
运营商为什么需要率先推出5G
汽车芯片的卡脖子问题要比手机更加严峻、更加重大
鸿利智汇与九洲光电签订战略合作协议
微信小程序真的是微信开创吗?还记得支付宝服务窗吗
税率降了3个点,机器人价格也要降3个点吗?
MEMS加速度计一般用在哪里?