cubemx stm32 基于uln2003模块的步进电机驱动代码

20 篇文章 2 订阅
15 篇文章 0 订阅

cubemx配置

  1. 开4个GPIO口

硬件连接

使用的是野火的指南者,型号是stm32f103ve
在这里插入图片描述

代码

uln2003.c

#include "uln2003.h"
#include "gpio.h"

//ULN2003对应的GPIO端口
#define uln_IN_PORT		GPIOE

void Delay_us(uint16_t time)//Delay_us(0) = 10.2us
{
	HAL_SYSTICK_Config(72);
	HAL_Delay(time);
	HAL_SYSTICK_Config(72000);
}

//延时
#define ULN_delay	Delay_us
#define ULN_Delay_	900

//IN0引脚
#define uln_IN0_PIN 	GPIO_PIN_10
#define uln_IN1_PIN		GPIO_PIN_11
#define uln_IN2_PIN		GPIO_PIN_12
#define uln_IN3_PIN		GPIO_PIN_13

//GPIO输出电平,lv只能输入0或1,没有错误检测,使用小心
#define IN0_LEVEL(lv)	GPIOE->ODR = ((GPIOE->ODR & (~GPIO_PIN_10))	| (GPIO_PIN_10 * (lv)))
#define IN1_LEVEL(lv)	GPIOE->ODR = ((GPIOE->ODR & (~GPIO_PIN_11))	| (GPIO_PIN_11 * (lv)))
#define IN2_LEVEL(lv)	GPIOE->ODR = ((GPIOE->ODR & (~GPIO_PIN_12))	| (GPIO_PIN_12 * (lv)))
#define IN3_LEVEL(lv)	GPIOE->ODR = ((GPIOE->ODR & (~GPIO_PIN_13))	| (GPIO_PIN_13 * (lv)))

//电机状态控制
#define AHighLevel	IN0_LEVEL(1),IN1_LEVEL(0),IN2_LEVEL(0),IN3_LEVEL(0)
#define BHighLevel	IN0_LEVEL(0),IN1_LEVEL(1),IN2_LEVEL(0),IN3_LEVEL(0)
#define CHighLevel	IN0_LEVEL(0),IN1_LEVEL(0),IN2_LEVEL(1),IN3_LEVEL(0)
#define DHighLevel	IN0_LEVEL(0),IN1_LEVEL(0),IN2_LEVEL(0),IN3_LEVEL(1)

#define ABHighLevel	IN0_LEVEL(1),IN1_LEVEL(1),IN2_LEVEL(0),IN3_LEVEL(0)
#define BCHighLevel	IN0_LEVEL(0),IN1_LEVEL(1),IN2_LEVEL(1),IN3_LEVEL(0)
#define CDHighLevel	IN0_LEVEL(0),IN1_LEVEL(0),IN2_LEVEL(1),IN3_LEVEL(1)
#define DAHighLevel	IN0_LEVEL(1),IN1_LEVEL(0),IN2_LEVEL(0),IN3_LEVEL(1)

//电机控制
#define StopIt		IN0_LEVEL(0),IN1_LEVEL(0),IN2_LEVEL(0),IN3_LEVEL(0)	//停止
#define Brake		IN0_LEVEL(1),IN1_LEVEL(1),IN2_LEVEL(1),IN3_LEVEL(1)	//刹车

#define Forward		do{								\
						AHighLevel;ULN_delay(ULN_Delay_);	\
						ABHighLevel;ULN_delay(ULN_Delay_);	\
						BHighLevel;ULN_delay(ULN_Delay_);	\
						BCHighLevel;ULN_delay(ULN_Delay_);	\
						CHighLevel;ULN_delay(ULN_Delay_);	\
						CDHighLevel;ULN_delay(ULN_Delay_);	\
						DHighLevel;ULN_delay(ULN_Delay_);	\
						DAHighLevel;ULN_delay(ULN_Delay_);	\
						}while(0)

#define Reverse		do{								\
						DHighLevel;ULN_delay(ULN_Delay_);	\
						CDHighLevel;ULN_delay(ULN_Delay_);	\
						CHighLevel;ULN_delay(ULN_Delay_);	\
						BCHighLevel;ULN_delay(ULN_Delay_);	\
						BHighLevel;ULN_delay(ULN_Delay_);	\
						ABHighLevel;ULN_delay(ULN_Delay_);	\
						AHighLevel;ULN_delay(ULN_Delay_);	\
						DAHighLevel;ULN_delay(ULN_Delay_);	\
						}while(0)




//输出一次步进电机的运动
void uln2003_MotorRotation(RotationSTATE rotationControl)
{
	switch(rotationControl)
	{
		case STOP_IT:
			StopIt;
			break;
		case BRAKE:
			Brake;
			break;
		case FORWARD:
			Forward;
			break;
		case REVERSE:
			Reverse;
			break;
		default:
			StopIt;
			break;
	}
}


uln2003.h

#ifndef __ULN2003_H_
#define __ULN2003_H_


typedef enum
{
	STOP_IT	=	0	,	//停止
	BRAKE			,	//刹车
	FORWARD			,	//正转
	REVERSE				//反转
}RotationSTATE;

//控制电机停止、刹车、正转、反转
//通过 RotationSTATE 枚举变量赋值
//注意这个函数是需要放到循环里面的,不断轮询运行
void uln2003_MotorRotation(RotationSTATE rotationControl);

/*	使用示例 

	uln2003_MotorRotation(STOP_IT);	//停止

*/

#endif /*__ULN2003_H_*/

main.c

头文件

#include "uln2003.h"

main函数

初始化

while循环
uln2003_MotorRotation(REVERSE);	//反转
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入一下?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值