基于灵动MM32SPIN27的无刷电机驱动板
各参赛同学们好,现在应该都看过规则啦,第十七届智能车竞赛的极速越野组允许使用无刷电机,并且这个赛题的主控和无刷驱动主控方案都限定使用赞助商“灵动微电子”的MCU,逐飞科技作为灵动微电子的大学计划官方合作伙伴,受灵动微电子委托,在去年12月1日就发布了基于MM32的极速越野组BLDC开源项目,以此更好的支持广大参赛同学学习无刷电机控制技术,更好的做参赛准备,去年12月1日的开源项目可以通过点击以下标题跳转到原文进行查看。
https://mp.weixin.qq.com/s/5IXpJs2btu1jjlJHGtGB7w
既然已经有一个灵动无刷驱动的开源方案了,为什么今天又有开源项目呢?就得从今年3月1日发布的灵动的新增的芯片支持计划说起了,可以通过这篇推文查看:
https://mp.weixin.qq.com/s/LOgciq_JK5rQI24DsTNmAg
同时灵动也希望逐飞能基于灵动提供的两颗电机芯片都制作出无刷驱动方案,一种方案是基于MM32SPIN360,一种方案是基于MM32SPIN27。于是就有了今天的开源项目发布:“逐飞基于MM32SPIN27PS的无刷驱动开源项目”
一、无刷电机原理
无刷电机原理部分咱在这里就不再赘述了,新接触无刷电机或者想要再复习一下无刷电机旋转原理的同学可以看看上一篇灵动的无刷电机开源文章,再来一遍传送门:逐飞基于MM32的极速越野BLDC开源项目
二、SPIN27芯片介绍
2.1、芯片基本参数
本次开源的无刷驱动芯片使用灵动的MM32SPIN27PS作为控制芯片。
这款单片机特点如下:
1.使用高性能的 Arm® Cortex®-M0 为内核的 32 位微控制器。
2.最高工作频率可达 96MHz。
3.包含两个12 位的 ADC,采样速度高达 1MHz。
4.通用定时器5 个、针对电机控制的 PWM 高级定时器2 个。
5.UART 接口2 个、I2C 接口1 个、SPI 接口2 个。
6.针对无刷电机应用内置 3 个运放,3 个比较器。
2.2、芯片特点
2.2.1、PWM高级定时器1/8
该芯片的TIMER1与TIMER8定时器,可以直接输出三路PWM信号或者是三路互补的PWM信号,当是互补的PWM信号时可以设置死区,无刷电机的三个半桥通过我们有三种驱动方式。
方式一:上桥给PWM信号,下桥通过IO控制开启与关闭(逐飞本次开源项目即使用的这种方式)。
方式二:上桥通过IO控制开启与关闭,下桥给PWM信号。
方式三:上下桥都给PWM信号,但是需要注意的是上下桥的PWM信号必须是互补的,因为上下桥不能同时导通,否则出现电源与地短路的情况,由于MOS开关具有延时,所以互补PWM信号还必须设置死区,作用是当其中一个桥关闭之后要延时一段时间再打开另外一个桥,避免出现电源对地短路的情况。插入死区之后的互补PWM信号如下图所示(使用逻辑分析仪采集到的波形)。
2.2.2.单片机集成比较器
该芯片内置三个比较器,如果采用六步方波无传感器的方式驱动无刷电机,那么势必会用到过零检测来判断何时进行换相,内置了比较器也为无传感器控制无刷电机带来了更多的便捷。在使用霍尔有感的方式我们也可以使用比较器来实现自动(这里的自动表示无需代码干预即可实现)堵转保护等功能。
2.2.3.单片机集成运放
该芯片内置了三个运放,可以用于电流检测,使用磁场定向控制(FOC),或者检测线路电流从而判断是否堵转等故障出现,然后及时关闭控制避免硬件出现损坏。内置运放进一步简化了电路降低了制作的难度。
三、硬件原理图
由于单片机内部已经集成了运放、比较器、预驱,因此外围器件选择主要就集中在了MOS管型号的选择上,MOS管我们选择的型号是TPH1R403NL,这款MOS电流高达150A,10V的时候内阻低至1.2毫欧,开启电压低至2.5V左右,性价比较高,因为灵动的电机驱动专用芯片集成功能丰富,所以用它加上MOS就简单的构成了无刷电机驱动硬件方案。具体原理图部分可以看下图,图看不清不要紧,我们稍后会放在Gitee进行开源,下载PDF即可查看。
本次开源的MM32SPIN27PS无刷驱动硬件部分与上次使用MM32SPIN360C的硬件部分基本一致,仅更改了串口调试部分和信号输入输出端口,并且新增了晶振电路,其他部分则未作修改。
四、程序部分
4.1、MM32SPIN27PS无刷驱动开源项目的源码
4.1.1、开源项目的工程目录结构
逐飞Infineon智能车BLDC开源项目的目录结构如下图所示。
CODE文件夹下放置的是逐飞科技精心编写的无刷电机驱动相关代码。
sdk是灵动官方的底层驱动,如果还需要其他的单片机片内外设功能,可以基于sdk文件下的底层自行编写程序实现。
zf_common、zf_driver和zf_device则是逐飞基于MM32SPIN27PS制作的底层库。
user_c文件夹下放置的是主程序及中断文件。
4.1.2、无刷电机驱动需要用到的相关内外设以及驱动代码
无刷电机需要用到的单片机片内外设有:
ADC:主要用于检测电源电压、采集放大时候的母线电流以及相电流
高级定时器1:主要用于输出电机所需要用到的互补PWM信号,并且实现自动堵转保护,无需代码干预,当母线 电流超过设定值的时候,自动关闭定时器输出。
GPIO:主要用于LED指示灯,用于显示各种状态,并且初始化输出方向信息和速度信息的端口。
PWM输入:使用高级定时器8的输入捕获实现对外部PWM信号的周期以及占空比获取。
无刷电机的驱动文件有:bldc_config.h文件用于配置电机参数,例如是否开启闭环、是否开启刹车、最大转速设置。hall文件主要用于检测霍尔的值、换相时间计算、转速计算。motor文件主要用于电机占空比输出、速度计算、速度和方向信息输出。move_filter文件主要用于,对数据进行滑动平均滤波。pid文件主要用于对转速进行速度PID闭环。
4.1.3、主函数及中断函数说明
主函数与中断的文件存放在USER文件夹中,无刷电机控制部分由GTM模块硬件完成,所以并没有代码用于控制无刷电机,中断相关的函数全部放在了isr.c中。
4.2、MM32SPIN27PS无刷驱动开源项目的程序工作流程讲解
为了更清楚的表达起工作流程,整个项目的软件流程绘制了几张流程图,同时也加以文字说明。
4.2.1、主函数流程图
上图为本次开源驱动程序的主函数部分,不难看出来,与上次开源的360C主函数部分基本一致,主循环主要负责将当前电机和驱动板的状态通过LED灯输出,并且将部分电机参数发送到虚拟示波器,因此主函数并不执行电机控制的部分,控制部分通过ADC采集中断来触发。
4.2.2、ADC中断流程图
ADC中断是无刷电机的核心中断,ADC触发采集是由定时器1的通道4占空比更新事件进行触发的,因此ADC中断频率与TIMER1输出的PWM频率是一致的。PWM频率是40KHz,因此ADC的中断频率也是40KHz。
在中断内主要是获取母线电流、相电流、电源电压。母线电流在之后做电流环的时候需要使用到,也可以用于做故障检测,当检测到电流过大的时候,及时关闭输出以保护硬件,相电流可以用于之后做FOC驱动方案的时候提供支持。
扫描霍尔这个流程块中,主要是统计每次换相的时间,如果换相时间过长则认为出现故障此时应该及时关闭输出。当电机正常运行的时候将每次换相的时间都保存在数组内,当得到最近6次的换相时间之后,我们就能知道电机转动一圈所花费的时间,从而就能够计算出电机的转速了。在每次换相的时候更改速度输出引脚的PWM频率,这样外部控制器也能轻松的检测到电机的转速,而无需外加编码器。然后根据读取到的霍尔值计算出下次期望的霍尔值。
霍尔扫描结束之后,开始检查延时换相时间是否到,时间没有到则延时时间减一,延时时间为0的时候开始进行换相动作,这里延时换相的原因是因为在电机高速运转的时候霍尔有滞后导致的,可能有人问为什么霍尔滞后了,你还要延时换相呢?因为我们采用的方法是,当霍尔出现滞后之后,我们换相的时候并不是换到下一相,而是换到了下下相,这样就相当于超前换相了,所以我们需要加一定的延时去匹配,从而得到一个最佳的换相点。
4.2.3、定时器中断流程图
定时器3中断频率为1KHz,主要用于根据DIR引脚设置电机是正转还是反转,然后计算速度曲线,用于实现电机缓慢加速(此功能可关闭),缓慢加速降低电机加速时功率,在调试阶段可以尽量保护车模以及硬件电路。然后进行PI闭环调节,这里主要实现是将我们采集到的电机速度与设置的电机速度求差,将得到的偏差 系数KP得到比例输出Pout,然后对偏差 系数KI并将每次计算出的结果进行求和得到Iout,最终将Pout与Iout相加,然后将相加之后的和输出到占空比寄存器驱动电机运转。其中KP、KI系数可能需要自己再多多调试,以找到更加完美的参数,使得电机运行更加迅速且稳定。
定时器8中断主要作用是用来接收外部PWM信号的周期与高电平时间,然后计算信号的占空比,根据占空比的大小设置电机的转速,从而实现外部控制器来控制电机的转速。
五、逐飞制作的参考学习驱动板及无刷电机推荐
5.1、基于灵动MM32SPIN27的无刷电机驱动学习板使用简介
上图中1-8号标号的含义如下:
1、直流电源接口,使用12V电源供电,建议使用3S电池。
2、控制输入与信息输出端口,PWM引脚是速度调节端口,外部控制器输出PWM,通过调节占空比大小来调节速度。DIR引脚是用于设置电机转动方向的;SPDOUT与DIROUT引脚是输出电机转速信息的,电机转得越快此引脚上输出的信号频率越高,推荐使用单片机采集编码器的接口进行信息采集。SPDOUT连接编码器采集接口的A通道或者连接单片机的计数通道,DIROUT连接编码器采集接口的B通道或者连接方向引脚(具体可以参考编码器采集例程)。
3、SWD调试接口,可以对电机驱动上的单片机烧写程序以及在线调试。
4、无刷电机接口,接入无刷电机的A、B、C三相。
5、无刷电机霍尔接口,连接无刷电机霍尔接口。霍尔接口可通过淘宝搜索“ZH1.5 6P“找到
6、电机驱动使能开关,开关是连接到IO上,通过单片机硬件实现的使能。
7、电源LED灯,给驱动供电时此灯亮起。
8、使能LED灯,打开开关时此灯亮起。
9、运行LED灯,当无刷电机运行时此灯亮起。
10、错误指示LED灯,当无刷电机堵转时此灯亮起。
温馨提示:该驱动板成品仅供学习参考调试,不能直接将成品驱动使用在正式参赛的小车上,正式参赛的无刷电机驱动板需要同学们自行制作并按要求在铜层打上队伍信息。
如果你申请到的是MM32SPIN360芯片,可以根据上一个基于灵动MCU的开源项目来制作自己的无刷电机驱动板,如果你申请到的芯片是MM32SPIN27,可以参考此开源项目来制作自己的无刷电机驱动板。
5.2、无刷电机推荐
前面的推文中有讲到过,我们对很多款电机进行了测试,后面也与其中一家无刷电机的生产商进行了合作,让其定制一款无刷电机供我们竞赛中使用,目前已在现货发售中,逐飞推荐极速越野组使用这款无刷电机,逐飞的开源项目代码和硬件也是以这款电机为样品来进行测试的。
这款电机的参数如下:有感、三槽两极、2860Kv(Kv表示每增加一伏电压电机增加的转速,最高12V)、尺寸36(mm) * 50(mm)、额定功率190W、支持1-3S锂电池供电。
逐飞无刷电机
逐飞无刷电机与驱动接线示意图
温馨提示:此款电机仅为逐飞推荐款,同学们也可以选择自己认为合适的无刷电机,这一点上规则是没有限制的,但建议大家选择有感无刷。
六、总结
最后,上开源项目gitee链接:
https://gitee.com/seekfree/MM32SPIN27_BLDC_Project
打包下载开源库压缩包,就可以愉快的开始玩无刷啦,各位下载之前别忘了帮我们点一点小星星哦,感谢各位的支持。
逐飞会对本开源项目进行持续更新和维护,预计功能上还会继续添加串级闭环的功能,速度环作为外环,电流环作为内环,刹车力度可调节,这样可以不需要曲线计算即可实现电机缓慢加速的功能,通过内部电流环限定电流大小也能更好的保护硬件电路。之后也会尝试使用FOC方案驱动电机。当然,对这些功能有兴趣的同学可以自己提前研究尝试一下,听灵动的电机专家说,这些东西完全搞明白之后,都足够找一份相对不错的工作了。
特别说明:该开源项目仅用于各参赛同学在设计自己的小车时进行参考,硬件和软件都不能够直接拷贝使用在自己的作品中,请大家参考后重新完成硬件和软件的设计制作。
作者:seekfree
文章来源:逐飞科技
推荐阅读
- 灵动微课堂 (第280讲)|MM32F5270 UART实现LIN通信
- 灵动微课堂 (第279讲)|MM32F0160 FlexCAN-FD 通信
- 灵动微课堂 (第278讲)|Keil分散加载文件浅析
- YTM32的循环冗余校验CRC外设模块详解
- 灵动微课堂 (第277讲)|MM32F0160的FlexCAN FD位时间采样点的计算
更多MM32F5系列资料请关注灵动MM32 MCU专栏。如想进行MM32相关芯片技术交流,请添加极术小姐姐微信(id:aijishu20)加入微信群。