/******************************************************************************* * @file motor.c * @author: MQjehovah mail:MQjehovah@hotmail.com * @version 1.0.0 * @date 2020.10.20 * @brief ****************************************************************************** * @attention *******************************************************************************/ /* Includes ------------------------------------------------------------------*/ #include "motor.h" /* Definition ----------------------------------------------------------------*/ motor_t motor_info; static const uint8_t BLDC_STEP_FORWARD[8][6] = // Motor step { //A+,A-,B+,B-,C+,C- {0, 0, 0, 0, 0, 0}, //000 {0, 0, 1, 0, 0, 1}, {1, 0, 0, 1, 0, 0}, {1, 0, 0, 0, 0, 1}, {0, 1, 0, 0, 1, 0}, {0, 1, 1, 0, 0, 0}, {0, 0, 0, 1, 1, 0}, {0, 0, 0, 0, 0, 0}, //111 }; /* Functions -----------------------------------------------------------------*/ /******************************************************************************* * @brief 停止电机 * @param None * @retval None * @note None *******************************************************************************/ void motor_stop() { 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 None *******************************************************************************/ void motor_step() { const uint8_t *step = BLDC_STEP_FORWARD[motor_info.hall_position]; if (motor_info.hall_position == 0) { //停止处理 TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); return; } if (motor_info.hall_position == 7) { //刹车处理 TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); return; } //换相 if (step[0]) //A+ { TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); } if (step[1]) //A- { TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); } if (step[2]) //B+ { TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); } if (step[3]) //B- { TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable); } if (step[4]) //C+ { TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); } if (step[5]) //C- { TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); } else { TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable); } } /*********************************END OF FILE**********************************/