无刷直流电机学习(3)

一.内容
此次学习主要完成了无霍尔传感器的电机的程序的学习理解和相关参数的认识。
二.知识点

  1. 三段式启动
    三段式启动是在定时器TIM1的中断处理函数中。由于电机在静止时反电动势为0或者反电动势很低,无法根据反电动势信号确定转子磁极的位置,因此需要等反电动势能检测到过0时,再切换至无刷直流电机运行状态。
switch(MotorA.State)  
      	{       		
      	case 0:  //定位            	
      	if(MotorA.PWMTicks >= 1000)            	
      	{
      	MotorA.State++;				
      	TIM1->CCR1=0; //A+		   		
      	Delay1Us();		  		
      	T1CH1NOFF();				
      	T1CH2NOFF(); //B-		   		
      	Delay1Us();  				
      	TIM1->CCR2=0;				
      	T1CH3NOFF();//C  				
      	TIM1->CCR3=0;             
      	 BEMF_Cnt = 0;				
      	 usPWMSpd=(Period-1-My_PWM); 
      	 }            	
      	 break;				
      	 case 1:
      	if(MotorA.PWMTicks >= usPWMSpd)   //4000->400	
      	 {
      	 usPWMSpd-=(usPWMSpd/16+1);				
      	 BLDC_SwitchStep(); //step2				
      	 BEMF_Cnt ++;
      	 }				
      	 if(BEMF_Cnt >= 36)				
      	 {
      	 MotorA.State++;				
      	 BEMF_Cnt=0;					
      	 }			
      	 break;       	
      	 case 2: //启动            
      	 if (MotorA.PWMTicks >= 8)//过滤电动势           
      	  {
      	  if ( BEMF())               
      		  { 
      		  BLDC_SwitchStep();                    
      		  BEMF_Cnt++;
      	 	 }            
      	  }           
      	   if (BEMF_ADC_Cnt < ADN)     //记录启动过程bemf数据           
      	    {             
      	     ADC_Value[BEMF_ADC_Cnt][0]= ADCConvertedValue_2[0];              	 
      	     ADC_Value[BEMF_ADC_Cnt][1]= ADCConvertedValue_2[1];              
      	     ADC_Value[BEMF_ADC_Cnt][2]= ADCConvertedValue_2[2];              
      	     BEMF_ADC_Cnt++; 
      	     }            
      	     if (BEMF_Cnt >= 50)     //50次换向之后,认为达到平稳状态             
      	     {              
      	      MotorA.State++;               
      	       BEMF_Cnt = 0;            
      	       }            
      	       break;        
      	       case 3:            
      	       if (MotorA.FlagBEMF == 0)      //未检测到过零事件           
      	        {
      	        if (MotorA.PWMTicks >= 4)//消磁				
      	        	{ 
      	        	if ( BEMF())//判断是否过零点                   
      	        		 {
      	        		 MotorA.FlagSwitchStep = MotorA.PWMTicksPre >> 4;   //延迟30电角度                      
      	        		 MotorA.FlagBEMF = 1;  //检测到过零事件,不再检测                                            
      	        		 }              
      	        	 }            
      	        }            
      	        else           
      	         {               
      	          if (MotorA.FlagSwitchStep == 0)          //延迟时刻到               
      	           {                    
      	           BLDC_SwitchStep();               //换向                    
      	           BEMF_Cnt++;   //换向计数               
      	            }                
      	            else               
      	             {
      	             MotorA.FlagSwitchStep--;//计时时刻未到自减
      	              }           
      	        }           
      	         if (BEMF_Cnt >= 800000)       //50000次换向之后,停止           
      	          { 
      	          BEMF_Cnt = 0;      		
      	           }			 
      	           Break;        
      	           case 4:            
      	           BLDC_Stop();            
      	           break;        
      	           case 5:           
      	            break;        
      	            default:            
      	            break;        
      	            }		
      }

主要函数
BLDC_SwitchStep(): 换相函数,和有感无刷直流电机一样,还是六步换相;
BEMF():过零点检测函数,作为是否能够检测到零点的依据;
主要参数:MotorA.State:三段式启动的条件参数,作为三种状态转换的依据;
BEMF_Cnt:换相次数,作为状态是否稳定的标志; MotorA.FlagBEMF:过零点检测标志;
2. 六步换相
无感无刷直流电机也是采用二二导通方式,通过六个步骤依次运行来实现控制电机的转动

void BLDC_SwitchStep(void)
{
if (ClockDir==0)
	{
	MotorA.Step = (MotorA.Step + 1) % 6;
	}	
else	
	{
	MotorA.Step = (MotorA.Step + 6-1) % 6;
	}    
MotorA.PWMTicksPre = MotorA.PWMTicks;    
MotorA.FlagBEMF = 0;    
MotorA.PWMTicks = 0;	//6步法驱动    
switch (MotorA.Step)   
	 {
	 case 0://step1			
	 TIM1->CCR1=My_PWM;  //A+		   	
	 Delay1Us();		  	
	 T1CH1NON();			
	 T1CH2NOFF();      //B-		   	
	 Delay1Us();  			
	 TIM1->CCR2=0;			
	 T1CH3NON();					//C  			
	 TIM1->CCR3=0;			
	 break;		
	 case 1://step2			
	 TIM1->CCR1=My_PWM;	//A+		   	
	 Delay1Us();		   	
	 T1CH1NON();			
	 T1CH3NOFF();					//C-		   	
	 Delay1Us();  			
	 TIM1->CCR3=0;			
	 T1CH2NON();					//B  			
	 TIM1->CCR2=0;			
	 break;		
	 case 2://step3			
	 TIM1->CCR2=My_PWM; //B+		   	
	 Delay1Us();		   	
	 T1CH2NON();		  	
	 T1CH3NOFF();//C-		   	
	 Delay1Us();	    			
	 TIM1->CCR3= 0;						  //12.5%占空比				
	 T1CH1NON();		   //A  			
	 TIM1->CCR1=0;			
	 break;		
	 case 3://step4			
	 TIM1->CCR2=My_PWM; //B+		  	
	 Delay1Us();		  	
	 T1CH2NON();		  	
	 T1CH1NOFF();			//A-		  	
	 Delay1Us();	     			
	 TIM1->CCR1=0;			
	 T1CH3NON();			//C  			
	 TIM1->CCR3=0;			break;		
	 case 4://step5			
	 TIM1->CCR3=My_PWM;  //C+		   
	 Delay1Us();		   T1CH3NON();		   
	 T1CH1NOFF();  	//A-		  
	 Delay1Us();   			
	 TIM1->CCR1 = 0;					  // 37.5%占空比		   
	 T1CH2NON();			//B		  
	 Delay1Us();  			
	 TIM1->CCR2=0;			
	 break;		
	 case 5://step6			
	 TIM1->CCR3=My_PWM;   //C+		   	
	 Delay1Us();		   	
	 T1CH3NON();			
	 T1CH2NOFF();				//B-		   	
	 Delay1Us(); 			
	 TIM1->CCR2=0;			
	 T1CH1NON();				//A  			
	 TIM1->CCR1=0;			
	 break;			
	 default:			
	 break;    
	 }
	 }

从程序中可以看出,程序的实现是通过导通两个定时器,而关闭一个定时器,但启动的两个定时器中,只有一个设置了CCR,实际上也就是三相一相通正电,一相通负电,一相不通电,这也就是二二导通方式的实质所在,原理和有感的基本相似,只不过有感的条件参数是通过霍尔传感器得到HALL序列,而无感的是通过函数计算得到的MotorA.Step。
三、学习总结
 这半个月花在学习上的时间较少,导致学习进展不大,下个月需要加紧进展。总体上来说,这个月整体上把无感无刷电机的框架建立。

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值