diff --git a/firmware/src/Driver/inc/motor.h b/firmware/src/Driver/inc/motor.h index dc2c6e8..ee35bb0 100644 --- a/firmware/src/Driver/inc/motor.h +++ b/firmware/src/Driver/inc/motor.h @@ -12,6 +12,12 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x_conf.h" /* Definition ----------------------------------------------------------------*/ +enum motor_dir +{ + MOTOR_DIR_CW, //正向 + MOTOR_DIR_CCW //反向 +}; + enum motor_state { MOTOR_STATE_STOP //停止状态 @@ -19,9 +25,10 @@ enum motor_state typedef struct _motor { - u8 state; //运行状态 u8 dir; - u8 hall_position; + u8 state; //运行状态 + u8 hall_position; //霍尔位置 + s16 speed; //转速 } motor_t; diff --git a/firmware/src/Driver/motor.c b/firmware/src/Driver/motor.c index 98c86c6..82a7aeb 100644 --- a/firmware/src/Driver/motor.c +++ b/firmware/src/Driver/motor.c @@ -11,19 +11,23 @@ #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 开启霍尔捕捉中断,提供启动力 +*******************************************************************************/ +void motor_start() +{ + motor_info.state = 1; + TIM1->CCR1 = 0; + TIM1->CCR2 = 0; + TIM1->CCR3 = 0; + //TODO:开启霍尔捕捉中断 + motor_step(motor_info.hall_position); +} + /******************************************************************************* * @brief 停止电机 * @param None @@ -49,89 +53,77 @@ void motor_stop() * @brief 电机6步驱动法 * @param None * @retval None - * @note None + * @note H-PWM, L-ON + * 电流始终由正极流向负极,所以PWM总是出现在A+、B+、C+,负极保持导通 *******************************************************************************/ 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+ + u8 step = 0; + switch (step) { + case 0x00: //第一步 A+ B- 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_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); - } - else - { + TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable); + break; + case 0x01: //第二步 A+ B- + 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); - } - - 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_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 0x02: //第三步 A+ B- + 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; + case 0x03: //第四步 A+ B- + 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; + case 0x04: //第五步 A+ B- + 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; + case 0x05: //第六步 A+ B- + 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: + motor_stop(); + break; } }