更改换步逻辑

This commit is contained in:
MQjehovah 2020-10-21 00:30:52 +08:00
parent 22ed9c3a1f
commit 0260bad0a7
2 changed files with 84 additions and 85 deletions

View File

@ -12,6 +12,12 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "stm32f10x_conf.h" #include "stm32f10x_conf.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
enum motor_dir
{
MOTOR_DIR_CW, //正向
MOTOR_DIR_CCW //反向
};
enum motor_state enum motor_state
{ {
MOTOR_STATE_STOP //停止状态 MOTOR_STATE_STOP //停止状态
@ -19,9 +25,10 @@ enum motor_state
typedef struct _motor typedef struct _motor
{ {
u8 state; //运行状态
u8 dir; u8 dir;
u8 hall_position; u8 state; //运行状态
u8 hall_position; //霍尔位置
s16 speed; //转速
} motor_t; } motor_t;

View File

@ -11,19 +11,23 @@
#include "motor.h" #include "motor.h"
/* Definition ----------------------------------------------------------------*/ /* Definition ----------------------------------------------------------------*/
motor_t motor_info; 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 -----------------------------------------------------------------*/ /* 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 * @brief
* @param None * @param None
@ -49,89 +53,77 @@ void motor_stop()
* @brief 6 * @brief 6
* @param None * @param None
* @retval None * @retval None
* @note None * @note H-PWM, L-ON
* PWM总是出现在A+B+C+,
*******************************************************************************/ *******************************************************************************/
void motor_step() void motor_step()
{ {
const uint8_t *step = BLDC_STEP_FORWARD[motor_info.hall_position]; u8 step = 0;
if (motor_info.hall_position == 0) switch (step)
{
//停止处理
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+
{ {
case 0x00: //第一步 A+ B-
TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1); TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); 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); TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
} TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
if (step[3]) //B-
{
TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active); 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_2, TIM_CCxN_Enable);
} TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
else 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_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); TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
} TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_ForcedAction_Active);
if (step[5]) //C- TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
{ TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_ForcedAction_Active); TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);
TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable); break;
} case 0x02: //第三步 A+ B-
else 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_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;
} }
} }