diff --git a/firmware/src/Driver/inc/motor.h b/firmware/src/Driver/inc/motor.h index 3aa0cc0..47ac929 100644 --- a/firmware/src/Driver/inc/motor.h +++ b/firmware/src/Driver/inc/motor.h @@ -36,8 +36,11 @@ typedef struct _motor /* Exported Functions --------------------------------------------------------*/ extern motor_t motor_info; +void motor_init(void); void motor_start(void); void motor_stop(void); void motor_step(void); +void motor_set_speed(s16 speed); + #endif /*********************************END OF FILE**********************************/ diff --git a/firmware/src/Driver/motor.c b/firmware/src/Driver/motor.c index b5ac7bc..f5fd67c 100644 --- a/firmware/src/Driver/motor.c +++ b/firmware/src/Driver/motor.c @@ -13,6 +13,23 @@ /* Definition ----------------------------------------------------------------*/ motor_t motor_info; /* Functions -----------------------------------------------------------------*/ +/******************************************************************************* + * @brief 电机初始化 + * @param None + * @retval None + * @note None +*******************************************************************************/ +void motor_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOB, &GPIO_InitStructure); + GPIO_WriteBit(GPIOB, GPIO_Pin_12, RESET); //关闭MOS输出 + motor_info.dir = MOTOR_DIR_CCW; +} + /******************************************************************************* * @brief 启动电机 * @param None @@ -21,10 +38,11 @@ motor_t motor_info; *******************************************************************************/ void motor_start(void) { - motor_info.state = 1; - //TODO:开启霍尔捕捉中断 - motor_info.hall_position = get_hall_position(); - motor_step(); + motor_info.state = 1; + GPIO_WriteBit(GPIOB, GPIO_Pin_12, SET); + //TODO:开启霍尔捕捉中断 + motor_info.hall_position = get_hall_position(); + motor_step(); } /******************************************************************************* @@ -35,17 +53,17 @@ void motor_start(void) *******************************************************************************/ 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); + 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); + 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); } /******************************************************************************* @@ -57,78 +75,91 @@ void motor_stop(void) *******************************************************************************/ 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: + u8 step = motor_info.dir == MOTOR_DIR_CCW ? motor_info.hall_position ^ 0x7 : 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); - GPIO_WritePin(&PB5, LOW); - //motor_stop(); - break; - } - TIM_GenerateEvent(TIM1, TIM_EventSource_COM); + 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); +} + +/******************************************************************************* + * @brief 设置电机运行速度 + * @param None + * @retval None + * @note None +*******************************************************************************/ +void motor_set_speed(s16 speed) +{ + TIM1->CCR1 = speed; + TIM1->CCR2 = speed; + TIM1->CCR3 = speed; } /*********************************END OF FILE**********************************/ diff --git a/firmware/src/Driver/pwm.c b/firmware/src/Driver/pwm.c index 0bbadc8..7bb00e1 100644 --- a/firmware/src/Driver/pwm.c +++ b/firmware/src/Driver/pwm.c @@ -20,7 +20,7 @@ *******************************************************************************/ void PWM_Config(void) { - GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; //端口结构体变量定义 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //基本结构体变量定义 TIM_OCInitTypeDef TIM_OCInitStructure; //输出结构体变量定义 TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //死区刹车结构体变量定义 @@ -59,23 +59,19 @@ void PWM_Config(void) TIM_OCInitStructure.TIM_OCMode = TIM_ForcedAction_InActive; //PWM2:递增计数时CNTCCRx,OC输出有效电平 TIM_ForcedAction_InActive TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; - TIM_OCInitStructure.TIM_Pulse = 700; + TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //TIM_OCIdleState_Set;TIM_OCIdleState_Reset TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC1Init(TIM1, &TIM_OCInitStructure); - - TIM_OCInitStructure.TIM_Pulse = 700; TIM_OC2Init(TIM1, &TIM_OCInitStructure); - - TIM_OCInitStructure.TIM_Pulse = 700; TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //TIM输出通道4初始化,用来触发AD注入采样 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; - TIM_OCInitStructure.TIM_Pulse = 1400; + TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC4Init(TIM1, &TIM_OCInitStructure); diff --git a/firmware/src/User/main.c b/firmware/src/User/main.c index c742adf..4a6a6d7 100644 --- a/firmware/src/User/main.c +++ b/firmware/src/User/main.c @@ -55,18 +55,33 @@ int main(void) GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //关闭jtag,保留swd。 SysTick_init(); GPIO_Config(&PB5, GPIO_Mode_Out_PP); - GPIO_Config(&PB12, GPIO_Mode_Out_PP); - GPIO_WritePin(&PB12, HIGH); + // USART_Config(USART1, 9600); HALL_Config(); PWM_Config(); + motor_init(); motor_start(); - + delay_ms(5000); + motor_set_speed(100); + delay_ms(5000); + motor_set_speed(300); + delay_ms(5000); + motor_set_speed(500); + delay_ms(5000); + motor_set_speed(700); + motor_info.dir=MOTOR_DIR_CW; + delay_ms(5000); + motor_set_speed(900); + delay_ms(5000); + motor_set_speed(1200); + delay_ms(5000); + motor_set_speed(1400); + delay_ms(5000); while (1) { - // GPIO_WritePin(&PB5, HIGH); - // delay_ms(500); - // GPIO_WritePin(&PB5, LOW); + GPIO_WritePin(&PB5, HIGH); + delay_ms(500); + GPIO_WritePin(&PB5, LOW); delay_ms(500); } }