STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)

简介: STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)

一、环境介绍

MCU: STM32F103ZET6

编程软件:  Keil5

二、硬件介绍

开发板采用STM32F103ZET6 最小系统板

image.png

电机驱动板采用的是ULN2003

image.png

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

image.png

image.png

三、驱动代码

image.png

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


目录
相关文章
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
STM32Cubemx PWM驱动加湿器模拟火山喷发效果
348 14
STM32Cubemx PWM驱动SG90舵机
STM32Cubemx PWM驱动SG90舵机
805 13
STM32CubeMX mpu6050驱动
STM32CubeMX mpu6050驱动
253 10
STM32CubeMX EC11旋转编码器驱动
STM32CubeMX EC11旋转编码器驱动
1399 10
STM32CubeMX OLED驱动
STM32CubeMX OLED驱动
272 10
STM32CubeMX WS2812B灯驱动
STM32CubeMX WS2812B灯驱动
1192 1
STM32CubeMX ULN2003步进电机驱动
STM32CubeMX ULN2003步进电机驱动
390 0
|
传感器
手把手在STM32F103C8T6上构建可扩展可移植的DHT11驱动
【8月更文挑战第29天】本文详细介绍在STM32F103C8T6上构建可扩展且可移植的DHT11温湿度传感器驱动的步骤,包括硬件与软件准备、硬件连接、驱动代码编写及测试。通过这些步骤,可根据实际项目需求优化和扩展代码。
694 0
STM32Cubemx TB6612直流电机驱动
STM32Cubemx TB6612直流电机驱动
975 0
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
1429 2