[MCU] 【AutoChips AC7801x电机demo板测评】+从零写Hall有感BLDC方波控制

仙景   2020-11-24 09:16 楼主

首先,我们需要知道BLDC是什么,BLDC指的是无刷直流电机,无刷直流电机(Brushless Direct Current Motor, BLDCM)克服了有刷直流电机的先天性缺陷,以电子换向器取代了机械换向器,所以无刷直流电机既具有直流电机良好的调速性能等特点,又具有交流电机结构简单、无换向火花、噪音小,寿命长,运行可靠和易于维护等优点。无刷直流电机的实质是直流电源输入,采用电子逆变器将直流电转换为交流电,有转子位置反馈的三相交流永磁同步电机。

BLDC.gif 电机结构.png

电机工作的基本原理

右手螺旋定则,用右手握住通电螺线管,使四指弯曲与电流方向一致,那么大拇指所指的那一端就是通电螺旋管的N极。

右手螺旋定则N.png

直流电机模型
我们找到一个中学物理学过的直流电机的模型,通过磁回路分析法来进行一个简单的分析。 简单电机转动.png
当两头的线圈通上电流时,根据右手螺旋定则,会产生方向指向右的外加磁感应强度B(如粗箭头方向所示),而中间的转子会尽量使自己内部的磁感线方向与外磁感线方向保持一致,以形成一个最短闭合磁力线回路,这样内转子就会按逆时针方向旋转了。
 
转子磁场方向外部磁场方向垂直时,转子所受的转动力矩最大。注意这里说的是“力矩”最大,而不是“力”最大。诚然,在转子磁场与外部磁场方向一致时,转子所受磁力最大,但此时转子呈水平状态,力臂为0,当然也就不会转动了。补充一句,力矩是力与力臂的乘积。其中一个为零,乘积就为零了。以上就是BLDC旋转的基本原理。
 
下图为一对极电机旋转示意图,三个霍尔H1、H2、H3间隔120°放置一周,根据霍尔的输出状态,不断的改变A、B、C三相通电顺序,使定子形成一个旋转磁场,带动转子旋转。
有感电机转动.gif 电机按一定方向转动时,3个霍尔的输出会按照6步的规律变化如下:
霍尔信号.png
BLDC有感控制系统如下:根据霍尔信号的换向顺序图,红线的方向为电流的方向,标记红线的管为打开的MOS管,每次换向只为其中的两相通电。
两相导通.gif
霍尔真值表.jpg
按照这样的顺序给ABC三相加电,电机就会全速旋转起来,如果想反向旋转,按照霍尔的反向顺序给三相供电即可。直流电机的转速和电压是成正比的,如果想改变转速只需要改变导通的MOS管的PWM占空比即可,相当于调压。
PWM的调节一般有三种方式,下桥臂打开,只调节上桥臂,比如第一个状态,UB给正UC给负,Q3 Q4打开,电流从Q3流向B再经C流出到Q4最后至电源的负极。那么就可以只调节上桥臂Q3的占空比,而Q4一直打开;也可以Q3常开只调节Q4;还有一种方式为互补PWM调节,Q3和Q2为一组互补输出,Q5与Q4为一组互补输出,Q1和Q0关断;互补的好处是上管关断的瞬间电流可以由下管续流而不经过MOS管的内部续流二极管,以免在大电流时造成MOS管的烧坏。
BLDC速度控制
在BLDC电子换相的基础上,通过更改导通时PWM占空比即可改变等效的输出电压, 从而更改来实现调速。
 
有感BLDC程序开源
根据之前分享的AutoChips AC7801x电机demo板的硬件电路和相关的驱动程序,就可以写一个简单的BLDC方波控制程序。
hall传感器接口
PC8 PWDT_IN0
PC7 PWDT_IN1
PC6 PWDT_IN2

VR:AD调速

PC1 ADC_IN9   

电机驱动IO引脚

  PB5    PWM1_CH0
  PB4    PWM1_CH1
 PB8    PWM1_CH2
 PB7    PWM1_CH3
PB10    PWM1_CH4
PB9    PWM1_CH5

 

电机驱动程序

void BLDC_PhaseSwitch(int16_t motorDir, uint8_t hallStatus)
{
	if(motorDir == 1)
	{
			switch (hallStatus)
			{
			case 5://B+,A-
					BLDC_PwmUpdate(PHASEB, PHASEA);
			break;
			case 1: //B+,C-
					BLDC_PwmUpdate(PHASEB, PHASEC);
			break;
			case 3: //A+,C-
					BLDC_PwmUpdate(PHASEA, PHASEC);
			break;
			case 2:// A+,B-
					BLDC_PwmUpdate(PHASEA, PHASEB);
			break;
			case 6: //C+,B-
					BLDC_PwmUpdate(PHASEC, PHASEB);
			break;
			case 4://C+,A-
					BLDC_PwmUpdate(PHASEC, PHASEA);
			break;
			default:
					BLDC_Stop();
			break;
			}
	}
	else if(motorDir == 2)
	{
			switch (hallStatus)
			{
			case 5://A+,B-
					BLDC_PwmUpdate(PHASEA, PHASEB);
			break;
			case 1: //C+,B-
					BLDC_PwmUpdate(PHASEC, PHASEB);
			break;
			case 3: //C+,A-
					BLDC_PwmUpdate(PHASEC, PHASEA);
			break;
			case 2:// B+,A-
					BLDC_PwmUpdate(PHASEB, PHASEA);
			break;
			case 6: //B+,C-
					BLDC_PwmUpdate(PHASEB, PHASEC);
			break;
			case 4://A+,C-
					BLDC_PwmUpdate(PHASEA, PHASEC);
			break;
			default:
					BLDC_Stop();
			break;
			}
	}
}

main.c文件

int main(void)
{
	GPIO_LedInit();
	MC_PWDT1_Init();
	CTU_Config();
	ADC_init();
	TIMER_PrdInit();
	BLDC_PWM_Init();
		
	//发波调试
	g_startupPwmRatio = ratio_q12(10);//30
	BLDC_SetMotorSpeed(g_startupPwmRatio); 
	
	g_hallStatus = PWDT_GetHallStatus(PWDT1) & 0x07;

	BLDC_PhaseSwitch(1,g_hallStatus);
		
	while(1)
	{
		GPIO_ToggleLedPrd();
				
		if(g_scanKeyTime >= SCAN_KEY_INTVL)
		{
			g_scanKeyTime = 0;
			AdjustPwmVal = (g_ADCValueBuffer[0]*100)>>12;//AD调速
			if(AdjustPwmVal != AdjustPwmValpre)
			{
				if(AdjustPwmVal > 80)
				{
					AdjustPwmVal = 80;
				}
				else if(AdjustPwmVal < 8)
				{
					AdjustPwmVal = 8;
				}
				g_startupPwmRatio = ratio_q12(AdjustPwmVal);//30
				BLDC_SetMotorSpeed(g_startupPwmRatio); //设置速度
			}
		}
				
	    if(g_hallStatus != g_hallStatuspre)
		{	
		    BLDC_PhaseSwitch(1,g_hallStatus);//换相
			g_hallStatuspre = g_hallStatus;
		}
	}
}

编译工程,下载程序运行可直以看到电机成功转动起来,用示波器可以看到三相线上的输出电压波形图如下:

波形1.jpg 波形2.jpg

程序在此

BLDC_SHALL2.rar (1.78 MB)
(下载次数: 34, 2020-11-24 10:50 上传)

 

 

请看调速波形动态图,哈哈

波形3.gif

 

本帖最后由 仙景 于 2020-11-24 10:58 编辑

回复评论 (11)

厉害了

默认摸鱼,再摸鱼。2022、9、28
点赞  2020-11-24 13:10

一看就是专业搞电机的!

点赞  2020-11-24 13:36
引用: w494143467 发表于 2020-11-24 13:36 一看就是专业搞电机的!

版主是做什么的,电机控制也是一个方向

点赞  2020-11-26 08:57

简单控制,简单运行

点赞  2020-11-26 08:58
引用: 仙景 发表于 2020-11-26 08:57 版主是做什么的,电机控制也是一个方向

我是搞智能穿戴设备的,偶尔玩玩物联网。

点赞  2020-11-26 09:08
引用: w494143467 发表于 2020-11-26 09:08 我是搞智能穿戴设备的,偶尔玩玩物联网。

那你可以参加论坛的物联网大赛,简直就是为你订做的

点赞  2020-11-26 09:13
引用: 仙景 发表于 2020-11-26 09:13 那你可以参加论坛的物联网大赛,简直就是为你订做的

哈哈,参加了,就是不知道能不能过申请哈~

点赞  2020-11-26 10:38

楼主有没有了解过dsp28027+drv8305的驱动方法呀,急求!

 

点赞  2020-12-15 10:20

为什么6个管子都是NPN型,而不是一半NPN一半PNP呢?“互补”,在哪里体现呢?

“Everyone wants the project to be good, fast, and cheap... pick two.” - Unknown
点赞  2021-3-18 09:14
看不到“BLDC_PwmUpdate(PHASEB, PHASEC)”的代码,附件在我这里打不开。可否将全部文件粘贴进来?
点赞  2021-6-22 08:30
引用: MianQi 发表于 2021-3-18 09:14 为什么6个管子都是NPN型,而不是一半NPN一半PNP呢?“互补”,在哪里体现呢?

互补是指PWM波形,不是只MOS管。MOS管用NPN和PNP都行,PNP内阻大一些,热量大点,NPN就是要升压。

点赞 (1) 2021-12-7 21:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复