一、實驗原理(以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);
}