我使用stm32来按键控制步进电机,本意是想按一次键,电机就整步n次,但是一按键,这个角度就一直转,变化幅度挺慢的,观察角度变化,有种在零点几反复跳的感觉,但是整体是增加的。
以下是主函数和步进电机的封装函数
###NextPage[title=主函数]###
u8 KeyNum;
int main()
{
KEY_Init();
KEY_GetNum();
Motor_Init();
while(1)
{
KeyNum = KEY_GetNum();
if(KEY_GetNum()==8)
{
Motor_RotateByStep(Foreward ,1000,5);
Motor_Stop ();
}
}
###NextPage[title=步进电机]###
uint8_t STEP; // 用于存储电机正在走过的整步编号
void Motor_Init(void)
{
// 选择PB7,PB6,PB5,PB4分别为相A,B,C,D的输出
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = Motor_A1|Motor_B1|Motor_C1|Motor_D1;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStruct);
GPIO_ResetBits(GPIOB,Motor_A1|Motor_B1|Motor_C1|Motor_D1);
}
void Motor_SingleStep(uint8_t StepNum, uint16_t Delay_Time_xms)
{
switch(StepNum)
{
case 0: // A
GPIO_WriteBit(GPIOB, Motor_A1, Bit_SET);
GPIO_WriteBit(GPIOB, Motor_B1 | Motor_C1 | Motor_D1, Bit_RESET);
break;
case 1: // B
GPIO_WriteBit(GPIOB, Motor_B1, Bit_SET);
GPIO_WriteBit(GPIOB, Motor_A1 | Motor_C1 | Motor_D1, Bit_RESET);
break;
case 2: // C
GPIO_WriteBit(GPIOB, Motor_C1, Bit_SET);
GPIO_WriteBit(GPIOB, Motor_A1 | Motor_B1 | Motor_D1, Bit_RESET);
break;
case 3: // D
GPIO_WriteBit(GPIOB, Motor_D1, Bit_SET);
GPIO_WriteBit(GPIOB, Motor_A1 | Motor_B1 | Motor_C1, Bit_RESET);
break;
default: break;
}
delay_ms(Delay_Time_xms); // 延时,控制电机速度
//Motor_Stop(); // 断电,防止电机过热
}
void Motor_RotateByStep(RotDirection direction, uint32_t step, uint16_t Delay_Time_xms)
{
for (uint32_t i = 0; i < step; i ++)
{
if (direction == Foreward) // 电机正传
{
STEP ++;
if (STEP > 3)
{
STEP = 0;
}
}
else if (direction == Reversal) // 电机反转
{
if (STEP < 1)
{
STEP = 4;
}
STEP --;
}
Motor_SingleStep(STEP, Delay_Time_xms);
led(1);
}
}
###NextPage[title=仿真原理图]###
|