基于CW32的无刷直流空心杯电机无感方波控制驱动方案
01 方案概述
本方案采用CW32F030C8T6作为主控芯片,采用无感方波控制算法控制无刷直流空心杯电机。CW32F030C8T6是一款高性能、低功耗的32位微控制器,具有丰富的片上外设资源,可以适合用于电机控制。无感方波控制算法是一种简单有效的电机控制算法,不需要使用霍尔传感器,可以降低硬件成本。
本次采用的电机驱动板仍然为CW32_BLDC_EVA V5开发板,具体开发板的信息可以翻看上一节《基于CW32的无刷空心杯电机有感控制驱动方案》,采用的空心杯电机与上一节有所不同,这次使用的空心杯电机的额定电压为 24 V。
由于本次采用无感方案,所以只需要将 U、V、W三相电源接上即可,并且三相的顺序并无强制要求,下面我们重心将放在对于无感方波控制的原理部分。
02 无感方波控制原理
无感方波控制(Sensorless Square Wave Control)是一种用于无刷直流电机(BLDC)驱动的控制方法。与传统的有感控制方法相比,无感方波控制不需要使用位置或速度传感器来反馈电机状态,而是通过检测电机自身的悬空相反电动势变化(Back Electromotive Force,简称BEMF)来实现控制。
在无感方波控制中,通过检测电机的悬空相电压的过零点,可以推断出电机转子的位置,根据转子位置进行步状态的切换即可控制电机转动。
2.1 梯形波
无感方波的驱动电路采用三相全桥逆变电路,在理想的情况下,三相全桥逆变电路的电压波形如下图2-1所示,每相导通角度为120°,相与相之间相隔120°。
无刷直流电机驱动所需的电流波形也是上图里的方波,因为电机存在漏感 L ,定子电流会有一定的上升和下降时间,所以使得理想的方波变成了梯形波。
从图2-2中可以看出,无刷直流电机实际运行时的三相电压波形并不是图2-1里的方波,而是梯形波。由于采用了脉宽调制计数(PWM),所以波形看上去由一道道脉冲组成。
2.2 确定换相信号
无感方波驱动与有感最大的区别就在于获取换相信号的方式不同,有感方波通过检测三相霍尔信号的电平,再根据三相电平确定电机此时应该运行在的步状态;无感方波是检测梯形波“斜线”上的反电动势电压来确定换相时刻。霍尔信号对应的相是确定的,所以电机的供电相也要根据霍尔相的顺序来连接,而无感方波驱动只需要检测“斜线”上的“过零点”确定换相时刻后自动换相到下一步状态,而每一个步状态对应事先已经安排好的开关管通断,所以电机的供电相可以随意连接。
PA0、PA1、PA5分别对应CW32F030 ADC的0、1、5通道,我们使用ADC采集三相的电压,但在“过零点”比较中我们实际使用的是未导通相,即悬空相的电压。
2.3电机驱动思路
1.驱动电机旋转的原理与上一章有感驱动的原理相同,本质上是对电机定子的通电情况进行控制,也称为换相。这里我们结合上一章霍尔传感器的信号波形与电机运行时的三相电压波形来看,如下图。
我们将电机运行状态分为三种:停止、启动、运行,其中停止状态不需要过多关注。首先是电机的启动,启动状态首先要对转子进行定位,因为电机在停止时转子可以在任何位置。确定转子的位置可以给某一步状态对应的 MOS 管通电,等待一小段转子复位的时间后,转子就在此步状态中,然后进入启动阶段。
无感电机的启动也称为“强拖”,以复位时的步状态为基准,手动换步,之后若检测到 “过零点”,则切入第三种正常运行的状态,如果没有检测到,则提高占空比再手动换步,尝试一定次数后如果没有成功则电机启动失败。
正常运行状态时,在每次输出 PWM 脉冲时由比较器触发 ADC 采样,根据当前步状态确定要使用的反电动势在哪一相。取得反电动势后需要判断是否已经来到 “过零点”,这里还需要判断当前步状态是电压上升还是下降状态:上升状态需要判断反电动势大于 “过零点” 值,下降状态需要判断反电动势小于 “过零点”值。还需要注意的是,ADC的采样时刻的选择会影响到 “过零点”值的大小:如果是在 PWM 高电平时采集,则过零点值为电源电压的一半;低电平时的比较值需要自己根据实际大小去调试。通常在 PWM 占空比大于 50% 时采样高电平,低于 50%时采样低电平。
暂时无法在飞书文档外展示此内容
在检测到 “过零点” 之后,需要延迟一定的时间再进行换相,以保证电机的转矩。延迟时间由定时器记录的上次换相到本次换相的时间间隔,取其部分大小作为延迟时间。
注意,电机在换相时由于新的电流通路的建立,电压在换相处会产生尖峰毛刺,此时进行 ADC 电压采集到的数据是不准确的,所以在换相后还需要进行退磁状态的判断,如果处于退磁状态,则本次不采样。
03 软件设计
3.1MCU资源分配
本次使用到的CW32内部资源如下:
ATIM :CH1、CH2、CH3 三个通道比较产生 PWM 波用于驱动电机,CH4为芯片内部通道,无外部引脚,只有一路比较捕获寄存器 (ATIM_CH4CCR),且只能用于比较,不能用来捕获。我们使用 CH4 的比较功能触发 DMA 传输。
DMA :使用4路 DMA 通道:CH1、CH2、CH3、 CH4:
1 .CH1 将 ADC 单次单通道的采样结果传入 RAM
2 .CH2 将 ADC 的 CR1 寄存器的配置值从 RAM 传入寄存器
3 .CH3 将 ADC 的 START 寄存器的配置值从 RAM 传入寄存器
4 .CH1、CH2、CH3由 ADC 硬件触发,CH4 由 ATIM 硬件触发,启动 ADC
ADC :ADC 采样的时钟设置需要与 PWM 载波频率结合,计算采样时间;采用单通道单次采样,首次采样由 ATIM 硬件触发,ADC 转换完毕后触发 DMA 传输,通过 DMA 传输自动改变采样通道。这样设置可以实现 ATIM 触发一次就采样五个数据(U、V、W 相电压、母线电压、外部电位器调速电压)
BTIM1 :BTIM1 设置 1ms 进入一次中断,在中断里改变标志位实现主程序的控制
BTIM2 :BTIM2 作为换相时间间隔的记录定时器,决定延迟多长时间后换相
BTIM3 :BTIM3 设置中断,在中断里完成退磁和换相
3.2 部分重要程序介绍
操作 ATIM CH4 的 CCR 寄存器,可以选择 ADC 在一个 PWM 周期内不同位置的采样:
CW_ATIM->CH4CCR=(数字);
首先是核心函数:调制换相
1 /*step,为当前换相序号,PWM_ON_flag=1时启动PWM输出
2 **Step_Last,记录上一次步状态用于 PWM 占空比的刷新
3 **Step_Time,记录上一次换相时间
4 **Flag_Start_OK,判断电机是否启动成功
5 **Flag_Demagnetize_State,判断退磁状态,1:需要退磁;2:退磁完成;3:检测到过零点,可以换相
6 **HALLcount,记录换相次数用于转速计算
7 */
8 void Commutation(uint32_t step,uint32_t PWM_ON_flag)
9 {
10 if(PWM_ON_flag==0) //不启动则关闭输出
11 {
12 CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0;
13 PWM_AL_OFF; PWM_BL_OFF;PWM_CL_OFF;
14 CW_ATIM->CH4CCR=PWM_TS-800;
15 return;
16 }
17 //关闭下管
18 if(step==0||step==5){PWM_AL_OFF;PWM_CL_OFF;}
19 else if(step==1||step==2){PWM_AL_OFF;PWM_BL_OFF;}
20 else if(step==3||step==4){PWM_BL_OFF;PWM_CL_OFF;}
21 //打开上管
22 if(step==0||step==1){CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=0;CW_ATIM->CH1CCRA=OutPwm;}
23 if(step==2||step==3){CW_ATIM->CH1CCRA=0;CW_ATIM->CH3CCRA=0;CW_ATIM->CH2CCRA=OutPwm;}
24 if(step==4||step==5){CW_ATIM->CH1CCRA=0;CW_ATIM->CH2CCRA=0;CW_ATIM->CH3CCRA=OutPwm;}
25 //打开下管
26 if(step==0||step==5){PWM_BL_ON;}//AB
27 else if(step==1||step==2){PWM_CL_ON;}//AC
28 else if(step==3||step==4){PWM_AL_ON;}//BA
29
30 Step_Last=step;
31 //判断占空比修改采样时刻
32 if(OutPwm>=1200&&Flag_ON_or_OFF==0){Flag_ON_or_OFF=1;CW_ATIM->CH4CCR=300;}
33 else if(OutPwm<1200&&Flag_ON_or_OFF==1){Flag_ON_or_OFF=0;CW_ATIM->CH4CCR=PWM_TS-600; }
34 //记录上一次的换相时间
35 Step_Time=BTIM_GetCounter(CW_BTIM2);
36 BTIM_SetCounter(CW_BTIM2,0);
37 //电机未启动则快速换相
38 if(Flag_Start_OK==0)
39 BTIM_SetAutoreload(CW_BTIM3,Step_Time/8);
40 else
41 BTIM_SetAutoreload(CW_BTIM3,Step_Time/6);//退磁延迟时间
42
43 BTIM_SetCounter(CW_BTIM3,0);
44 BTIM_Cmd(CW_BTIM3, ENABLE);
45 //启动退磁
46 Flag_Demagnetize_State=1;//退磁状态
47
48 HALLcount++;
49 }
接着是第二个核心:换相。
1 /*Direction,电机运行方向,0:步状态012345,1:步状态054321
2 **Cur_Step,电机目前的步状态,步状态正常运行顺序为 012345、543210。0:AB、1:AC ……
3 */
4 void BTIM3_IRQHandler(void)
5 {
6 if(BTIM_GetITStatus(CW_BTIM3, BTIM_IT_OV))
7 {
8 BTIM_ClearITPendingBit(CW_BTIM3, BTIM_IT_OV);
9
10 if(Flag_Demagnetize_State == 1) //说明退磁结束后第一次进入BTIM3中断
11 {
12 Flag_Demagnetize_State = 2; //退磁结束标志
13 BTIM_Cmd(CW_BTIM3, DISABLE);
14 }
15 else if(Flag_Demagnetize_State == 3 && Flag_Start_OK == 1) //退磁完成和启动成功后,决定下一次换相 16 {
17 BTIM_Cmd(CW_BTIM3, DISABLE);
18
19 if(Direction == 0) //与RisingFalling的顺序要对应
20 {
21 Cur_Step++;
22 if(Cur_Step == 6)Cur_Step = 0;
23 }
24 else
25 {
26 if(Cur_Step == 0)Cur_Step = 5;
27 else Cur_Step--;
28 }
29 Commutation(Cur_Step,Motor_Start_F);
30 }
31 }
32 }
过零点比较函数如下,此函数在 ADC 完成五次采样后调用。
1 /*SampleData[5] U反电动势 V反电动势 母线电压 W反电动势 电位器调速电压值
2 **TAB_BEMFChannel[6]={3,1,0,3,1,0};
3 **TAB_RisingFalling[2][6]={//判断此刻电压为上升沿还是下降沿,Rising=1;Falling=2
4 {FALLING,RISING,FALLING,RISING,FALLING,RISING},
5 {RISING,FALLING,RISING,FALLING,RISING,FALLING} }
6 **Flag_ON_or_OFF,高低电平采样标志位
7 **RisingFalling,上升沿下降沿比较标志位
8 **Count_0V,过零点检测计数 STCount = 15
9 **Flag_Confirm,启动确认标志位
10 */
11 void ADC_Process(void)
12 {
13 static uint8_t count = 0; //过零检测计数
14 uint32_t Voltage_Bus = 0; //母线电压
15 uint8_t Flag_0V = 0; //成功检测到过零点标志
16
17 if(Flag_Demagnetize_State != 2)return; //说明退磁未结束
18
19 BEMFConvertedValue =SampleData[TAB_BEMFChannel[Cur_Step]]; //取得反电动势
20 RisingFalling=TAB_RisingFalling[Direction][Cur_Step]; //判断上升沿还是下降沿
21
22 if(Flag_ON_or_OFF == 0)Voltage_Bus = 50; //在PWM低电平时采样则与地比较电压
23 else Voltage_Bus = SampleData[2]; //在PWM高电平时采样则与电源正极比较电压
24
25 if(RisingFalling == FALLING)
26 {
27 if(BEMFConvertedValue < Voltage_Bus)
28 {
29 count++;
30 if(count >= 2) //连续两次都检测到过零,则认为确实过零了
31 {
32 count = 0;
33 Flag_Demagnetize_State = 3; //退磁完成,可以换相
34
35 Count_0V++;
36 Flag_Confirm = 1;
37 Flag_0V = 1; //成功检测到过零点
38 }
39 }
40 else count = 0;
41}
42 else if(RisingFalling == RISING)
43 {
44 if(BEMFConvertedValue > Voltage_Bus)
45 {
46 count++;
47 if(count >= 2)
48 {
49 count = 0;
50 Flag_Demagnetize_State = 3;
51
52 Count_0V++;
53 Flag_Confirm = 1;
54 Flag_0V = 1;
55 }
56 }
57 else count = 0;
58 }
59
60 if(Count_0V >= STCount && Flag_Start_OK == 0)
61 {
62 Flag_Start_OK = 1; //连续检测到固定数量的过零时,认为启动成功
63 }
64
65 if(Flag_Start_OK == 1 && Flag_0V == 1)
66 {
67 Flag_0V = 0;
68
69 BTIM_SetAutoreload(CW_BTIM3,Step_Time/8); //换相延迟时间
70 BTIM_SetCounter(CW_BTIM3,0);
71 BTIM_Cmd(CW_BTIM3, ENABLE);
72 }
73 }
最后是电机的启动部分:
1 /*TimeCountTemp,计时,1ms增加1
2 **Com_time, 启动次数
3 **RAMP_TABLE[64],存储时间的数组
4 */
5 do
6 {
7 if(Direction == 0) //与RisingFalling的顺序要对应
8 {
9 Cur_Step++;
10 if(Cur_Step >= 6)Cur_Step = 0; //以复位时的步状态为基准,手动换步
11 }
12 else
13 {
14 if(Cur_Step == 0)Cur_Step = 5;
15 else Cur_Step--;
16 }
17
18 Flag_Confirm = 0;
19 if(Flag_Start_OK == 0)
20 {
21 Commutation(Cur_Step,Motor_Start_F);
22 }
23 TimeCountTemp = 0;
24 while(TimeCountTemp < RAMP_TABLE[Com_time]) //等待过零点检测
25 {
26 if(Flag_Confirm == 1 || Flag_Start_OK == 1)break; //启动成功则不再执行do.....while里的内容
27 }
28
29 Com_time++;
30 OutPwm+=10; //没有启动则依次提高占空比
31 }while(Flag_Start_OK==0 && Com_time<60 && ErrorCode==0);
32 //跳出循环则 启动成功/超出启动次数/启动报错
04 调试心得
在调试电机的过程中要做好限流保护,电机换相失败会导致其停在某一相,对应的MOS 管持续导通。
退磁延迟时间和延迟换相时间的设置会影响电机的性能,过早地换相会降低电机转矩,过晚地换相会使电机电流过大,效率较低发热严重。
电压比较值的设置同样会造成上一条的影响,在低电平时采样比较的值如果设置过小,会造成上升沿处换相过早、下降沿处换相过晚的后果。
电机的启动需要缓慢进行,不可以将 PWM 的占空比增加过快,否则电机容易换相失败。
BTIM3中断服务程序里的方向检测设置要与数组 TAB_RisingFalling 里的 Rising 和 Falling 顺序对应,否则会启动失败。
由于空心杯电机的内部为三角形接线,在 PWM 低电平时仍保有较多的能量,所以在 MOS 管关断期间的反电动势较高,并且随着转速的增加此电压的大小呈上升态势。对于 “过零点” 电压数据的设置也需要适应这种变化,下图展示了空心杯电机运行在 35000 rpm 时的一相电压波形。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由拾一转载自武汉芯源 微信公众号,原文标题为:【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关推荐
基于CW32的无刷直流空心杯电机有感控制驱动方案
空心杯电机(Hollow-Cup Motor)是一种特殊类型的微型无刷直流电机,具有空心的旋转部分。它通常由外部固定的外壳和内部旋转的空心杯组成。空心杯电机具有较高的功率密度和扭矩输出,适用于一些特定的应用场景,如精密仪器、机器人、医疗设备等。空心杯电机的工作原理是基于无刷直流电机的原理。它采用无刷电机的结构,包括定子(固定部分)和转子(旋转部分)。
基于雅特力AT32 MCU的洗衣机电机控制驱动方案,解锁智能家居新体验
随着人工智能、物联网等技术的发展,传统家电逐渐向智能家电转型。洗衣机作为家庭生活中不可或缺的电器之一,其智能化升级对于提升生活品质具有重要意义。MCU作为电机控制系统的核心“大脑”,肩负着多样化的控制使命。雅特力AT32 MCU以其卓越的性能和完善的电机开发生态,为洗衣机、电动两轮车和电摩等电机应用产品提供高效电机控制驱动方案,并已实现规模量产。
基于CW32控制器的直流电机PID学习套件介绍
PID直流有刷电机控制系统是一款基于CW32F030的应用程序。该系统旨在辅助学生和开发者学习PID控制电机及其参数调整以及嵌入式开发基础。用户可以在此基础上添加多种模块,以实现功能的扩展和增强。
灵动MM32SPIN⸺专注电机控制的MCU和SOC
型号- SPIN080G,MM32SPIN030C,SPIN360C,MM32SPIN06NT,SPIN033A,SPIN590G,MM32SPIN560C,MM32SPIN05PT,MM32SPIN580C,MM32SPIN05TW,SPIN0260,MM32SPIN27PF,MM32SPINEBK,MM32SPIN0230B3NV,MM32SPIN080GN,MM32SPIN06PF,SPIN02XX,MM32SPIN07,MM32SPIN0280,MM32SPIN160C,SPIN533A,MM32SPIN,MM32SPIN560CM,SPIN27,MM32SPIN023C,MM32SPIN06,MM32SPIN05,MM32SPIN0230B1NV,MM32SPIN422C,MM32SPIN0280D4PV,MM32SPIN0280D6PV,SPIN060G,SPIN0250,SPIN080C,SPIN222C,SPIN0290,SPIN040C,MM32SPIN080CN,MM32SPIN0230,MM32SPIN060G,MM32SPIN080C,SPIN0230,MM32SPIN040C,SPIN56XX,MM32SPIN37,MM32SPIN05NW,SPIN580C,SPIN160C,SPIN023C,MM32SPIN05NT,MM32SPIN06PT,MM32SPIN0280D6QV,MM32SPIN360C,SPIN0280,SPIN495C,MM32SPIN030CN,MM32SPIN27NF,SPIN560C,SPIN05XX,MM32SPIN07PF,SPIN07,SPIN06,MM32SPIN05PF,MM32SPIN27PQ,MM32SPIN0230B3TV,SPIN5630,MM32SPIN05PFOP,MM32SPIN27PS,MM32SPIN27PT,MM32SPIN0230B1TV,MM32SPIN37PSD,SPIN05,MM32SPIN533A,MM32SPIN033A,MM32SPIN27,MM32SPIN0280D7PV,MM32SPIN222C,SPIN080X,SPIN422C,MM32SPIN0280DAPV,SPIN030C,MM32SPIN080G
灵动凭借MM32SPIN0230/080G/060G电机控制MCU获“最佳电机控制器解决方案供应商”荣誉
2024年11月21日,在2024电机控制先进技术研讨会(秋季),“2024第五届电机控制技术市场表现奖”年度评选活动上,MindMotion灵动凭借多年在电机控制领域的优秀表现,荣获“最佳电机控制器解决方案供应商”奖,该奖项旨在通过业界共同推荐、评选出电机控制行业内市场表现优秀,具有技术和创新能力的企业。
【经验】基于低功耗系列MCU BAT32G137实现小功率步进电机控制
BAT32G137是中微推出的低功耗系列MCU,主频可以达到48MHZ,本文章主要介绍使用G137上的资源配合步进电机驱动板来实现简单的步进电机的控制。
【选型】APM32F411 MCU的电机控制方案可实现PMSM的无感FOC双电机控制,支持三电阻、单电阻电流采样
面向电机市场,极海半导体APM32F411 双电机控制系统提供了高适用性与高性价比的单芯片控制方案,以满足高端消费电子与工业控制领域的不同需求。随着电机应用产品智能化及物联网升级,极海半导体将持续在产品、方案与支持等各方面寻求创新,为用户打造优质的应用生态环境。
【IC】雅特力发布AT32M412/M416电机控制专用MCU,180MHz主频打造高效能电机应用
近日,雅特力科技宣布推出AT32M412/M416首款高性能电机控制专用MCU,采用高性能ARM®Cortex®-M4内核,高达180MHz的CPU运算速度,内建单精度浮点运算单元(FPU)与数字信号处理器(DSP)。为出行工具、家电及工业控制等应用提供理想选择。
【选型】国产ARM架构MCU用于电机控制,兼容STM32F103RBT6,性能封装基本一致
驱动电机离不开MCU的控制,STM32F103RBT6是一款常用的用来控制电机的MCU。研发过程中部分用户提出要求,希望推荐其他型号作为备选对比,综合评估。本文推荐航顺芯片的ARM架构MCU HK32F103RBT6,封装兼容,参数对齐,满足使用要求。
【IC】电机控制芯片可靠性新标杆,德普三大系列MCU重磅发布!
历经两年潜心研发,德普微电子正式发布三大系列MCU:DPM32M08X旗舰系列、DPM32M05X主流系列、DPM32M03X超值系列,致力打造电机控制芯片可靠性新标杆。
为工业以太网和电机控制而生,先楫HPM6E00跨界MCU开始量产
先楫半导体率先推出了一款专为工业以太网和电机控制而生的跨界MCU产品HPM6E00系列。该系列MCU集成了德国倍福公司(Beckhoff)正式授权的EterhCAT 从站控制器 (ESC: EtherCAT Slave Controller)、高性能RISC-V内核CPU,以及丰富的运动控制外设。
灵动的电机专用MCU MM32SPIN0230系列定位于单电机控制,内部集成具有灵动特色的电机控制功能
灵动推出电机专用MCU——MM32SPIN0230系列,定位于单电机控制,主要针对高速吹风筒、冰箱压缩机、电动工具、风扇、静音吊扇、微型水泵、玩具类电调等应用市场。
【应用】航顺HK32ASPIN02x MCU用于高低压水泵电机控制方案,具有高效率、低噪音、高可靠性及高动态响应等特点
随着物联网、人工智能等技术的不断成熟,水泵智能化程度不断提高,可以实现自动监测、远程控制等功能,大大提高了水泵的运行效率和便捷性。同时,水泵节能技术得到广泛关注。航顺推出基于HK32ASPIN02x系列高低压水泵电机控制方案。
基于CW32的有刷直流电机控制实验二:编码器模式
编码器是一种将角位移或者角速度转换成一连串电数字脉冲的旋转式传感器,我们可以通过编码器测量到底位或者速度信息。编码器从输出数据类型上分,可以分为增量式编码器和绝对式编码器。从编码器检测原理上来分,还可以分为光学式、磁式、感应式、电容式。我们做小车应用的编码器都属于增量式AB相编码器。
电子商城
现货市场
服务
提供是德(Keysight)网络分析仪、信号发生器、频谱分析仪、信号分析仪、电源等仪器维修,支持一台仪器即可维修。具备十年以上维修经验工程师,维修后测试合格率达98%,维修保修期长达三个月。
提交需求>
拥有IC烧录机20余款,100余台设备,可以烧录各种封装的IC;可烧录MCU、FLASH、EMMC、NAND FLASH、EPROM等各类型芯片,支持WIFI/BT模组PCBA烧录、测试。
最小起订量: 1 提交需求>
登录 | 立即注册
提交评论