前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)

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

作者头像
DS小龙哥
发布2022-01-17 15:40:32
发布2022-01-17 15:40:32
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

一、环境介绍

MCU: STM32F103ZET6

编程软件: Keil5

二、硬件介绍

开发板采用STM32F103ZET6 最小系统板

电机驱动板采用的是ULN2003

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

三、驱动代码

3.1 motor.c

代码语言:javascript
代码运行次数:0
运行
复制
#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

代码语言:javascript
代码运行次数:0
运行
复制
#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

代码语言:javascript
代码运行次数:0
运行
复制
/*
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;
        }
	 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/05/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、环境介绍
  • 二、硬件介绍
  • 三、驱动代码
    • 3.1 motor.c
    • 3.2 motor.h
    • 3.3 main.c
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档