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


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