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

在之前的驱动步进电机的基础上引入了按键的功能,可以通过按键实现电机的正转、反转和停止。
硬件连接如下:

单片机: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电压引脚

废话不多说,直接上代码。
这个代码是有bug的,就是开机之后只能选择一次运行方式,正转/反转/停止,如果想要更换运行方式只能重新复位

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "stm32f10x.h"

u16 phasecw1[4] ={0x0008,0x0040,0x0001,0x2000};// 逆时针
u16 phaseccw2[4]={0x2000,0x0001,0x0040,0x0008};// 顺时针
//单四拍
#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)
{
	{  
			uint8_t i;   	
				for(i=0;i<4;i++)  
				{  
						GPIO_Write(GPIOC,phasecw1[i]);  
						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)
{
	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
	KEY_Init();          //初始化与按键连接的硬件接口
	Motor_Init();
	while(1)
	{
			key=KEY_Scan(0);	//得到键值
				if(key)
			{						   
				switch(key)
				{				 
					case KEY2_PRES:	//控制电机正转
						while(1)
						{
						Motorcw1();
						}
						break;
						
					case KEY1_PRES:	//控制电机反转
						while(1)
						{
						Motorcw2();
						}
						
						break;
						
					case KEY0_PRES:	//控制电机停止
						while(1)
						{
						MotorStop();
						}
						break;
				}
			}
		else delay_ms(10); 
	}	 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值