一、实验原理(以28BYJ48步进电机为例)和51控制步进电机原理一致
1、五线四相步进电机,不同线圈得电会让步进电机的转子转动一个角度,按一定规律给不同的线圈通电,就可以让步进电机连续转动,下表就是步进电机和拆解后的图片,以及四根线通电的顺序。
注:总共五条线,一个是VCC,剩下四条分别接上ABCD相。
2、每走一个位置,都要给一定的延时,不然还没等转子到位,下一个脉冲就进来了,肯定会引起错误,导致电机堵转、异常震动。
3、通过改变延时的时间,就可以控制电机的转速,不能太慢,也不要太快,不断调试到合理范围就行,转向用了一个枚举类型,控制转向。
4、单片机IO口和电机四条线连接时,一定不能错误,要按照顺序相连接。
5、调换得电的顺序,就可以控制电机的转向。
二、关键实验代码
//实验用到的引脚要先进行初始化
void ULN2003_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_WriteBit(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, Bit_RESET);
}
//控制转向和速度 enum dir{Pos, Neg}; //Pos = 0, Neg = 1
void stepper(unsigned int dir, unsigned int speed)
{
if(dir == Pos)
{
//step1:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step2:
IN1_HIGH;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step3:
IN1_LOW;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step4:
IN1_LOW;
IN2_HIGH;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step5:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step6:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_HIGH;
Delay_us(speed);
//step7:
IN1_LOW;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step8:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
}
else
{
//step1:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step2:
IN1_LOW;
IN2_LOW;
IN3_LOW;
IN4_HIGH;
Delay_us(speed);
//step3:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_HIGH;
Delay_us(speed);
//step4:
IN1_LOW;
IN2_LOW;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step5:
IN1_LOW;
IN2_HIGH;
IN3_HIGH;
IN4_LOW;
Delay_us(speed);
//step6:
IN1_LOW;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step7:
IN1_HIGH;
IN2_HIGH;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
//step8:
IN1_HIGH;
IN2_LOW;
IN3_LOW;
IN4_LOW;
Delay_us(speed);
}
相关文章