2020-10-20 14:43:40 +00:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @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;
|
|
|
|
|
/* Functions -----------------------------------------------------------------*/
|
2020-10-20 16:30:52 +00:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @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);
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-20 14:43:40 +00:00
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* @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
|
2020-10-20 16:30:52 +00:00
|
|
|
|
* @note H-PWM, L-ON
|
|
|
|
|
* 电流始终由正极流向负极,所以PWM总是出现在A+、B+、C+,负极保持导通
|
2020-10-20 14:43:40 +00:00
|
|
|
|
*******************************************************************************/
|
|
|
|
|
void motor_step()
|
|
|
|
|
{
|
2020-10-20 16:30:52 +00:00
|
|
|
|
u8 step = 0;
|
|
|
|
|
switch (step)
|
2020-10-20 14:43:40 +00:00
|
|
|
|
{
|
2020-10-20 16:30:52 +00:00
|
|
|
|
case 0x00: //第一步 A+ B-
|
|
|
|
|
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
|
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
|
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
|
|
|
|
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
|
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
break;
|
|
|
|
|
case 0x03: //第四步 A+ B-
|
2020-10-20 14:43:40 +00:00
|
|
|
|
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);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
|
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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);
|
2020-10-20 14:43:40 +00:00
|
|
|
|
TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
|
2020-10-20 16:30:52 +00:00
|
|
|
|
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;
|
2020-10-20 14:43:40 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*********************************END OF FILE**********************************/
|