STM32+ULN2003驱动28BYJ4步进电机(正反转)

来源: DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-03-21 19:35:02

  ​


一、环境介绍


  MCU: STM32F103ZET6

  编程软件: Keil5


二、硬件介绍


  开发板采用STM32F103ZET6 最小系统板

  ​

  电机驱动板采用的是ULN2003

  ​

  步进电机采用的是28BYJ4 (5V 4相5线步进电机)

  ​

  ​


三、驱动代码


  ​


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;iAPB2ENR|=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;i++)>;i++)>

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; } } } 

  

  

  审核编辑:汤梓红

  

0
收藏
0