基于STM32 HAL库的直流无刷电机有感(霍尔)驱动方法与代码实践及仿真解析
STM32F103C8T6+Proteus8.11软件仿真无刷直流电机
1.无刷电机转动的原理

图1-1无刷直流有感电机(带霍尔、内部星型连接)
首先上图就是在proteus中的无刷直流电机,它内部是星型连接(BLDC-STAR)的,也有三角型连接的无刷电机(BLDC-TRIANGLE),两者的驱动区别我不懂,本次我会为解释星型连接的电机驱动原理。图中左边的a、b、c是它的三相输入(它不一定叫三相输入,我不懂该怎么称呼),也被称U、V、W三相。右侧是电机上的霍尔信号的输出sa、sb、sc,仿真环境中它输出+5V到-5V的信号,+5V和-5V表示高电平和低电平。实际真正的电机会另外会有VCC+5V和GND这两个接口,它们给电机内部的霍尔电路供电。图中下方的load接口接了一个信号,如果它设1时会使电机加一个恒定的力,会让电机一直转下去。另一个接口还不清楚。
如果我们想让它通过电路驱动旋转起来,先来学习一下它旋转的过程会发生什么,这样就会明白后续该怎么控制它旋转。
电机转动时,它的三个霍尔输出会输出一些电平信号,我使用霍尔安装角度120度的情况分析(60度的情况我还不懂)。关于无刷直流电机的结构和驱动时到底发生了什么,我推荐你可以去B站学习。下面我解释驱动时需要理解的部分。

图1-2 霍尔传感器输出波形与6组状态量
图1-2是三个霍尔接口输出电平信号,转动的时候,它会一直循环出现上面的情况,从左往右它经历6个状态,第7个状态时它又一次回到了001的状态。当然如果它是另一种转动方向,那么我们应该从右往左分析。在现实情况中,它会从6个情况下任何的一个状态当作初始状态。(上图波形情况是电机转动是所固有发生的现象,出现这样的波形是下面的驱动方式或电路所需要的输入量)我们命名上面左往右是正转时的情况,接下来看看它的驱动电路。

图1-3 无刷电机驱动电路
这个1-3图我去除了霍尔的部分,只留下了使它转动的部分,你可以看到6个N型MOS管(本质上需要它发挥一个开关的作用,并且它开关的频率很快,还有额定电压,最大负载电流等参数需要考虑,这里我们简单点图中VCC=24V,找一个N型MOS管额定电压高于24V一些就可以),N型MOS管依靠着左侧的栅极(A+、A-、B+、B-、C+、C-)控制每个管的导通,对N型来说,给它栅极一个高(正)电压可驱动它导通(我的表述并不专业,这个正电压具体是5V或是12V与MOS的选型有关)。
怎么使这个无刷电机靠着上图1-3的电路转动起来呢?答:控制这个电路中MOS管的导通和关断来完成。

图1-4插图使用不要太在意它
这个无刷电机的内部三相,转动过程中只会接通任意两相,这两相一个接电源的正极,另一个接电源的负极。它会让上图中的绕组部分产生一个磁场,作用给内部的磁铁,开始发生吸引和排斥现象,当我们控制导通相变换足够快时,完全可以让外面的绕组产生的磁场带领着(控制着或是推动着吸引着,上述都可以)它是有规律的,这个规律会使内部霍尔传感器感应出的效果就是图1-2中展示的波形变化。现在结合图1-2(波形)和图1-3(电路)的内容引出下表。(这两个表中电平信号组合对应的MOS管导通状态是固定或者说是大家所公认的,所以不需要特别纠结他们两者为什么是这种对应情况,如果你有想法我也很鼓励你可以一探究竟。)
表1-1无刷电机正转(图2从左到右)对应导通表

表1-2无刷电机反转(图2从左到右)对应导通表

转子每旋转一周霍尔传感器可以组合输出6组不同的信号,这6 组状态量和MOSFET 开关管的导通状态遵循相应的规律。控制器再根据表 1-1 和表1-2 中,霍尔传感器的电平信号来输出相应的控制信号去驱动 MOSFET,这就是所谓的 六步换相法。在程序的编写时,使用的就是通过if语句或者while语句来实现判断的,接着控制STM32F103的定时器的PWM模式输出对应接口的控制信号。
讲完了控制原理,接着说一下控制方案,无刷电机有三种主流的控制方式。FOC(又称为矢量变频、磁场矢量定向 控制)、方波控制(也称为梯形波控制、6 步换相控制)和正弦波控制。其中方波控制,也就是6步换相法,刚才已经有了基本的说明。当进入表1-1中一种情况时,它可以是直接导通,也可以采用PWM控制导通,及在这个导通状态中,使用PWM波进行快速的导通和关断,这个波的频率十分的快远大于它旋转时的每一相保持的时间(例如001状态时,在B+和C-导通的时间内,MOS靠着PWM控制它快速的导通和关断好多次)
我们通过调整PWM信号的占空比,可以改变脉冲的宽度, 从而改变 N型MOS 管的导通与关断时间,也就影响MOS管输出的平均电压(因为PWM波控制栅极,所以导致源极和漏极之间的导通频率会和PWM波相同)。用一个网上的图举例,在一个周期内导通的时间占总周期的份额越多,它就会影响其平均电压。

对于上面表1-1的原理,我们可以只使用PWM波控制上桥臂(A+、B+、C+)的导通,而下桥臂需要导通的时候直接导通。也可以只使用PWM波控制下桥臂(A-、B-、C-)的导通,而上桥臂直接导通。如下图1-5这两种情况称为单极性PWM调制。

图1-5单极性PWM调制
接着介绍下一种控制方式,一些同学也可以跳过大致看一下,因为本次采用的控制方式是上面的H_PWM-L_ON型。

图1-6单边PWM调制
如上图1-6所示,左侧的图在 120°导通区间,各开关管前 60°采用 PWM 调制,后 60°则直接导通;另一个则相反在 120°导通区间,各开关管前 60°导通,后 60°则用 PWM 调制。(图中‘PWM-ON型’和‘ON-PWM型’标注反了)

图1-7双极性PWM调制
双极性调制也称为 H_PWM-L_PWM 调制:在 120°导通区间,上、下桥臂开关管都采用 PWM 控制。本次采取 H_PWM-L_ON 型的工作模式,因为它简单,该模式下只需要对上桥臂开关管采用 PWM 控制。
2.STM32 HAL库程序说明
STM32F103C6T6 芯片有其功能上的优势, 它搭载的通用定时器中有无刷直流电机专用的霍尔传感器异或检测功能,在STM32芯片实物的情况下,是完全可以使用这个HAL库自带异或检测功能来实现对上面三路霍尔传感器的电平信号进行读取的,( B站搜索超子说物联网 ,这位博主里面有详细讲述哦,并且还有程序一步步编写讲解)但是proteus仿真的环境中没有办法进行读取到该信号。所以我们先使用简单的if语句来实现对电平信号的读取(实物是绝对不能这样使用的,在主程序中使用if语句效率很低,并且主程序循环一边才可以进行第二次判断)。

图2-1电平信号读取程序
图中霍尔传感器U、V、W也称H1、H2、H3,对应接STM32的A6、A7、B0,图2-1中的程序最后在主循环中,经过判断每个电平是否为高电平,之后对一个变量state进行赋值操作,目的使这三个信号变成一组三位二进制码,后续进行输出控制信号时判断使用。(state赋值操作也可以使用其他的办法)

图2-2 C+和B-相(代指图中W+、V-相)N型MOS管控制信号程序
switch语句判断state变量它的值,它的值是由图2-1的程序读取而来,上图2-2中只展示当state值为1时的情况,根据表1-1所示,电平信号为001(state=十进制的1)时,导通B-和C+相,由于选择的是上桥臂PWM控制方法,所以 C+上桥臂使用PWM控制,B-下桥臂直接导通,程序如下:
__HAL_TIM_SET_COMPARE(&tim1,TIM_CHANNEL_3,bldcm_pulse);
HAL_GPIO_WritePin(NPWM3_GPIO ,NPWM2_PIN, GPIO_PIN_SET);
该程序是经过基础配置后,才可以使用的。其中tim1,TIM_CHANNEL_3,bldcm_pulse这三个分别表示定时器1、通道3代指PWM的一个通道(接在C+上)、占空比的设定值。如果你不太懂HAL库的配置方式可以在B站搜索超子说物联网,其中他讲STM32 HAL库精讲入门教程 手把手写程序,十分详细和明了。我在学习过其中的定时器的输入捕获、输出比较和PWM模式后,才最终完成这次设计对HAL库语言的理解。当你有STM32芯片的最小系统板时,可以学习输入捕获三通道异或 TIM1无刷电机霍尔传感器接口这一章节,这样你就可以实现通用定时器中有无刷直流电机专用的霍尔传感器异或检测功能。(如果你对编程十分陌生可以慢慢开始学习B站的课程,可以学习上面这位博主,或者学习江科大的STM32入门课程,两者使用的语言不相同,看你更喜欢哪个)

图2-3主程序编译示意图
while (1)
{
key();
get_hall_state();
set_hall_state();
}
}
上面的程序中只需要获得霍尔信号量,接着通过判断哪种情况下导通哪个相的通道即可(表1-1和表1-2)。
HAL_Init();
SystemClock_Config();
TIM1_Init(720-1,100-1);//PWM
key_Init();//按键定义
OLED_Init();
OLED_ShowString(1,2,"E-Bike:");
OLED_ShowString(1,10,"—");
GPIO_Config(); //下桥臂和刹车
hall_Init();//while方式霍尔接口初始化A67 B0
上面这些都是一些使用这些端口所需要的定义,大家最难上手的部分就是这些定义部分了,所以更推荐大家在 B站搜索超子说物联网 来学习这些部分。
HAL_Init();这是为了使用HAL库所必须的定义/声明
SystemClock_Config();开启时钟所需要的声明
TIM1_Init(720-1,100-1);这个就是发出PWM信号的基本配置的声明,图中的A+,B+,C+也就是上桥臂在其中设置。
key_Init();设置了一些简单的按键配置,高低电平检测之类的
OLED_Init();这些是加了一个OLED显示屏的初始化设置
OLED_ShowString(1,2,"E-Bike:");
OLED_ShowString(1,10,"—");上面两条是(第1行,第2列)为坐标依次显示E-Bike:;以及(第1行,第10列)为坐标显示—。
GPIO_Config(); //图中的A-,B-,C-也就是下桥臂和一些刹车功能的配置
hall_Init();A6 A7 B0霍尔接口的初始化
暂时先写到这里后续的仿真部分也会发表的。
作者:心睦 (宇)