天天看點

STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)

一、環境介紹

MCU: STM32F103ZET6

程式設計軟體:  Keil5

二、硬體介紹

開發闆采用STM32F103ZET6 最小系統闆

STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)
電機驅動闆采用的是ULN2003
STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)
步進電機采用的是28BYJ4  (5V 4相5線步進電機)
STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)
STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)
三、驅動代碼
STM32+ULN2003驅動28BYJ4步進電機(根據圈數正轉、反轉)
3.1 motor.c

#include "motor.h"
 
 
//步進電機正反轉數組1
u16 PositiveSequence[4] ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A   
u16 ReverseOrder[4]={0x0040,0x0080,0x0100,0x0200};// A-B-C-D.
 
 
void motor_delay_ms(u32 ms)
{
 u32 i,j;
    for(i=0;i<ms;i++)
        for(j=0;j<112;j++);
}
 
void motor_stop(void)  
{  
    MOTOR_1=0;
    MOTOR_2=0;
    MOTOR_3=0;
    MOTOR_4=0;
}
 
void motor_init(void)
{
    RCC->APB2ENR|=1<<4;
    GPIOC->CRL&=0x00FFFFFF;
    GPIOC->CRL|=0x33000000;
    GPIOC->CRH&=0xFFFFFF00;
    GPIOC->CRH|=0x00000033;
    
// IN4: PC9   d
// IN3: PC8   c
// IN2: PC7   b
// IN1: PC6   a
}
 
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)
{
  GPIOx->ODR = PortVal;
}
 
 
void motor_just(int speed)  //一個脈沖
{  
    uint8_t i;  
  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,PositiveSequence[i]);
        motor_delay_ms(speed);  
    }
}
 
 
void motor_back(int speed)  
{  
    uint8_t i;  
    for(i=0;i<4;i++)  
    {  
        GPIO_Write(GPIOC,ReverseOrder[i]);  
        motor_delay_ms(speed);  
    } 
 
}
 
 
//由于   *一個脈沖*   *輸出軸*  轉0.08789度(電機實轉0.08789*64=5.625度),即步進角為5.625度。則轉完A-B-C-D為  *8個脈沖*  
//,即0.08789*8=0.70312度。若稱A-B-C-D為一個周期,則j為需要的轉完angle角度所需的周期數。
//步進電機正轉角度函數
void motor_just_angle(int angle,int speed)
{
    int i,j;
    j=(int)(angle/0.70312);
    for(i=0;i<j;i++)
    {
        motor_just(speed);
    }
    motor_stop();
}
 
 
 
//步進電機反轉角度函數
void motor_back_angle(int angle,int speed)
{
    int i,j;
    j=(int)(angle/0.70312);
    for(i=0;i<j;i++)
    {
        motor_back(speed);
    }
    motor_stop();
}
 
 
//步進電機反轉圈函數
void motor_back_circle(int ring ,int speed)
{
    int i;
    for(i=0;i<ring;i++)
    {
        motor_back_angle(360,speed);
    }
}
 
//步進電機正轉圈函數
void motor_just_circle(int ring,int speed) //步進電機正轉角度函數
{
    int i;
    for(i=0;i<ring;i++)
    {
        motor_just_angle(360,speed);
    }
}
 
       

3.2  motor.h

#ifndef _MOTOR_H
#define _MOTOR_H
#include "sys.h"
 
void motor_delay_ms(u32 x);//延時函數
void motor_init(void);  //步進電機初始化
void motor_just(int speed);    //步進電機正轉函數
void motor_back(int speed);   //步進電機反轉函數
void motor_just_angle(int angle,int speed);  //步進電機正轉角度函數
void motor_back_angle(int angle,int speed); //步進電機反轉角度函數
void motor_stop(void);  //步進電機停止函數
void motor_just_circle(int ring ,int speed); //步進電機正轉圈函數
void motor_back_circle(int ring ,int speed);//步進電機反轉圈函數
 
//IN
#define MOTOR_1  PCout(6)
#define MOTOR_2  PCout(7)
#define MOTOR_3  PCout(8)
#define MOTOR_4  PCout(9)
 
#endif      

3.3 main.c

/*
ULN2003控制28BYJ-48步進電機接線:
ULN2003接線:
IN4: PC9   d
IN3: PC8   c
IN2: PC7   b
IN1: PC6   a
+  : 5V
-  : GND
*/
 
int main()
{
    u8 time_cnt=0;
    u8 key;
    LED_Init();
    KEY_Init();
    USART1_Init(115200);
    motor_init();  //步進電機初始化
    USART1_Printf("程式初始化.....\r\n");
    
     while(1)
     {
         //按鍵可以測試開鎖和關鎖
        key=KEY_Scan(0);
        if(key==1)
        {
            LED1=0;  //亮燈--表示開鎖
            motor_just_circle(1,300);   //電機正轉1圈
        }
        else if(key==2)
        {
            LED1=1;  //滅燈--表示關鎖
            motor_back_circle(1,300);  //電機反轉1圈
        } 
 
        DelayMs(10);
        time_cnt++;
        if(time_cnt>=50)
        {
            time_cnt=0;
            LED2=!LED2;
        }
     }
}      

繼續閱讀