资讯详情

无刷直流电机学习(3)

本研究主要完成了对无霍尔传感器电机程序和相关参数的学习理解。

  1. 三段式启动 三段式启动定时器TIM在1的中断处理函数中。由于电机静止时反电势为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 >=        停止                 	          {       	          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。  这半个月花在学习上的时间较少,导致学习进展不大,下个月需要加紧进展。总体上来说,这个月整体上把无感无刷电机的框架建立。

标签: 无刷电机无位置传感器启动

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台