一、實(shí)驗(yàn)原理(以28BYJ48步進(jìn)電機(jī)為例)和51控制步進(jìn)電機(jī)原理一致
1、五線四相步進(jìn)電機(jī),不同線圈得電會(huì)讓步進(jìn)電機(jī)的轉(zhuǎn)子轉(zhuǎn)動(dòng)一個(gè)角度,按一定規(guī)律給不同的線圈通電,就可以讓步進(jìn)電機(jī)連續(xù)轉(zhuǎn)動(dòng),下表就是步進(jìn)電機(jī)和拆解后的圖片,以及四根線通電的順序。
注:總共五條線,一個(gè)是VCC,剩下四條分別接上ABCD相。
2、每走一個(gè)位置,都要給一定的延時(shí),不然還沒(méi)等轉(zhuǎn)子到位,下一個(gè)脈沖就進(jìn)來(lái)了,肯定會(huì)引起錯(cuò)誤,導(dǎo)致電機(jī)堵轉(zhuǎn)、異常震動(dòng)。
3、通過(guò)改變延時(shí)的時(shí)間,就可以控制電機(jī)的轉(zhuǎn)速,不能太慢,也不要太快,不斷調(diào)試到合理范圍就行,轉(zhuǎn)向用了一個(gè)枚舉類(lèi)型,控制轉(zhuǎn)向。
4、單片機(jī)IO口和電機(jī)四條線連接時(shí),一定不能錯(cuò)誤,要按照順序相連接。
5、調(diào)換得電的順序,就可以控制電機(jī)的轉(zhuǎn)向。
二、關(guān)鍵實(shí)驗(yàn)代碼
//實(shí)驗(yàn)用到的引腳要先進(jìn)行初始化
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);
}
//控制轉(zhuǎn)向和速度 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);
}