/******************************************************************************* * @file motor.c * @author: MQjehovah mail:MQjehovah@hotmail.com * @version 1.0.0 * @date 2020.10.20 * @brief ****************************************************************************** * @attention *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "motor.h" #include "GPIO.h" /* Definition ----------------------------------------------------------------*/ motor_t motor_info; /* Functions -----------------------------------------------------------------*/ /******************************************************************************* * @brief 启动电机 * @param None * @retval None * @note 开启霍尔捕捉中断,提供启动力 *******************************************************************************/ void motor_start(void) { motor_info.state = 1; //TODO:开启霍尔捕捉中断 motor_info.hall_position = get_hall_position(); motor_step(); } /******************************************************************************* * @brief 停止电机 * @param None * @retval None * @note None *******************************************************************************/ void motor_stop(void) { motor_info.state = MOTOR_STATE_STOP; TIM1->CCR1 = 0; TIM1->CCR2 = 0; TIM1->CCR3 = 0; TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); } /******************************************************************************* * @brief 电机6步驱动法 * @param None * @retval None * @note H-PWM, L-ON * 电流始终由正极流向负极,所以PWM总是出现在A+、B+、C+,负极保持导通 *******************************************************************************/ void motor_step(void) { u8 step = motor_info.hall_position; switch (step) { case 0x03: //第二步 C+ B- TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable); TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; case 0x01: //第三步 C+ A- TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable); TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; case 0x05: //第四步 B+ A- TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; case 0x04: //第五步 B+ C- TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); break; case 0x06: //第六步 A+ C- TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); break; case 0x02: //第一步 A+ B- // GPIO_WritePin(&PB5, HIGH); TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); break; default: // GPIO_WritePin(&PB5, HIGH); GPIO_WritePin(&PB5, LOW); //motor_stop(); break; } TIM_GenerateEvent(TIM1, TIM_EventSource_COM); } /*********************************END OF FILE**********************************/