地址:深圳市罗湖区文锦广场文盛中心1401
邮箱:wawa209@126.com
基本原理
无刷直流电机的转子上粘有已充磁的永磁体,为了检测电动机转子的极性,在电动机内装有位置传感器。驱动器由功率电子器件和集成电路等构成,其功能主要是:接受电动机的启动、停止、制动信号,以控制电动机的启动、停止和制动;接受位置传感器信号和正反转信号,用来控制逆变桥各功率管的通断,产生连续转矩;接受速度指令和速度反馈信号,用来控制和调整转速。
BLDC控制框图
永磁体N-S交替交换,使位置传感器产生相位差120°的H3、H2、H1方波,从而产生有效的六状态编码信号:010、011、001、101、100、110,通过逻辑组件处理产生V6-V1导通、V5-V6导通、V4-V5导通、V3-V4导通、V2 -V3导通、V1-V2导通,也就是说将直流母线电压依次加在U->V、W ->V、W->U、V->U、V->W、U->W上,这样转子每转过一对N-S极, V1、V2、V3、V4、V5、V6各功率管即按固定组合成六种状态的依次导通。
三路霍尔信号图
每种状态下,仅有两相绕组通电,依次改变一种状态,定子绕组产生的磁场轴线在空间转动60°电角度,转子跟随定子磁场转动相当于60°电角度空间位置,转子在新位置上,使位置传感器U、V、W按约定产生一组新编码,新的编码又改变了功率管的导通组合,使定子绕组产生的磁场轴再前进60°电角度,如此循环六步换相,直流无刷电动机将产生连续转矩, 拖动负载作连续旋转。
120°Hall换相真值表
对于典型的三相带传感器的BLDC电机,有6个不同的工作区间, 每个区间中有特定的两相绕组通电。通过检测霍尔传感器,可以得到一个3位编码,编码值的范围从1到6。每个编码值代表转子当前所处的区间。从而提供了需要对哪些绕组通电的信息。因此程序可以使用简单的查表操作来确定要对哪两对特定的绕组通电以使转子转动。注意状态“0”和“7”对于霍尔效应传感器而言是无效状态。软件应该检查出这些值并相应地禁止PWM。
PID 调节控制电机转速
将偏差的比例(Proportion)、积分(Integral)和微分(Differential)通过线性组合构成控制量,用这一控制量对被控对象进行控制,这样的控制器称PID控制器。数字式PID控制算法可以分为位置式PID和增量式PID控制算法。
程序应用
初始化相关函数参数:系统时钟,中断,DMA,ADC,定时器,GPIO等
按键读取
启动,停止,加速,减速,换向
if(keytemp==1) { TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); startcnt=0; } if(keytemp==2) { TIM_Cmd(TIM1, DISABLE); TIM_CtrlPWMOutputs(TIM1, DISABLE); } if(keytemp==3) { if(time >100) { if(aim_speed <2500) aim_speed+=10; time =0; } } if(keytemp==4) { if(time >100) { if(aim_speed >50 ) aim_speed-=10; time =0; } } if(keytemp==5) { if(time >1800) { time=0; if(flagccw==0) { Direction=1; } else { Direction=0; } flagccw=~flagccw; } }
if(startcnt<36) //换相36次平稳启动 { if(time>10) { Hall_SW(); Hall++; if(Hall>6) Hall=1; time=0; } startcnt++; } else { startcnt=37; for(i=0;i<100000;i++); My_PWM+=pid(speed_1,aim_speed)/((speed_1/My_PWM)+1); if(My_PWM<=0) My_PWM=0; if(My_PWM>5000) My_PWM=5000; } int pid(int nonce,int aim) { static int ek_2=0; static int ek_1=0; static int ek=0; int uk; ek=aim-nonce; uk=kp*(ek-ek_1+ki*ek+kd*(ek-2*ek_1+ek_2)); ek_2=ek_1; ek_1=ek; return (uk); }
void Hall_SW(void) { motor_statue=1; switch(Hall) { case 5: TIM1->CCR2=0; //AB TIM1->CCR1 = My_PWM; TIM1->CCR3=0; GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15); GPIO_SetBits(GPIOB, GPIO_Pin_14); break; case 1: TIM1->CCR2=0; //AC TIM1->CCR1 = My_PWM; TIM1->CCR3=0; GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14); GPIO_SetBits(GPIOB, GPIO_Pin_15); break; case 3: TIM1->CCR1=0; //BC TIM1->CCR2 = My_PWM; TIM1->CCR3=0; GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14); GPIO_SetBits(GPIOB, GPIO_Pin_15); break; case 2: TIM1->CCR1=0; //BA TIM1->CCR2 = My_PWM; TIM1->CCR3=0; GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15); GPIO_SetBits(GPIOB, GPIO_Pin_13); break; case 6: TIM1->CCR2=0; //CA TIM1->CCR3 = My_PWM; TIM1->CCR1=0; GPIO_ResetBits(GPIOB, GPIO_Pin_14 | GPIO_Pin_15); GPIO_SetBits(GPIOB, GPIO_Pin_13); break; case 4: TIM1->CCR2=0; //CB TIM1->CCR3 = My_PWM; TIM1->CCR1=0; GPIO_ResetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15); GPIO_SetBits(GPIOB, GPIO_Pin_14); break; default: break; } }
void EXTI9_5_IRQHandler(void) { Hall=GPIO_ReadInputData(GPIOC); Hall=Hall&0x01c0; Hall=Hall>>6; if(!Direction)Hall=7-Hall; Hall_SW(); counter1++; if(EXTI_GetITStatus(EXTI_Line6)!= RESET) { EXTI_ClearITPendingBit(EXTI_Line6); } if(EXTI_GetITStatus(EXTI_Line7)!= RESET) { EXTI_ClearITPendingBit(EXTI_Line7); } if(EXTI_GetITStatus(EXTI_Line8)!= RESET) { EXTI_ClearITPendingBit(EXTI_Line8); } }
产品
应用
服务
资讯
公司
联系