前言
做电机控制已有半年时间了,对于电机控制最基础的莫过于六步方波驱动有霍尔的无刷直流电机了(BLDC)。对于底层的一些配置我使用的是cubemx来完成,如果你有cubemx基础更好,没有的话也不用慌,我将把每一步的配置讲明白,让你能够转起来自己的电机。无刷电机运行的原理说到底就是高中物理课程中讲到的电磁感应定律,读者可自己去找个视频看看,这里我就不在介绍电机运行原理了。我将把更多的内容放在实际操作和程序上让你的电机转起来上。
硬件说明
下面的示意图可以看作是电机运行的最小系统,用onenote画的不好请多谅解。MCU接驱动电路有6路pwm,以免示意图太杂乱这里我只画了一路pwm。同样的驱动电路接三相桥那也是6路pwm接到mos管。我简单说下电机的运行,假设你程序上写的是Q1管和Q4管导通了,此时电机接通了电源,转子在磁场的作用下会转动一下,如果在下一个状态时,我让Q3和Q6导通了,转子就可以在惯性的作用下继续转动一下,也就是说我只要连续控制6个mos管的导通状态就可以让电机转起来了。这里需要说下启动,如果你没有写启动程序的话,你需要先自己手动拨一下转子才能让电机转起来。对于方波而言启动是比较简单的,只需要在电机正常运行前先检测一下转子的位置来发对应的pwm波,等到电机启动完成后就切换到正常运行流程即可。如果是做FOC的正弦驱动的话,启动就比较麻烦了,目前各大芯片公司用的大都是高频注入的方式来启动,关于电机启动算法在学术界以及工程界都是很难的课题,我在这就不说这些了,这不是这篇文章的重点,后面我将会写一些FOC的文章,到时再和大家讨论。
转子定位
上面我说了电机如何运转以及pwm发波的情况,现在的问题是发波的规律,要发哪一相pwm的前提是需要知道当前的转子位置,只有知道当前转子的位置发相应的pwm,导通怎么检测转子位置这是电机控制的核心问题。目前最简单的检测转子位置的方波是在转子上安装霍尔传感器,实时检测转子转一圈的位置就需要安装三个霍尔传感器,并且呈120°安装
关于霍尔信号是怎样确定转子位置的,可以参考下面的霍尔信号时序图
把霍尔信号数字化,高电平记为1,低电平记为0,可以得到在一个电角度周期内UVW(101,100,110,010,011,001)有6种状态,写成十进制就是5,4,6,2,3,1。如果你选择的起始信号与我不同的话,得到的信号也会不同,不过在一个电角度周期内最终的编号都一样。不要急,其对应发波状态我等会在下面给出。
互补PWM
至于pwm调制,我就不解释其原理了。在电机控制中首先需要理解下互补pwm。假设有pwm1和pwm2的电平状态完全相反的话,就说pwm1和pwm2是一对互补pwm。
也就是说如果上桥臂的Q1管导通,那么下桥臂的Q2管必然是关闭状态,其他几个mos管的状态同样如此。这里需要注意以下,因为实际的情况下有时候会出现上桥臂Q1管和下桥臂Q2同时导通,情况好的话mos管烧坏。因此需要引入死区的概念,通俗点说就是在pwm电平发生变化时让其延迟几个微秒再变化。cubemx里提供图形化的死区配置,至于定时器参数配置,你可以选择自己的参数,不必和图中一样。
可以看到实际产生的互补pwm还是很不错的
软件设计
说完了硬件方面的就开始说软件配置以及程序编写了。
从硬件说明中可以看出首要问题就是如何让MCU发出6路pwm。stm32f103RCT6总共有8个定时器,其中有两个高级定时器TIM1和TIM8都可以产生三路互补pwm,这里我用的是TIM1,当然你也可以用TIM8来产生pwm(实际使用时请结合自己的硬件电路来选择)。具体的cubemx配置如下图所示。
说完了三路互补pwm配置的配置,下面就开始配置HALL信号检测了,我采用的是外部中断的方式来检测霍尔信号
配置为上升沿和下降沿触发,没有上拉和下拉。
最终的配置图可以参考下面我给出的图
这里我用电位器来调速,其实就是根据电位器来改变pwm的占空比调节电机转速的,因为我的电位器与PA1口的(ADC1通道1)相连,你们根据自己的硬件电路设置即可,完成配置,生成工程文件后就开始写程序了。
首先编写ADC读取电位器程序
由于读取的数据是12位的,不能直接用来调节pwm的占空比,我现在是希望简单的线性调速,因此做个比例运算 DutyCycle = (ADC_Value * 1000 ) >>12即可
下面就是霍尔信号读取函数了
直接读取IDR寄存器的值,将其处理后即可得到霍尔信号了
无奈我的示波器只有两个通道,无法测第三相的霍尔信号了。
可以在调试界面看到霍尔信号的变化
完成了上面的任务后,我们就可以编写发波函数来启动电机了。首先要明白发什么波,依照我上面说的电机运行规律,填上楼上挖的坑,给出发波规律表
根据上面的霍尔信号发波表编写程序即可
限于篇幅,我就只给出霍尔信号为5的发波程序了,其余的读者可自行编写。
写完电机运行函数之后,在刚刚的外部中断里或者主函数里调用它,接上电机功率线和霍尔信号线。由于只有霍尔信号发生变化才会进入外部中断函数,而刚开始上电时电机的转子位置检测不到,因此你需要拨动一下转子才能转起来。
下面来看看启动的思想。我先检测一次霍尔信号,然后发相应的pwm,使电机稍微抖动一下,霍尔信号发生变化,进入中断函数,执行电机运行函数。这样的话就不用启动前人为的拨动一下了,来看看程序上怎么写。
实际上跟上面的外部中断检测霍尔信号一样。
最终结果
没怎么拧电位器,所以转的不怎么快,实际测速可以转到2000r/min。
|