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