三相直流无刷电机驱动程序.docx
《三相直流无刷电机驱动程序.docx》由会员分享,可在线阅读,更多相关《三相直流无刷电机驱动程序.docx(14页珍藏版)》请在冰豆网上搜索。
三相直流无刷电机驱动程序
1.检测霍尔传感器的值可以判断出转子的位置,再使能相应的上下桥臂,则能驱动电机运动;若要让电机持续转动,则必须再次检测传感器值及使能相应的上下桥臂。
这里采用的是将霍尔传感器输出的三根线相边的10口配程成外部中断,并且为边沿触发,在中断函数中加入传感器检测与上下桥臂切换程序,如此电机就能持续运转了。
2.上桥臂的控制采用10口置高低电平来控制上桥臂的通断,下桥臂则使用单片机内部集成的三路PWM波来控制,通过控制PWM波的占空比,可以实现对电机的调速了。
实际测得,占空比与电机的速度成正比例关系,在PWM波频率为20KHZ时,占空比增加1%,速度增加60rpm,并在占空比为53%时达到额泄转速3000rpm(空载)。
3.速度测量则采用如下公式:
电机每转一圈,霍尔值改变6次x5个周期=30次,记录边沿触发的中断次数N/30=电机转过的圈数,设运转时间为t(s)则电机转速v=N/30/t*60rpm.即动转时间为2s时,霍尔值改变次数即为速度值,单位rpm
4.调速:
给左速度,由电机驱动板自动由当前速度平滑过渡到给左速度。
实际测试发现,速度变化星很大时,电机会有突然加速或减速时的冲击:
因此,调速应有一个缓冲的过程。
即加速或减速应以小步进缓慢增加或减少占空比来让速度渐渐达到最终值。
#include"stm32fl0x.h,'
#includeHdriver_motor.hn
#definePWM_PERIOD_T400
#defineU_Up_OnGPIOB->BSRR=GPIO_PinJL3#defineU_Up_OffGPIOB->BRR=GPIO_Pin_13#defineU_Dn_OnGPIOA->BSRR=GPIO_Pin_8#defineU_Dn_OffGPIOA->BRR=GPIO_Pin_8
#defineV_Up_OnGPIOB->BSRR=GPIO_Pin_14#defineV_Up_OffGPIOB->BRR=GPIO_Pin_14#defineV_Dn_OnGPIOA->BSRR=GPIO_Pin_9#defineV_Dn_OffGPIOA->BRR=GPIO_Pin_9
#defineW_Up_OnGPIOB->BSRR=GPI0_Pin_15#defineW_Up_OffGPIOB->BRR=GPI0_Pin_15#defineW_Dn_OnGPIOA->BSRR=GPIO_Pin_10#defineW_Dn_OffGPIOA->BRR=GPIO_Pin_10
#defineSU_HORGPIOA->IDR&GPI0_Pin_15#defineSV_HORGPIOA->IDR&GPIO_Pin_12#defineSW_HORGPIOA->IDR&GPIO_Pin_ll
//u8Motor_Dir=0;
//u8Motor_EN=0;
//u8Hor_Value=7;//ul6TIM2_Conter=0;ul6Hall_Conter=0;
MotorStructMotor={CLOCK/40/STOP};
♦
*函数:
void101nit(void)
*描述:
10
*参数:
*返回:
*其它:
扌*****/******京****##4(車************************取****扌*4t**4c*4t***********4t車**
/
void10」nit(void)
GPIO」nitTypeDefGPIO」nitStruct;
EXTIJnitTypeDefEXTHnitStructure;
//GPIO_PinRemapConfig(GPIO-Remap^SWJ_JTAGDisable,ENABLE);厂使能SWD禁用
JTAG*/
GPIO」nitStruct・GPIO_Pin二GPI0_Pin_12;
*/
GPIO」nitStruct・GPIO_Mode=GPIOJ\/lode_Out_PP;
GPIO」nitStruct・GPIO_Speed二GPI0_Speed_2MHz;
GPIO」nit(GPIOB,&GPIO」nitStruct);
*車****案*****案京********霍尔传感器qu断
京****卓4(車**
GPIOInitStruct.GPIOPin=GPIOPin11|GPIOPin12|GPI0Pin15;
GPIO」nitStruct・GPIO_Mode二GPIO_Mock_IN_FLOATING;
GPIO」nitStruct・GPIO_Speed二GPI0_Speed_2MHz;
GPIO」nit(GPIOA,&GPIO」nitStruct);//Harl
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA/GPIO_PinSourcell);GPI0_EXTILineConfig(GPI0_PortSourceGPI0A/GPI0_PinSourcel2);GPI0_EXTILineConfig(GPI0_PortSourceGPI0A/GPI0_PinSourcel5);
EXTI」nitStructure.EXTI_Line=EXTI_Linell|EXTI_Lin"21EXTI_Linel5;
EXTIJnitStructure.EXTI_Mode=EXTI_Mode_lnterrupt;
EXTIJnitStructure.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
EXTIJnitStructure.EXTLLineCmd=ENABLE;
EXTI_lnit(&EXTI」nitStructure);
}
/*****床******京*****寧*******************************4c車*************車***寧京****函数:
voidPWM」nit(void)
描述:
配置PWM左时器TIM1
参数:
返回:
无
*****************京*************************京***********球************京******/
voidPWMJnit(void)
{
GPIO」nitTypeDefGPIO」nitStructure;
TIM_TimeBaselnitTypeDefTIM_TimeBaselnitStruct;
TIM_OCInitTypeDefTIM_OCInitStructure;
/AlM_BDTRInitTypeDefTIM_BDTRInitStructure;
TIM^CmdfTIMl,DISABLE);
TIM_CtrlPWMOutputs(TIMl,DISABLE);//禁止OC输岀
//IO口设苣
GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);//PWM口
GPIOInitStructure.GPIOPin=GPIOPin8|GPIOPin9|GPIOPin10;
GPIO」nitStructure.GPIO_Speed=GPIO^Speed^lOMHz;
GPIO」nitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO」nit(GPIOA,&GPIO」nitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);〃普通IO口
GPIOInitStructure.GPIOPin=GPIOPin13|GPIOPin14|GPIOPin15;
GPIO」nitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO」nitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO」nit(GPIOB,&GPIO」nitStructure);
〃定时器设豊
TIM_TimeBaselnitStruct.TIM_Period=PWM_PERIOD_T;//5极电机,3000RPM,每个Step有10个脉冲,载波15KHZ
TIM_TimeBaselnitStruct.TIM_Prescaler=2;
TIM_TimeBaselnitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaselnitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaselnitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaselnit(TIMl,&TIM_TimeBaselnitStruct);
//TIM^ClearlTPendingBittTIMl,TIMJTJJpdate);
//TIM_ARRPreloadConfig(TIMl,ENABLE);
〃TIM」TConfig(TIMlzTIM」T_Upda0ENABLE);
〃配置PWM输出
TIM_OCInitStnjcture・TIM_OCMode=TIM_OCMode_PWMl;
TIM_OCInitStructueTIM_OutputState=TIM_OutputState__Enable;
TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_Pulse=1;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity=TlM_OCNPolarity_Low;
TIM_OCInitStructure・TIM_OCIdlGState=TlM_OCIdleState_Set;
TIM_OCInitStructure・TIM_OCNIdlGState=TlM_OCNldleState_Set;
TIM^OClIni^TIMl,&TIM_OCInitStructure);
TIM_OC2lnit(TIMl,&TIM_OCInitStructure);
TIM_OC3lnit(TIMl,&TIM_OCInitStructure);
TIM^OClPreloadConfig^IMl,TIM_OCPreload_Enable);
TlM_0C2PreloadConfig(TIM1,TIM_OCPreload_Enable);
TlM_0C3PreloadConfig(TIM1,TIM_OCPreload_Enable);
TIM^ARRPreloadConfigfTIMl,ENABLE);〃使能TIMx在ARR上的预装载寄存器
TIM^CmdfTIMl,ENABLE);
TIM^CmdfTIMl,ENABLE);
TIM_CtrlPWMOutputs(TIMlzENABLE);
}
/*****京*************************京************球************京***********4(京*******
函数:
voidMotor_lnit(void)
描述:
"
参数:
返回:
*****京***********京*拿***********************索******車****京************京拿******車**
♦♦**♦♦♦♦♦♦/
voidMotor_lnit(void)
{
IO_lnit();
PWMJnit();
}
函数:
void口ash_Led(u8n)
描述:
参数:
返回:
扌*****/******京****#4(車************************取*******4|**/*****************voidFlash_Led(u8n)
{
u8i=0;
for(i=0;i{
Led_On;
DelayMs(100*n);
Led_Off;
DelayMs(100*n);
}
}
函数:
voidSetPWMduty(u8PWMChanel,ul6pulse)
描述:
设置pwm波占空比
参数:
返回:
*****京******4(**********京******寧******京*****************京******4(車**********京****
4t**H“*/
voidSetPWMduty(u8PWMChanel,ul6pulse)
{
switch(PWMChanel)
{
case1:
TIMl->CCRl=pulse;
break;
case2:
TIMl->CCR2=pulse;
break;
case3:
TIMl->CCR3=pulse;
break;
default:
break;
}
}
/*****京*************************京************球***********京*************京*******
♦
函数:
PWM_T_Output
描述:
设垃相尺的PWM梯形波输出
参数:
pName上桥臂名称,nName下桥臂名称
返回:
无
****4(京***********京*拿****************未璟*****未*****京*****京*******車****京拿*********
*/
voidPWM_T_Output(u8pName,u8nName,u8mRate)
switch(pName)
{
case1:
GPIO_SetBits(GPIOB,GPIO_Pin_15|GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_PinJL3);
break;
case2:
GPIO_SetBits(GPIOB,GPIO_Pin^l3|GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
break;
case3:
GPIO_SetBits(GPIOB/GPIO_Pin^l3|GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_PinJL5);
break;
default:
GPIO_SetBits(GPIOBfGPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}
switch(nName)
{
case1:
TIM_SetCompare2(TIM:
L0);
TlM_SetCompare3(TlMlz0);
TIM_SGtComparJ(TIM:
L(ul6)(PWM_PERIOD_T♦mRate/100));break;
case2:
TIM_SetCompare3(TIMl,0);
TIM_SetComparel(TIMlzO);
TIM_SetCompare2(TIMl/(ul6)(PWM_PERIOD_T*mRate/100));break;
case3:
TIM_SGtCompare2(TIMbO);
TIM^SetComparelfTIMl^);
TIM_SetCompare3(TIMl/(ul6){PWM_PERIOD_T♦mRate/100));break;
default:
TlM_SetCompare1(TlMlz0);
TIM_SetCompare2仃IMIQ);
TIM_SetCompare3(TIMl,0);
TIM_SetAutoreload(TIMl,PWM_PERIOD_T);
}
/*****床******京*****寧*******************************4c車****床******寧車**孚*********函数:
PWM_T_Calculation
描述:
梯形矗匸算
参数:
HallValue霍尔值,mRate调制百分比,direction方向
返回:
无
************扌************************************京************扌*****未**********
voidPWM_T_Calculation(u8hallValue,u8mRate,u8direction)
{
if(direction==1)
{
switch(hallValue)
{
case5:
PWM_T_Output(l,3,mRate);
break;
case1:
PWM_T_Output(l,2,mRate);
break;
case3:
PWM_T_Output(3,2zmRate);
break;
case2:
PWM_T_Output(3,1,mRate);
break;
case6:
PWM_T__Output(2z1zmRate);
break;
case4:
PWM_T_Output(2,3zmRate);
break;
default:
PWM_T_0utput(4,4/0);
break;
}
}
else
switch(hallValue)case5:
PWM_T_0utput(3,1,mRate);
break;
case1:
PWM_T_0utput(2z1,mRate);
break;
case3:
PWM_T_0utput(2,3,mRate);
break;
case2:
PWM_T_Output(l,3zmRate);
break;
case6:
PWM_T_Output(l,2,mRate);
break;
case4:
PWM_T__0utput(3,2zmRate);
break;
default:
PWM_T_0utput(4,4,0);
break;
}
}
}
/拿*****京******車************車**********末木************拿*****京****球)k*************車
♦
函数:
PWM_T_lnt
描述:
左时器卡断程序,根据霍尔位置设置输出梯形波
参数:
direction=顺时针/逆时针"Rate调制率
返回:
无
T
voidPWM_TJnt(u8direction,u8mRate)
{
u8hallValueTemp;
u8hallValue;
hallValueTemp=GPIO^ReadlnputDataBitfGPlOA,GPIO_Pin_12)+
(GPIO_ReadlnputDataBit(GPIOA,GPIO_Pin_12)«1)+(GPIO_ReadlnputDataBit(GPIOA,
GPIO_Pin_15)«2);
hallValue=hallValueTemp;
PWM_T_Calculation(hallValue,mRatezdirection);
****4(京*****41************未*****京******京*****京************京車*************函数:
PWM_Stop
描述:
PWM控制信号使能输出,禁止TIM1中断,使能TIM1中断
参数:
pwmflag二DISABLE,PWM信号使能输出,pwmflag二ENABLE,禁止PWM输出返回:
无
*****************京************孚4|***********4(拿****京******************京****
voidPWM_Stop(u8pwmflag)
{
NVICJnitTypeDefNVICJnitStructure;
GPIO」nitTypeDefGPIO」nitStructure;
if(pwmflag==ENABLE)//禁止PWM输出
{
TIM_Cmd(TIMi,DISABLE);
〃TIM_Cmd(TIM2,DISABLE);
NVICJnitStructure.NVICJRQChannel=TII\7ll_UP_TIM16_IRQn;
NVIC_lnitStructure.NVIC_IRQChannelPreemptionPriority=2;
NVICJnitStructure.NVICJRQChannelSubPriority=1;
NVICJnitStructure.NVICJRQChannelCmd=DISABLE;
NVIC_lnit(&NVICJnitStructure);
GPIOInitStructure.GPIOPin=GPIOPin8|GPIOPin9|GPIOPin10;
GPIO」nitStructure.GPIO_Speed=GPIO_Speed_2MHz;
GPIO」nitStructure.GPIO_Mode=GPIO_Mode_Out_OD;
GPIO」nit(GPIOA,&GPIO」nitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);//PWM口
〃PWM_T_Output(4,4,0);
}
if(pwmflag==DISABLE)//使能PWM输出
{
NVICJnitStructure.NVICJRQChannel=TIMl_UP_TIM16_IRQn;
NVICJnitStructure.NVICJRQChannelPreemptionPriority=2;
NVICJnitStructure.NVICJRQChannelSubPriority=1;
NVICJnitStructure.NVICJRQChannelCmd=ENABLE;
NVIC_lnit(&NVICJnitStructure);
GPIOInitStructure.GPIOPin二GPIOPin8|GPIOPin9|GPIO