*/
void PWM_T_Output(u8 pName , u8 nName , u8 mRate) {
switch(pName) {
case 1:
GPIO_SetBits(GPIOB, GPIO_Pin_15 | GPIO_Pin_14 ); GPIO_ResetBits(GPIOB , GPIO_Pin_13); break; case 2:
GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_15 ); GPIO_ResetBits(GPIOB , GPIO_Pin_14); break; case 3:
GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 ); GPIO_ResetBits(GPIOB , GPIO_Pin_15); break; default:
GPIO_SetBits(GPIOB, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15); }
switch(nName) {
case 1:
TIM_SetCompare2(TIM1,0); TIM_SetCompare3(TIM1,0);
TIM_SetCompare1(TIM1,(u16)(PWM_PERIOD_T * mRate / 100)); break; case 2:
TIM_SetCompare3(TIM1,0); TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,(u16)(PWM_PERIOD_T * mRate / 100)); break; case 3:
TIM_SetCompare2(TIM1,0); TIM_SetCompare1(TIM1,0);
TIM_SetCompare3(TIM1,(u16)(PWM_PERIOD_T * mRate / 100)); break; default:
TIM_SetCompare1(TIM1,0); TIM_SetCompare2(TIM1,0); TIM_SetCompare3(TIM1,0);
}
TIM_SetAutoreload(TIM1, PWM_PERIOD_T); }
/*****************************************************************************************
函数:PWM_T_Calculation 描述:梯形波计算
参数:HallValue霍尔值,mRate调制百分比,direction方向 返回:无
*****************************************************************************************/
void PWM_T_Calculation(u8 hallValue , u8 mRate , u8 direction) {
if(direction == 1) {
switch(hallValue) { case 5:
PWM_T_Output(1 , 3 , mRate); break; case 1:
PWM_T_Output(1 , 2 , mRate); break; case 3:
PWM_T_Output(3 , 2 , mRate); break; case 2:
PWM_T_Output(3 , 1 , mRate); break; case 6:
PWM_T_Output(2 , 1 , mRate); break; case 4:
PWM_T_Output(2 , 3 , mRate); break; default:
PWM_T_Output(4 , 4 , 0); break; } } else {
switch(hallValue) {
case 5:
PWM_T_Output(3 , 1 , mRate); break; case 1:
PWM_T_Output(2 , 1 , mRate); break; case 3:
PWM_T_Output(2 , 3 , mRate); break; case 2:
PWM_T_Output(1 , 3 , mRate); break; case 6:
PWM_T_Output(1 , 2 , mRate); break; case 4:
PWM_T_Output(3 , 2 , mRate); break; default:
PWM_T_Output(4 , 4 , 0); break; } } }
/*******************************************************************************
函数:PWM_T_Int
描述:定时器中断程序,根据霍尔位置设置输出梯形波 参数:direction=顺时针/逆时针,mRate调制率 返回:无
********************************************************************************/
void PWM_T_Int(u8 direction , u8 mRate) {
u8 hallValueTemp; u8 hallValue; hallValueTemp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_12) << 1) + (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) << 2);
hallValue = hallValueTemp;
PWM_T_Calculation(hallValue , mRate , direction);
}
/************************************************************************ 函数:PWM_Stop
描述:PWM控制信号使能输出,禁止TIM1中断,使能TIM1中断
参数:pwmflag=DISABLE,PWM信号使能输出,pwmflag=ENABLE,禁止 PWM输出 返回:无
*************************************************************************/ void PWM_Stop(u8 pwmflag) {
NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;
if(pwmflag == ENABLE)//禁止 PWM输出 {
TIM_Cmd(TIM1 , DISABLE); //TIM_Cmd(TIM2 , DISABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10); //PWM口
//PWM_T_Output(4 , 4 , 0); }
if(pwmflag == DISABLE)//使能PWM输出 {
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_Init(GPIOA, &GPIO_InitStructure);
// TIM_Cmd(TIM2 , ENABLE); } }
/*****************************************************************************************
函数:void Motor_Start(void) 描述:启动电机 参数: 返回:
*****************************************************************************************/
void Motor_Start(void) {
PWM_T_Int(Motor.Dir,Motor.Speed); }
/*****************************************************************************************
函数:void Motor_Stop(void) 描述:停止 参数: 返回:
*****************************************************************************************/
void Motor_Stop(void) {
//U_Up_On;V_Up_On;W_Up_On; //U_Dn_On;V_Dn_On;W_Dn_On; PWM_T_Output(4,4,0); }
/*****************************************************************************************
函数: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; } } }
三相直流无刷电机驱动程序



