一个三相无刷直流电机驱动,通过霍尔传感器检测转子位置,霍尔值改变的次数检定速度测量,单片机的脉冲宽度调节(PWM)来调节速度来达到控制三相无刷直流电机的目的。
1.检测霍尔传感器的值可以判断出转子的位置,再使能相应的上下桥臂,则能驱动电机运动;若要让电机持续转动,则必须再次检测传感器值及使能相应的上下桥臂。这里采用的是将霍尔传感器输出的三根线相边的IO口配置成外部中断,并且为边沿触发,在中断函数中加入传感器检测与上下桥臂切换程序,如此电机就能持续运转了。
2.上桥臂的控制采用IO口置高低电平来控制上桥臂的通断,下桥臂则使用单片机内部集成的三路PWM波来控制,通过控制PWM波的占空比,可以实现对电机的调速了。实际测得,占空比与电机的速度成正比例关系,在PWM波频率为20KHz时,占空比增加1%,速度增加60rpm,并在占空比为53%时达到额定转速3000rpm(空载)。
3.速度测量则采用如下公式:电机每转一圈,霍尔值改变6次x5个周期=30次,记录边沿触发的中断次数N/30=电机转 过的圈数,设运转时间为t(s)则电机转速v=N/30/t*60 rpm。即动转时间为2s时,霍尔值改变次数即为速度值,单位rpm。
4.调速:给定速度,由电机驱动板自动由当前速度平滑过渡到给定速度。实际测试发现,速度变化量很大时,电机会有突然加速或减速时的冲击;因此,调速应有一个缓冲的过程。即加速或减速应以小步进缓慢增加或减少占空比来让速度渐渐达到最终值。
控制代码:
函数: void EXti15_10_IRQHandler(u8 dir,u8 hall)描述:霍尔传感器中断 参数: 返回: *****************************************************************************************/ void EXTI15_10_IRQHandler(void) { Hall_Conter++; if ((EXTI_GetITStatus(EXTI_Line11) != RESET)||(EXTI_GetITStatus(EXTI_Line12) != RESET)||(EXTI_GetITStatus(EXTI_Line15) != RESET)) {
if(Motor.State!=STOP) PWM_T_Int(Motor.Dir,Motor.Speed); } EXTI_ClearITPendingBit(EXTI_Line11); //清除标志 EXTI_ClearITPendingBit(EXTI_Line12); //清除标志 EXTI_ClearITPendingBit(EXTI_Line15); //清除标志 } /***************************************************************************************** 函数:void Test_Motor(u8 dir,u8 hall) 描述:电机控制 参数: 返回: *****************************************************************************************/ void Test_Motor(void) { while(1) { switch(Motor.State) { case STOP : Motor_Stop(); break; case RUN : Motor_Start(); Motor.State=FREE; break; default : break; } } }
|