接上两篇:


【灵动MM32SPIN030C单电机控制器】+(一)使用Motor-DK (MM32SPIN030C)芯片的体验与心得

【灵动MM32SPIN030C单电机控制器】+(二)磁场导向控制-空间矢量调制(SVM)

嘿!小伙伴们,今天我们来聊一个高大上的话题:环保节能!在这个绿色革命的大潮中,新产品得具备更高的高效性能。就拿永磁无刷电机来说吧,得配上高效的电机、电子组件和驱动算法,才能跃升为“高效能先生”!

而灵动微电子这位技术大咖,就推出了一个超牛的解决方案:用MM32 SPIN系列32位微处理器开发的风机无位置传感器FOC弦波驱动!名字很长很高端,但咱们来简化一下:这就是个让电机转得更高效、更稳定的魔法方案!

这个魔法方案包括四大部分:电机驱动硬件的参考设计、软件设计、参数调适说明以及实际运转验证。咱们来一一揭晓它们的神秘面纱!

1. **电机驱动硬件的参考设计**


        * 这部分就像是个拼图游戏,告诉我们如何将各种电子零件拼凑在一起,打造出高效的电机驱动系统。
image.png
2. **软件设计**


        * 嗯,这部分就是给电机驱动系统注入灵魂!通过编程,让微处理器能够精准地控制电机的运行。
3. **参数调适说明**


        * 这部分就像是个烹饪食谱,告诉我们如何调整各种参数,让电机驱动系统的性能达到最佳状态。
4. **实际运转验证**


        * 这一步嘛,就像是试吃环节!我们会让电机驱动系统实际运行起来,看看它的表现如何。

现在让我们来看看这个魔法方案的功能列表吧!哇!支持无位置传感器磁场导向控制(FOC)、SVPWM调制方式、滑模估测器(SMO)……一堆高大上的名词!总之,这些功能就是让电机在各种情况下都能稳定运行,高效节能!

让我们认识一下FOC,全称是"场向量控制"(Field Oriented Control),其实它是一个魔法般的控制器,说白了就是让电机驱动器变成超级大厨,把电机当成一道菜来烹饪。


首先,电机就像是一块待烹饪的肉,被放在厨房里,那就是我们的电机驱动器。电机驱动器呢,就像是一个大厨,手里拿着刀、叉、勺,准备开始烹饪。
image.png
FOC就是指“场向量控制”,相当于大厨的手艺。这个大厨可不好对付,他得通过一系列的翻炒、搅拌、调味,把电机这块肉做得美味可口。


具体来说,这个大厨会先看看电机的状态,就像大厨会先看看食材的新鲜程度一样。然后,他会用一些数学公式,比如PID控制、电压矢量控制等,来调整电机的速度和位置。这个过程就像是大厨用各种调料和烹饪技巧来调味一样。


最后,经过电机FOC驱动的烹饪,电机就会像一个美味的大餐一样呈现在我们面前,无论是口感还是速度都能让我们大呼过瘾。这就是电机FOC驱动的魅力所在!


所以,下次当你听到“电机FOC驱动”这个词时,不要被它的高科技外表吓到,其实它就是一个会烹饪的大厨,让你在享受美味的同时,也能感受到科技的魅力。
来听我讲个笑话!你们知道电机是怎么吃饭的吗?哈哈,其实它吃的是“电压”哦!而且吃得还不少呢,有24V、15V、5V这么多种口味呢!


我们先来聊聊这个硬件参考设计吧。这个设计可是给电机准备了一桌丰盛的大餐!外部24V电源供电,经过降压转换后,给门极驱动IC和MM32 SPIN系列微处理器提供15V和5V的电压。而功率开关管呢,它直接吃24V的电源。


这桌大餐里,有个特别好玩的家伙叫做“可变电阻旋钮”,它转动一下就能改变电压输入,控制电机的转速。是不是很神奇?当输入电压超过0.7V时,电机就启动了;而当电压低于0.4V时,电机就罢工了。这个设计团队还给电机准备了七段转速控制,让电机可以根据不同的命令转出不同的速度。
首先,我们来看看硬件参考设计这部分。这个系统是由外部24V电源供电的,经过降压转换后提供15V和5V的电压。这个过程就像是我们从一个大水管接到家里,然后通过净水器转换成适合饮用的水一样。其中,功率开关管直接使用24V电源,这可是个大家伙,负责驱动电机转动。


接下来,我们用0~5V的电压输入作为速度命令的来源,通过转动可变电阻旋钮(VR1)来改变电机的转速。这个旋钮就像是一个调节水龙头,你可以通过它来控制水的流量。当输入电压值超过0.7V时电机就会启动,低于0.4V时电机就会关闭。这样,我们就可以通过调节旋钮来实现对电机的七段转速控制啦!


在电机启动前,系统会先检测电机的U、V两相的反电动势电压(BEMF),来判断电机是静止状态还是旋转中。这就像是我们先听一下水管里有没有水流声,来判断水管是关着的还是开着的。如果电机是静止的,系统会通过初始位置侦测得知转子位置,然后启动电机运转。这个过程有点像我们打开水龙头前要先确定水龙头的方向一样。
image.png
在电机启动后,系统会通过运算放大器量测三相的相电流Ia、Ib、Ic,并将此信息经过坐标轴的转换后控制电机的力矩电流大小及相位。这个过程就像是我们通过调节水龙头的力度和方向来控制水的喷射效果一样。


电机进入闭回路运转后,运转的角度将由滑模估测器提供,并藉由此获得电机速度的数据。这个过程就像是我们通过一个传感器来检测水的流量和水压一样。如果收到用户传来的电机停止命令,程序并不会立即关闭PWM输出,而是会自行降低目前的转速命令,使实际转速低于参数设定值后才会将PWM输出关闭。这个过程就像是我们慢慢关小水龙头,让水流逐渐减小到关闭一样。


在软件设计方面,有两种框图:开回路驱动电机时的框图和闭回路驱动电机时的框图。开回路驱动时,是由参数设定的开回路目标转速及目标力矩电流命令驱动电机运转;而闭回路驱动时,则是通过滑模角度估测系统来估测转子角度和电机速度。这个过程有点像我们在洗澡时调节水温,开回路就像是我们直接设定一个目标水温,而闭回路则是通过一个传感器来实时检测水温并调节热水器的输出。


最后我们来看看这个滑模估测器是怎么工作的吧!它主要由四个功能方块组成:电流估测器、bang-bang控制与低通滤波功能方块、反正切计算功能方块。这个过程有点像我们在制作果汁冰沙时,先把水果切成小块(电流估测器),然后用搅拌机搅拌(bang-bang控制与低通滤波),最后倒入杯子里(反正切计算)。这样我们就得到了一个估测的转子角度啦 。这个方案是如此的独特和幽默,它简直就像是一个搞笑的马戏团表演!好的,让我们开始吧!
image.png


首先,我们的主角是电机。在电机启动前,我们的MCU(微处理器)会像一个疯狂的科学怪人一样,每一毫秒就测量一次电压。是的,你没听错,是每一毫秒!这就像是一个超级疯狂的电学家在不停地测量电力一样。你猜怎么着?这一切都是为了找出电机的状态和转速。
现在,我们的电机可能是静止的,也可能是顺时针转动的,或者是逆时针转动的。对于每种情况,我们都有不同的启动方式。
首先,如果电机在静止状态下启动,那么事情就会变得非常简单。我们的MCU将按照正常的方式启动电机,就像直接把一个东西扔到空中一样。我们有三个阶段的加速斜率来启动电机,每个阶段都有自己独特的加速度设定参数。一旦电机的速度达到第一个临界转速,加速度就会从第一阶段切换到第二阶段。当速度达到第二个临界转速时,加速度又会切换到第三阶段。最后,当电机的速度达到我们设定的目标转速时,它就会进入闭回路运转。
但是,如果电机在顺时针旋转状态下启动呢?哦,我的天哪!事情会变得非常复杂!如果顺时针旋转的速度大于一个特定的参数值,那么电机就会直接进入闭回路运转。这就像是一个杂技演员直接跳入空中翻筋斗一样。但是如果顺时针旋转的速度不足,那么电机就会进入开回路控制并加速到设定的开回路速度,然后再进入闭回路运转。
image.png
最后,如果电机在逆时针旋转状态下启动呢?哦,我的天哪!事情会变得更加复杂!此时,我们的MCU将首先判断电机的初始转速是在哪个区间内。如果初始转速在两个临界转速之间,那么电机将以第二阶段的加速度上升。当速度达到第三个临界转速时,加速度会切换到第三阶段。然后,当速度超过另一个参数设定的值时,电机就会进入闭回路控制。
这就是我们的电机启动方案!它就像是一场疯狂的马戏表演,充满了幽默和惊喜!想象一下电机正在忙碌地运转着,突然,我们的ADCM/PWM中断程序就像一个超级英雄一样冲进了舞台!它的使命是在电机运转时,通过2 Shunt R的方式侦测相电流。在这个过程中,PWM周期点会产生硬件触发,对相电流Ia和Ib进行ADC转换。一旦转换完成,硬件会自动产生一个ADC中断。而在1 Shunt R的方式上,软件会像一个聪明的导演一样,选择合适的二相上臂PWM下缘触发ADC转换。然后,在PWM周期点中断内,将ADC量测的结果重组为Ia、Ib、Ic三相电流。
哈哈,听起来是不是有点像一场精彩的电影?但是,别急,这还不是最精彩的!在这个ADC/PWM中断内的子程序里,我们会依次执行一系列的功能,包括取得三相电流值、取得电机运转角度、执行Clarke运算和Park运算等。这些运算过程可以帮助我们将电机的电流和坐标进行转换,从而更好地控制电机的运转。
现在,让我们来看看system_time_management()这个函数。在这个函数里,我们有1/2/10/50/100/500毫秒可固定执行一次的循环。在每个循环里,我们都会执行一些特定的软件功能。例如,在1毫秒执行一次的循环中,我们会启动电机前检测电机的初始状态、检测转子初始位置、计算电机启动后的加速度/力矩命令以及根据用户输入的目标转速和设定的加速度值计算实时的速度命令值。
总的来说,ADCM/PWM中断程序就像一个精心编排的舞蹈,各个步骤紧密配合,让电机能够优雅地运转起来。而system_time_management()函数则像是一个严谨的时间管理者,确保每个步骤都能在准确的时间点得到执行。
image.png
希望这场关于ADCM/PWM中断程序的幽默讲解能让大家在轻松愉快的氛围中掌握电机运转的奥秘!让我们笑声中探索更多的工程知识吧!想象一下电机正在运转,我们的程序就像一个聪明的指挥官,不断地调整电机的运转状态。在2毫秒执行一次的循环中,这个指挥官会依次执行三个主要功能:
1. 利用角度估测器提供的角度值估算出电机的速度,这就像是用一个神秘的"时光机"来预测电机的未来速度。
2. 根据电机的实际转速调整角度估测器的滤波参数值Kslf,这就像是为电机安装了一个"自动驾驶仪",帮助它更好地调整自己的运转状态。
3. 侦测电机的堵转情况并进行保护,这就像是给电机安装了一个"安全气囊",在关键时刻保护它不受伤害。
而在10毫秒执行一次的循环中,这个指挥官只有一个主要任务:在电机闭回路运行时,利用速度命令和回授的转速经过速度的比例-积分(PI)控制器计算后得到控制力矩电流大小的命令值Iq。这就像是为电机注入了一剂"魔法药水",让电机能够更好地响应我们的控制命令。
image.png
接下来,在50毫秒执行一次的循环中,这个指挥官会依次执行两个主要功能:
1. 利用用户输入的电压值产生电机的启动/停止及速度命令,这就像是给电机装上了一个"智能大脑",能够理解用户的意图并作出响应。
2. 依据电机的实际转速调整电流比例-积分(PI)控制器的积分器参数Ki。这就像是给电机的"魔法药水"加入了不同的调料,让它在不同的转速下都能保持良好的运转状态。
image.png
让我们再来谈谈转子初始位置侦测设定参数。这个设定参数就像是一把魔术钥匙,用来开启电机的大门。参数ENABLE_ROTOR_IPD_FUNCTION就像是启用了一个"时光机",用于在启动前侦测转子的初始位置。而ROTOR_IPD_TARGET_CURRENT则是这个"时光机"的能量来源,设定了侦测时小幅扰动风机叶片的弦波电流振幅大小。而ROTOR_SMALL_SWING_TIME和ROTOR_IPD_DETECT_TIME则分别设定了扰动叶片的时间和侦测所需的时间。在所有这些参数中,ROTOR_IPD_BEMF_SUM_MINI是最有"脾气"的一个,它设定了初始位置侦测时(绝对值BEMF U + 绝对值BEMF V)需要大于这个设定值,否则此次初始位置侦测无效。
接下来,我们来看看最大功率限制的设定。ENABLE_ISUM_MEASUREMENT和ENABLE_MAX_POWER_LIMIT这两个参数就像是电机的"安全阀",控制着电机的总平均电流和最大功率。而MAX_POWER_LIMIT则像是一个"能量守恒器",当电机运转时的总耗电功率大于设定值时,程序就会降低转速直到功率小于此设定值。
再来看看错误码处理的设定参数,它们就像是电机的"急救包",用来处理电机的各种错误。MAX_ERROR_ACCUMULATIVE_TOTAL是电机的"生命值",当电机运转连续错误的次数大于等于设定值后,就不会再次自行重新启动电机,需要等到收到使用者发出停止命令后才可以再次启动电机。而ERROR_RESTART_WAIT_TIME则设定了当电机运转发现错误后停机需要等待的时间后才允许再次启动电机。首先,我们来了解一下"转子初始位置侦测设定参数"。这一部分可是非常关键的哦!因为我们要知道电机的初始位置,才能更好地控制它。那么,我们就来看一下这些神秘的参数吧:
第一个参数是"ENABLE_ROTOR_IPD_FUNCTION",它的作用是开启启动前转子初始位置侦测功能。简单来说,就是给电机装上一个"GPS",帮助我们找到它的初始位置。这个参数的名字听起来就很高大上,那么我们当然要把它设置为"Enable"啦!
接下来是"ROTOR_IPD_TARGET_CURRENT"。这个参数是用来设定小幅扰动风机叶片的弦波电流振幅大小的。它的单位是0.1安培,你们知道吗?在初始位置侦测时,这个电流会小小的扰动一下叶片,然后程序就会通过这个小小的扰动来判断电机的初始位置。这个设定范围可不要超过所使用的功率开关管限流值哦,我们来看看参考设定值是多少呢?哇,是15!看来这个电流大小真是恰到好处呢!
再来看"ROTOR_SMALL_SWING_TIME"和"ROTOR_IPD_DETECT_TIME"。这两个参数是用来设定初始位置侦测时小幅扰动风机叶片的时间和之后进行初始位置侦测所需的时间的。这两个时间设定范围建议在40ms到100ms之间。当然,具体的设定值还是要根据实际情况来决定哦!
最后是"ROTOR_IPD_BEMF_SUM_MINI"和"ROTOR_IPD_MAX_FAIL_TIMES"。前者是用来设定初始位置侦测时(绝对值BEMF U + 绝对值BEMF V)需要大于此设定值,否则此次初始位置侦测无效。而后者则是用来设定初始位置侦测连续失败次数大于此设定值后,程序将会强制进行开回路运转,达到设定的开回路最大转速值之后,进入闭回路运转。这两个参数的参考设定值分别是50和10。看来我们的电机可是非常聪明呢,能根据实际情况做出相应的调整!
image.png
我们来了解一下PI_CURRENT_Kp_VALUE这个参数。它是电流环PI控制器的比例参数值Kp设定,范围是1到32767。就像我们调整音量一样,这个参数可以调整电流控制的敏感度。参考设定值是24000,听起来像是一个音响的音量,不过我们可以根据你的需求进行调整哦!
接下来是PI_CURRENT_Ki_MAX_VALUE和PI_CURRENT_Ki_MIN_VALUE这两个参数。它们分别是电流环PI控制器的积分参数值Ki的最大值和最小值设定,也是1到32767的范围。Ki在这里就像是一个积分器,帮我们计算误差累积。不过这个Ki值会根据电机转速改变哦,具体改变的方式请参照子程序PI_Current_Ki_Modulate_By_Speed_Motor1(),这个子程序每50ms执行一次。
还有一个参数是PI_OUT_LIMIT,这是电流环PI控制器输出Vd、Vq的最大限制值设定,范围是1到32767。就像我们限制电视信号强度一样,这个参数可以避免输出过大导致电机受损。参考设定值是28000,听起来也很像电视信号强度哦!
现在我们来看滑模估测器的设定参数。首先是F_SMO_VALUE和G_SMO_VALUE,它们是电流估测器用的电机常数值F_SMO和G_SMO的设定,范围是1到65535。这两个参数就像是我们估算电流的"听诊器",帮我们听电机的声音!
最后是SMO_Kslide、SMO_Kslf_MAX_VALUE和SMO_K sifg 这些参数。它们分别是滑模角度估测器的增益值Kslide、数位滤波参数Kslf的最大值和最小值设定,范围是1到32767。这三个参数就像是我们在控制电机时的"魔法棒",可以改变电机的运转状态。不过这些参数会根据电机转速改变哦,具体改变的方式请参照子程序SMO_Kslf_Modulate_By_Speed_Motor1(),这个子程序每2ms执行一次。
这个解决方案支持1~8对极的电机,转速范围是100~7200RPM。输出功率也是非常可观的,1~100W都可以。电流采样方式灵活多样,可以根据需要选择1或2个Shunt R进行采样。而且还有转子初始位置侦测、顺逆风启动、有/无负载启动等多种启动方式供你选择。更重要的是,它还具备过流、堵转、总功率限制等多种保护功能,确保电机的安全。
image.png
我们来实际运转验证一下这个解决方案。使用Keil C开发软件,代码大小小于18KBytes,运行时间根据采样方式不同有所差异,但都非常迅速。这个解决方案就像是一位超级英雄,以极快的速度和极高的效率,让你的电机转得又快又稳。

总的来说,这个高效电机驱动解决方案就像是一位大厨,把硬件和软件巧妙地搭配在一起,为你的电机提供了一道美味可口的大餐。它不仅高效,而且灵活多样,可以满足你的各种需求。那么,你准备好品尝这道大餐了吗?让我们一起来探索这个高效电机驱动的世界吧!
谢谢!
本人在本论坛内的试读[经验] :
《Proteus实战攻略》+7 第五章双足机器人仿真实例
《Proteus实战攻略》+6 第四章AVR单片机仿真
本人在本论坛内的帖子:
【灵动MM32SPIN030C单电机控制器】+(二)磁场导向控制-空间矢量调制(SVM)
【灵动MM32SPIN030C单电机控制器】+(一)使用Motor-DK (MM32SPIN030C)芯片的体验与心得
我希望这些内容能对您有所帮助!
还没吃饭
2023年12月9日