如何用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();
}
}