霍尔传感器-磁编-MagnTek 麦歌恩-代理-威立胜电子

当前位置: 首页 - 服务 - 磁性芯片教材 - 学习带霍尔传感器的BLDC方波调速
联系我们 / Contact
深圳市威立胜电子有限公司
咨询热线:13510581182

地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com

学习带霍尔传感器的BLDC方波调速

2023-03-21
阅读:
发布者: 小编

基本原理

无刷直流电机的转子上粘有已充磁的永磁体,为了检测电动机转子的极性,在电动机内装有位置传感器。驱动器由功率电子器件和集成电路等构成,其功能主要是:接受电动机的启动、停止、制动信号,以控制电动机的启动、停止和制动;接受位置传感器信号和正反转信号,用来控制逆变桥各功率管的通断,产生连续转矩;接受速度指令和速度反馈信号,用来控制和调整转速。


BLDC控制框图

BLDC控制框图

永磁体N-S交替交换,使位置传感器产生相位差120°的H3、H2、H1方波,从而产生有效的六状态编码信号:010、011、001、101、100、110,通过逻辑组件处理产生V6-V1导通、V5-V6导通、V4-V5导通、V3-V4导通、V2 -V3导通、V1-V2导通,也就是说将直流母线电压依次加在U->V、W ->V、W->U、V->U、V->W、U->W上,这样转子每转过一对N-S极, V1、V2、V3、V4、V5、V6各功率管即按固定组合成六种状态的依次导通。


三路霍尔信号图

每种状态下,仅有两相绕组通电,依次改变一种状态,定子绕组产生的磁场轴线在空间转动60°电角度,转子跟随定子磁场转动相当于60°电角度空间位置,转子在新位置上,使位置传感器U、V、W按约定产生一组新编码,新的编码又改变了功率管的导通组合,使定子绕组产生的磁场轴再前进60°电角度,如此循环六步换相,直流无刷电动机将产生连续转矩, 拖动负载作连续旋转。

三路霍尔信号

120°Hall换相真值表

真值表

对于典型的三相带传感器的BLDC电机,有6个不同的工作区间, 每个区间中有特定的两相绕组通电。通过检测霍尔传感器,可以得到一个3位编码,编码值的范围从1到6。每个编码值代表转子当前所处的区间。从而提供了需要对哪些绕组通电的信息。因此程序可以使用简单的查表操作来确定要对哪两对特定的绕组通电以使转子转动。注意状态“0”和“7”对于霍尔效应传感器而言是无效状态。软件应该检查出这些值并相应地禁止PWM。


PID 调节控制电机转速

将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。数字式PID控制算法可以分为位置式PID和增量式PID控制算法。


程序应用

初始化相关函数参数:系统时钟,中断,DMA,ADC,定时器,GPIO等


按键读取

启动,停止,加速,减速,换向

if(keytemp==1)
	{
		    TIM_Cmd(TIM1, ENABLE);
		    TIM_CtrlPWMOutputs(TIM1, ENABLE); 
				startcnt=0;
	}	
	if(keytemp==2)
	{
		     TIM_Cmd(TIM1, DISABLE);
		      TIM_CtrlPWMOutputs(TIM1, DISABLE); 
	}
  if(keytemp==3)
	{
		if(time >100)
		{
			  if(aim_speed <2500)
				 aim_speed+=10;
				time =0;
		}
	}
 if(keytemp==4)
   {
	 	if(time >100)
		{
			  if(aim_speed >50 )
				 aim_speed-=10;
				time =0;
		}
   }
if(keytemp==5)
   {
		if(time >1800)
		{
			time=0;
			if(flagccw==0)
		{
			 Direction=1; 
		}
		else
		{
			  Direction=0;  
		}
		flagccw=~flagccw;
		}
   }

启动后调速

平稳启动后,使用增量式PID算法控制电机转速

if(startcnt<36)  //换相36次平稳启动
	{
	if(time>10)
	 { 
		Hall_SW();
		Hall++;
	  if(Hall>6) 	Hall=1;
		time=0;
	}
	 startcnt++; 
	}
  else
	{
		startcnt=37;
		for(i=0;i<100000;i++);
		My_PWM+=pid(speed_1,aim_speed)/((speed_1/My_PWM)+1);	
		if(My_PWM<=0)			    
		My_PWM=0;
		if(My_PWM>5000)			    
		My_PWM=5000;
	}
int pid(int nonce,int aim)
{
	static int ek_2=0;
	static int ek_1=0;
	static int ek=0;
	int uk; 
	
	ek=aim-nonce;
	uk=kp*(ek-ek_1+ki*ek+kd*(ek-2*ek_1+ek_2));
	ek_2=ek_1;
	ek_1=ek;
	return (uk);
}

PWM换相调压

换相控制方式使用二二导通方式,导通时,上半桥臂工作于PWM状态,下半桥臂处于常通状态(此处Hall编码与上述换相真值表不对应,具体情况具体分析)

void Hall_SW(void)
{
	motor_statue=1;
	switch(Hall)
	{
		case 5:     
		   TIM1->CCR2=0;          //AB
		   TIM1->CCR1 = My_PWM;					  
           TIM1->CCR3=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_14);   
		   break;
			
		case 1:
           TIM1->CCR2=0;          //AC
		   TIM1->CCR1 = My_PWM;					  
           TIM1->CCR3=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_15);  
		   break;
			
		case 3:
	  	   TIM1->CCR1=0;          //BC
	 	   TIM1->CCR2 = My_PWM;					  
           TIM1->CCR3=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_15);     
		   break;
			
		case 2:
	       TIM1->CCR1=0;          //BA
		   TIM1->CCR2 = My_PWM;					  
           TIM1->CCR3=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_13); 
		   break;
			
		case 6:
		   TIM1->CCR2=0;          //CA
	       TIM1->CCR3 = My_PWM;					  
           TIM1->CCR1=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_13);    
		   break;
			
		case 4:
	       TIM1->CCR2=0;          //CB
		   TIM1->CCR3 = My_PWM;					  
           TIM1->CCR1=0;
		   GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15); 
		   GPIO_SetBits(GPIOB, GPIO_Pin_14);   
		   break;
			
		default:
		   break;
	}
}

霍尔信号处理

读取霍尔信号线中断,并做出相应换相等处理

void EXTI9_5_IRQHandler(void)
{    
	Hall=GPIO_ReadInputData(GPIOC);
	Hall=Hall&0x01c0;
	Hall=Hall>>6;

	if(!Direction)Hall=7-Hall;
	Hall_SW();
	counter1++;
	if(EXTI_GetITStatus(EXTI_Line6)!= RESET)
	{
		EXTI_ClearITPendingBit(EXTI_Line6);
	}
		if(EXTI_GetITStatus(EXTI_Line7)!= RESET)
	{
		EXTI_ClearITPendingBit(EXTI_Line7);
	}
		if(EXTI_GetITStatus(EXTI_Line8)!= RESET)
	{
		EXTI_ClearITPendingBit(EXTI_Line8);
	}
}
相关文章
客户服务中心
0755-83986875
地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com
联系电话:13510581182(周经理)
                 0755-83986875(总机)
二维码
友情链接: 中国电机产业网 电子发烧友 工业电器网 汽车电子网 电子产品世界 自动化设备 工控之家 工博士 智能制造网 极客网 北极星电力
Copyright 2022 深圳市威立胜电子有限公司    备案号:粤ICP备2022137744号