更改换步逻辑
This commit is contained in:
parent
22ed9c3a1f
commit
0260bad0a7
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user