本帖最后由 grhr 于 2020-3-1 14:48 编辑
这几天真是加班加点,为了实现一个无刷电机的驱动,最终实现了无刷电机的控制。
话不多说,直接上最终的图,为了具体说明,我将图进行了标注方便下文的讲述。
整个系统如上图所示。可以看到,真的接了很多很多线哇。花了蛮久的时间搭建起来的,我就不破坏环境去重新分解一个个讲述了哈。
图中的电机轴上使用了一个绝缘胶布,可以看到,电机在嗡嗡的转着。
为了表征系统的稳定性,这里使用在网上买的数码管,予以显示控制电机的实时占空比。
总共分为四个部分:
(1)核心主控:STM32F072 discovery开发板。即下面这个板子。
这个板子是在21ic上2016年获得的,在此非常感谢二姨家。
板子将STM32F072芯片的所有引脚都引出来了,给我的开发提供了非常好的资源,有更多的资源去做自己想做的事情。
(2)TI驱动板:使用的是BOOSTXL-DRV8301,长的如下所示:
这里使用的核心驱动芯片是DRV8301,他是一个内置LDO的驱动芯片,通过SPI驱动电管配置,完成电机驱动功能的芯片,相对而言功能还是比较强大的。
(3)执行机构,就是BLDCM了,无刷直流电机,使用的位置传感器为Hall传感器。
(4)为了即使看电机的实时运行状态,使用数码管实时显示占空比。就怕跑飞了。数码管是在网上买的,正反面分别为
这个小板子对外界是SPI通信,内部使用两个74HC595进行锁存,,就能很好的锁存数码管的段选和位选信息。
好了,资源介绍完毕,现在开始介绍我怎么搭建的了。
(1)分配STM32F072的pin资源。
这是非常头痛的工作,首先要考虑每个pin脚的电压承受能力,有些引脚只能承受3.3V的,不能上5V的,有些pin脚还需要支持捕捉跳变沿的,如Hall传感器的引脚。分以下几方面看:
1.STM开发板和电机交互的信息是Hall位置传感器,因为板子上没有上拉,而hall需要上拉才能输出高低电平,所以这里使用内置上拉,且具有捕获功能,所以锁定TIM2的捕获引脚,且一定要配置为上拉功能。然后通过位置信号来计算转速,从而判断是给电机升速和降速。
2.STM开发板和驱动板的交互信息比较多。有三相上下桥臂的PWM驱动信号,共6路。有给DRV8301提供SPI通信接口,以满足内部芯片的驱动要求。
DRV8301除了六路PWM驱动以外,还有一个保护功能,即如果检测不到驱动信号为高电平时,是不能驱动MOS管的,这个信号我之前没有注意,电机一直转不起来,我花了很久很久才定位到这个问题,因此还需要STM32开发板给驱动板一个使能信号,动力才能输出来。
3.STM32开发板还需要和数码管小板子进行通信,通信接口也是SPI接口,不过这里因为不需要返回数据,所以可以省去SPI通信接口中的一根线。
正因为有这么多的信号,所以上图中接了一堆线。在分配引脚的时候,需要不断考虑各个资源之间的矛盾关系,牵一发则动全身,最终达到理想的效果,所有的功能都可以实现。
(2)代码的撰写
可能还是那句话,我的技术水平不是很好,我使用的还是STM32的标准库,因为真的不适应cube库,我使用cube库,让数码管显示一个数字都废了好多天,还是放弃了。这里就不贴代码了,以免影响大家看帖子的心情。简单说说我的代码实现的架构。
这里使用Timer1产生PWM波,timer2捕获Hall信号,timer6实时更新占空比,各家负责做好自己的事情,相互不打扰。这样大家都开心
驱动板方面,我一直没有用过这个DRV8301,比较不适应,对立面的配置,需要在短时间内快速的看到手册的关键数据。这个芯片需要配置运行模式,因为内置电流采集,还需要配置内部的采集gain值,为了保护还要设置保护电流等。只有完成配置以后,才能用它。
(3)调试
起初没有使用Hall的滤波,霍尔传感器一旦有干扰,电机就都得不行,加入了一些滤波措施问题得以解决。
电机转速计算,使用的是T法,其实最终评估下来精度也不是很好,不知道是不是我这边做的不算很好的原因。
顺便还将之前的74HC595的一些驱动使用了起来,实时显示占空比。
经过一番猛如虎的操作,最终成功实现了电机的转动。电机比较稳定运行在1500rpm。
短短一天半,用时大约19工时多,为自己点赞。哈哈。
|