bldc/firmware/src/Driver/motor.c

139 lines
4.5 KiB
C
Raw Normal View History

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;
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**********************************/