小言_互联网的博客

STM32F103+步进电机28BYJ-48+ULN2003 实现简单的正反转demo

333人阅读  评论(0)

前言

注意:浇水由LED1的亮灭进行模拟
源码参考:
    步进电机28BYJ-48的驱动程序(stm32f103c8t6)
    正点原子按键实验
开发板:正点原子 STM32F103 精英版
语言:C语言
开发环境:Keil5
开发板使用了 LED KEY 步进电机28BYJ-48 ULN2003驱动

代码下载:

码云 GitHub

功能介绍:

LED1约1秒1反转。
按KEY0,翻转LED1,电机反转1圈
按KEY1,翻转LED1,电机正转1圈
按KEY_UP,翻转LED1,电机正转半圈

拓展应用

STM32F103+DHT11模块 简单实现 智能浇水系统demo

参考资料




接线

+>   5V
->   GND
IN1  —>   PF1
IN2  —>   PF2
IN3  —>   PF3
IN4  —>   PF4

效果图

按下KEY0,LED1翻转,电机反转一圈。风车折法参考 传送门

核心代码

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "beep.h"
#include "step.h"

//IN4: PB6  d
//IN3: PB5  c
//IN2: PB4  b
//IN1: PB3  a

int main(void)
{
   
	vu8 key = 0;
	uint8_t time = 0;
	delay_init(); //延时函数初始化
	LED_Init();	  //初始化与LED连接的硬件接口
	BEEP_Init();  //初始化蜂鸣器端口
	KEY_Init();	  //初始化与按键连接的硬件接口
	Step_Motor_GPIO_Init();
	
	LED0 = 0;
	BEEP = 0;
	
	while (1)
	{
   
		key = KEY_Scan(0); //得到键值
		if (key)
		{
   
			switch (key)
			{
   
				case WKUP_PRES: // 翻转LED1,电机正转半圈
					LED1 = !LED1;
					/*
						功能:转1/64圈
						步距角5.625 360/5.625=64 减速比1/64
						故64*64个脉冲转一圈
						n 圈数
						direction 方向 1正转 非1反转
						delay delay时长ms >= 2
					*/
					motor_circle(32, 1, 2);
					break;
				case KEY1_PRES: // 翻转LED1,电机正转1圈
					LED1 = !LED1;
					motor_circle(64, 1, 2);
					break;
				case KEY0_PRES: // 翻转LED1,电机反转1圈
					LED1 = !LED1;
					motor_circle(64, 0, 2);
					break;
			}
		}
		
		time++;
		if(time % 100 == 0)
		{
   
			LED0 = !LED0;
		}
	
		delay_ms(10);
	}
}

step.h

#ifndef  __STEP_H__
#define __STEP_H__
 
#include "stm32f10x.h"
 
void Step_Motor_GPIO_Init(void);
/*
	功能:转1/64圈
	步距角5.625 360/5.625=64 减速比1/64
	故64*64个脉冲转一圈
	n 圈数
	direction 方向 1正转 非1反转
	delay delay时长 >= 2
*/
void motor_circle(int n, int direction, int delay);

#endif

step.c

#include "sys.h"
#include "delay.h"
#include "step.h"

//IN4: PF4  d
//IN3: PF3  c
//IN2: PF2  b
//IN1: PF1  a

u8 forward[4] = {
   0x03,0x06,0x0c,0x09}; // 正转
u8 reverse[4]= {
   0x03,0x09,0x0c,0x06}; // 反转

//引脚初始化
void Step_Motor_GPIO_Init(void)
{
   
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1;
    GPIO_Init(GPIOF, &GPIO_InitStructure);
}

//引脚映射
void SetMotor(unsigned char InputData)
{
   
	if(InputData == 0x03)
	{
   
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		GPIO_SetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x06)
	{
   
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_SetBits(GPIOF,GPIO_Pin_2);
		GPIO_SetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x09)
	{
   
		GPIO_SetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_SetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x0c)
	{
   	
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_SetBits(GPIOF,GPIO_Pin_3);
		GPIO_SetBits(GPIOF,GPIO_Pin_4);
	}
	else if(InputData == 0x00)
	{
   
		GPIO_ResetBits(GPIOF,GPIO_Pin_1);
		GPIO_ResetBits(GPIOF,GPIO_Pin_2);
		GPIO_ResetBits(GPIOF,GPIO_Pin_3);
		GPIO_ResetBits(GPIOF,GPIO_Pin_4);
	}
}

/*
	功能:转1/64圈
	步距角5.625 360/5.625=64 减速比1/64
	故64*64个脉冲转一圈
	n 圈数
	direction 方向 1正转 非1反转
	delay delay时长ms >= 2
*/
void motor_circle(int n, int direction, int delay)
{
   
    int i, j;
    for(i = 0; i < n * 8; i++)
    {
   
		for(j = 0; j < 4; j++)
		{
   
			if(1 == direction)
			{
   
				SetMotor(0x00);
				SetMotor(forward[j]);
			}
			else
			{
   
				SetMotor(0x00);
				SetMotor(reverse[j]);
			}
			
			delay_ms(delay > 2 ? delay : 2);
		}
    }
}


转载:https://blog.csdn.net/Ikaros_521/article/details/116598144
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场