STM32F103ZET6【标准库函数开发】------通过ULN2003驱动步进电机(非PWM方式)01

如何用STM32单片机通过ULN2003驱动步进电机28BYJ-48
单片机:STM32F103ZET6
步进电机:28BYJ-48
驱动电路:ULN2003芯片的驱动板
引脚连接如下:
IN1:PC3
IN2:PC2
IN3:PC0
IN4:PC13

OUT1:步进电机4
OUT2:步进电机3
OUT3:步进电机2
OUT4:步进电机1
步进电机5:VCC电源正极(5V)
GND:共地
COM:VCC电源正极(5V)
5V直流电源:STM32F103ZET6开发板上的5V电压引脚

具体连接如下图:

代码:分三种通电方式单四拍,双四拍,八拍

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stm32f10x.h"
 
//引脚连接
//IN1:PC3
//IN2:PC2
//IN3:PC0
//IN4:PC13

//步进电机初始化函数
void Motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

//默认ULN2003四路输入低电平,输出高电平	
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);	
}
 
//步进电机正转函数
//一相励磁:单(单相绕组通电)四拍(A-B-C-D-A。。。)
void Motorcw(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);	
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);		
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,GPIO_Pin_0);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);		
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	delay_ms(5);			
}
 
int main(void)
{
//函数初始化
	delay_init();
	Motor_Init();
	
//电机循环执行
	while(1)
		{
			Motorcw();
		}
}
//二相励磁:双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。)
void Motorcw(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);	
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_0);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);		
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	delay_ms(5);		
	
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	delay_ms(5);			
}
//一二相励磁:八拍(A-AB-B-BC-C-CD-D-DA-A。。。)
void Motorcw(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);	
	
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);	
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);	
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_0);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	delay_ms(5);		
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	delay_ms(5);	
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	GPIO_SetBits(GPIOC,GPIO_Pin_2);//ULN2003输入高电平,输出低电平
	delay_ms(5);		

	GPIO_ResetBits(GPIOC,GPIO_Pin_3);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	delay_ms(5);
	
	GPIO_SetBits(GPIOC,GPIO_Pin_3);//ULN2003输入高电平,输出低电平
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_SetBits(GPIOC,GPIO_Pin_13);//ULN2003输入高电平,输出低电平
	delay_ms(5);			
}

一一一一一一一一一一一一一一一一一一一一
电机正转和反转的代码(都是用单四拍驱动步进电机):

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stm32f10x.h"

#define DC_A_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_3)
#define DC_B_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_2)
#define DC_C_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_0)
#define DC_D_OFF  GPIO_ResetBits(GPIOC,GPIO_Pin_13)

#define DC_A_ON  GPIO_SetBits(GPIOC,GPIO_Pin_3)
#define DC_B_ON  GPIO_SetBits(GPIOC,GPIO_Pin_2)
#define DC_C_ON  GPIO_SetBits(GPIOC,GPIO_Pin_0)
#define DC_D_ON  GPIO_SetBits(GPIOC,GPIO_Pin_13)


//步进电机初始化函数
void Motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

//默认ULN2003四路输入低电平,输出高电平	
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);	
}
 
步进电机正转函数
void Motorcw1(void)
{
	DC_A_ON;
	DC_B_OFF;
	DC_C_OFF;
	DC_D_OFF;
	delay_ms(6);
	
	DC_A_OFF;
	DC_B_ON;
	DC_C_OFF;
	DC_D_OFF;
	delay_ms(6);
	
	DC_A_OFF;
	DC_B_OFF;
	DC_C_ON;
	DC_D_OFF;
	delay_ms(6);	
	
	DC_A_OFF;
	DC_B_OFF;
	DC_C_OFF;
	DC_D_ON;
	delay_ms(6);	
}
步进电机反转函数
void Motorcw2(void)
{	
	DC_A_OFF;
	DC_B_OFF;
	DC_C_OFF;
	DC_D_ON;
	delay_ms(6);

	DC_A_OFF;
	DC_B_OFF;
	DC_C_ON;
	DC_D_OFF;
	delay_ms(6);	

	DC_A_OFF;
	DC_B_ON;
	DC_C_OFF;
	DC_D_OFF;
	delay_ms(6);

	DC_A_ON;
	DC_B_OFF;
	DC_C_OFF;
	DC_D_OFF;
	delay_ms(6);
}
//电机停止函数
void MotorStop(void)  
{  
    GPIO_Write(GPIOC,0x0000);  
}

int main(void)
{
//函数初始化
	delay_init();
	Motor_Init();
	
//电机循环执行
	while(1)
		{
			MotorStop();
		}
}

一一一一一一一一一一一一一一一一一一一一
用数组的方式配置电平(用单四拍驱动步进电机):
有个bug,电机可以正转,不能反转。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "stm32f10x.h"

//单四拍
u16 phasecw1[4] ={0x0008,0x0040,0x0001,0x2000};// 逆时针
u16 phaseccw2[4]={0x2000,0x0001,0x0040,0x0008};// 顺时针


//步进电机初始化函数
void Motor_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//开启时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC, &GPIO_InitStructure);

//默认ULN2003四路输入低电平,输出高电平	
	GPIO_ResetBits(GPIOC,GPIO_Pin_13);
	GPIO_ResetBits(GPIOC,GPIO_Pin_0);
	GPIO_ResetBits(GPIOC,GPIO_Pin_2);
	GPIO_ResetBits(GPIOC,GPIO_Pin_3);	
}
 
步进电机正转函数
void Motorcw1(void)
{
	{  
			uint8_t i;    
			for(i=0;i<4;i++)  
			{  
					GPIO_Write(GPIOC,phasecw1[i]);  
					delay_ms(6); 
			}  
	}		
}
步进电机反转函数
void Motorcw2(void)
{
	{  
			uint8_t a;    
			for(a=0;a<4;a++)  
			{  
					GPIO_Write(GPIOC,phaseccw2[a]);  
					delay_ms(6); 
			}  
	}		
}
//电机停止函数
void MotorStop(void)  
{  
    GPIO_Write(GPIOC,0x0000);  
}

int main(void)
{
//函数初始化
	delay_init();
	Motor_Init();
	
//电机循环执行
	while(1)
		{
			Motorcw1();
		}
}

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值