cubemx配置
- 开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); //反转