当前位置:网站首页>STM32+ULN2003 drives 28BYJ4 stepper motor (forward and reverse according to the number of turns)
STM32+ULN2003 drives 28BYJ4 stepper motor (forward and reverse according to the number of turns)
2022-08-05 10:03:00 【InfoQ】
采用STM32驱动28BYJ4步进电机,Realize forward and reverse,Complete the angle adjustment.步进电机是一种将电脉冲转化为角位移的执行机构.当步进驱动器接收到一个脉冲信号,It drives the stepper motor to rotate in the set direction- -a fixed angle(及步进角).The amount of angular displacement can be controlled by controlling the number of pulses,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的.
一、环境介绍
MCU:
STM32F103ZET6
编程软件:
Keil5
二、硬件介绍
开发板采用STM32F103ZET6 最小系统板
The motor driver board is usedULN2003
Stepper motors are used28BYJ4 (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();
}
//The stepper motor reverses the circle function
void motor_back_circle(int ring ,int speed)
{
int i;
for(i=0;i<ring;i++)
{
motor_back_angle(360,speed);
}
}
//Stepper motor forward rotation function
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); //Stepper motor forward rotation function
void motor_back(int speed); //Stepper motor reversal function
void motor_just_angle(int angle,int speed); //步进电机正转角度函数
void motor_back_angle(int angle,int speed); //步进电机反转角度函数
void motor_stop(void); //Stepper motor stop function
void motor_just_circle(int ring ,int speed); //Stepper motor forward rotation function
void motor_back_circle(int ring ,int speed);//The stepper motor reverses the circle function
//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;
}
}
}
边栏推荐
- three.js调试工具dat.gui使用
- Advanced usage of C language
- How to realize the short press and long press detection of the button?
- PHP 操作mangoDb
- How ali cloud storage database automatically to speed up the loading speed of www.cxsdkt.cn how to set up the case?
- 气象数据数据处理实例——matlab字符串切割匹配与R语言日期匹配(数据拼接)
- 一文道清什么是SPL
- 语音社交软件开发——充分发挥其价值
- static linking and dynamic linking
- Voice conversion相关语音数据集综合汇总
猜你喜欢
随机推荐
2022华数杯数学建模A题环形振荡器的优化设计思路思路代码分享
[强网杯2022]WP-UM
Custom filters and interceptors implement ThreadLocal thread closure
电竞、便捷、高效、安全,盘点OriginOS功能的关键词
5.部署web项目到云服务器
轩辕实验室丨欧盟EVITA项目预研 第一章(四)
数据中台建设(十):数据安全管理
Handwriting Currying - toString Comprehension
IO流篇 -- 基于io流实现文件夹拷贝(拷贝子文件夹及子文件夹内文件)满满的干货
正则表达式replaceAll()方法具有什么功能呢?
Tanabata romantic date without overtime, RPA robot helps you get the job done
无题六
Keil升级到AC6后,到底有哪些变化?
C语言的高级用法
Jenkins使用手册(2) —— 软件配置
egg框架使用(二)
SD NAND Flash简介!
IO stream articles -- based on io stream to realize folder copy (copy subfolders and files in subfolders) full of dry goods
leetcode: 529. 扫雷游戏
LeetCode 216. Combined Sum III (2022.08.04)