本研究主要完成了对无霍尔传感器电机程序和相关参数的学习理解。
- 三段式启动 三段式启动定时器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。 这半个月花在学习上的时间较少,导致学习进展不大,下个月需要加紧进展。总体上来说,这个月整体上把无感无刷电机的框架建立。