2025年4月11日 星期五 乙巳(蛇)年 正月十二 设为首页 加入收藏
rss
您当前的位置:首页 > 电子 > 单片机

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

时间:11-20来源:作者:点击数:28
城东书院 www.cdsy.xyz

一、环境介绍

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;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;
  • }
  • }
  • }
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐