BLDC (无刷直流电机) 六步式控制方法

1本文目的

最近在参与BLDC电机控制的项目,在网上也查看了无刷电机相关控制原理和方式。
但最终此项目使用的是六步式控制方式控制轮毂电机,所以此篇简述六步式的控制方法,以备之后查阅。(六步式的控制方式相较于FOC和SVPMW是比较简单的,这两个内容在CSDN上有非常经典的文章)

轮毂电机线束

轮毂电机有U、V、W三个控制线和A、B、C三根霍尔位置信号线,2根霍尔传感器电源线,(可能还有其它线束,因未使用,不描述)
至于控制线的定义被叫做UVW还是ABC,这个与无刷电机的控制原理有关,此篇中不再描述。

2控制器的主要电路

BLDC (无刷直流电机) 六步式控制方法_第1张图片
BLDC (无刷直流电机) 六步式控制方法_第2张图片

3控制方法说明

对应控制框图中的MOS的序号,表3和表4中相电流的控制就是六步式要描述的内容。
表3表4中的霍尔传感器输入ABC的值,不同的电机会有不同的值,这个值的对应关系是需要标定的。
序号1-6对应的相电流,比如A关闭,B是DC-,C是DC+, 描述的是电机C端为高电势、B端为低电势,A端断开。电流方向如下图所示
BLDC (无刷直流电机) 六步式控制方法_第3张图片
其实序号1-6对应的步骤,也就是对MOS的通断控制,哪一个步骤作为第一步都是可以的,然后按着顺序完整这六步就可以。

4实际项目调试

1说明

项目为自研项目、轮毂电机控制器也是临时找了个控制器。当前阶段只实现前进、后退、停止、变速控制即可。
6路PWM控制依据六步的顺序分别控制Q0-Q5的通断,使用高边MOS常开, 控制低边MOS的PWM占空比的方式实现电机转速的调整。这里提到的控制都是开环控制。
通过IO中断或IOC中断捕获ABC的上升沿和下降沿事件,并且读取ABC的电平状态,与控制步骤结合形成新的控制表,如表3表4所描述。

#2调试方式
(1)调试MCU程序、具备6路PWM控制、霍尔位置信号的捕捉;示波器监控ABC三路波形变化
(2)先按固定顺序、固定时间,分别按控制步骤1、2、3…6的顺序控制电机;
例如每个1s,控制步骤加1,观察ABC位置信号波形变。
找到控制步骤与ABC位置信号的值的关系。形成新的表。 如下表,就是新标定出来的表
BLDC (无刷直流电机) 六步式控制方法_第4张图片
(3)程序控制
通过IO的上升沿或者下降沿采集位置信号ABC的变化,所以在变换步骤前,需要轮毂电机有个初始的位移,可以通过读取当前ABC的值,确定驱动的初始步骤是哪个。然后在ABC位置信号的IO上升沿下降沿中断中按表顺序执行控制步骤。
控制步骤= ABC对应的步骤+1;
#2实际程序节选

BLDC (无刷直流电机) 六步式控制方法_第5张图片
以下代码段实现了根据ABC的电平状态,得到控制步骤的功能。

const unsigned char HOLL_TABLE_P[holl_table_num] = {0x55, 2, 3, 1, 5, 4, 6};	//0x55用于站位,为无效值
const unsigned char HOLL_TABLE_N[holl_table_num] = {0x55, 5, 1, 3, 2, 6, 4};	//0x55用于站位,为无效值

`unsigned char PositionDetectABC(TYPE_POSITION_ABC holl)
{
	unsigned char holl_table_index = 0;			//holl值在holl表中对应的序号
	unsigned char step_run = 0;
	unsigned char i=0;

	if(holl.ha == 1)								/*A位置信号高电平*/
	{
		holl_val |= 0x04;
	}
	else											/*A位置信号低电平*/
	{
		holl_val &= 0xFB;
	}

	if(holl.hb == 1)
	{
		holl_val |= 0x02;
	}
	else
	{
		holl_val &= 0xFD;
	}

	if(holl.hc == 1)
	{
		holl_val |= 0x01;
	}
	else
	{
		holl_val &= 0xFE;
	}
	holl_val &= 0x07;


	if(holl.dir == M_ABC_P)
	{
		for(i=0; i

你可能感兴趣的:(随笔)