当前位置:网站首页>STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
STM32+ULN2003驱动28BYJ4步进电机(根据圈数正转、反转)
2022-08-05 09:47:00 【InfoQ】
一、环境介绍
二、硬件介绍




三、驱动代码

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;
}
}
}
边栏推荐
猜你喜欢

Oracle临时表空间作用

NowCoderTOP35-40——持续更新ing

深度学习21天——卷积神经网络(CNN):天气识别(第5天)

Two-table query average grouping in sql server

Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)

皕杰报表的下拉框联动

hcip BGP 增强实验

2022.8.3

Hundred lines of code launch red hearts, why programmers lose their girlfriends!

CCVR eases heterogeneous federated learning based on classifier calibration
随机推荐
CCVR基于分类器校准缓解异构联邦学习
程序员的七种武器
偏向锁/轻量锁/重级锁锁锁更健康,上锁解锁到底是怎么完成实现的
【ASM】字节码操作 方法的初始化 Frame
2022/8/4 考试总结
手写柯里化 - toString 理解
Imitation SBUS fixed with serial data conversion
基于 Kubernetes 的微服务项目整体设计与实现
ffmpeg drawtext 添加文本水印
egg框架使用(二)
上海控安技术成果入选市经信委《2021年上海市网络安全产业创新攻关成果目录》
dotnet OpenXML parsing PPT charts Getting started with area charts
seata源码解析:事务状态及全局锁的存储
PAT Grade B-B1020 Mooncake(25)
什么是CRM决策分析管理?
leetcode refers to Offer 10- II. Frog jumping steps
The technological achievements of Shanghai Konan were selected into the "2021 Shanghai Network Security Industry Innovation Research Achievement Catalog" by the Municipal Commission of Economy and Inf
Pytorch Deep Learning Quick Start Tutorial -- Mound Tutorial Notes (3)
蚁剑webshell动态加密连接分析与实践
Oracle temporary table space role