51单片机之步进电机(驱动为ULN2003)

步进电机简介
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为“步距角”,它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

步进电机驱动方式
1 相励磁法:每一瞬间只有一个线圈导通,其他线圈休息。其特点是励磁方法简单,耗电低,精确度良好。但是力矩小、震动大,每次励磁信号走的角度是标称角度。
2 相励磁法:每一瞬间有两个线圈同时导通,特点是力矩大、震动较小,每次励磁转动角度是标称角度。
1-2 相励磁法:1 相和 2 相轮流交替导通,精度较高,且运转平滑。每送一个励磁信号转动二分之一标称角度。有称为半步驱动。4 相电机中,1、2 种方式称 4 相 4 拍,3 种称 4 相8 拍。
步进电机代码
1 相励磁法

#include <reg52.h>
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned char Speed;
main()
{
//unsigned int i=6416; //转2周停止
Speed=5; //调整速度
while(1)
{
Coil_A1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替
DelayMs(Speed); //改变这个参数可以调整电机转速 ,
//数字越小,转速越大,力矩越小
Coil_B1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_D1
DelayMs(Speed);
}
}
2 相励磁法
#include <reg52.h>
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned char Speed;
main()
{
//unsigned int i=64
16; //转2周停止
Speed=5; //调整速度
while(1)
{
Coil_AB1 //遇到Coil_A1 用{A1=1;B1=0;C1=0;D1=0;}代替
DelayMs(Speed); //改变这个参数可以调整电机转速 ,
//数字越小,转速越大,力矩越小
Coil_BC1
DelayMs(Speed);
Coil_CD1
DelayMs(Speed);
Coil_DA1
DelayMs(Speed);
}
}
1-2 相励磁法
#include <reg52.h>
sbit A1=P1^0; //定义步进电机连接端口
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;
#define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB相通电,其他相断电
#define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC相通电,其他相断电
#define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD相通电,其他相断电
#define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A相通电,其他相断电
#define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B相通电,其他相断电
#define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C相通电,其他相断电
#define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D相通电,其他相断电
#define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电
unsigned char Speed;
main()
{
//unsigned int i=64*16; //转2周停止
Speed=5; //调整速度
while(1)
{
Coil_AB1 //遇到Coil_AB1 用{A1=1;B1=1;C1=0;D1=0;}代替
DelayMs(Speed); //改变这个参数可以调整电机转速 ,
//数字越小,转速越大,力矩越小
Coil_B1
DelayMs(Speed);
Coil_BC1
DelayMs(Speed);
Coil_C1
DelayMs(Speed);
Coil_CD1
DelayMs(Speed);
Coil_D1
DelayMs(Speed);
Coil_DA1
DelayMs(Speed);
}
}
步进电机反转思路:设置两个循环,通过不同条件进入,里面步进电机通电顺序想法,例如A->B->C->D与D->C->B->A。

步进电机调速思路:设置speed的值,即每一次通电的延时时间,时间越小,速度越快。

步进电机设置角度思路:设置一个最小的速度,当完成一次通电流程后,看转动的角度,从而设置需要几次通电流程才能到达对应角度。

ULN2003原理图

在这里插入图片描述
//独立按键
在这里插入图片描述

实验要求:
通过ULN2003模块的驱动步进电机,将单片机的输出端口和ULN2003的IN1-IN4相接,步进电机的ABCD四相和ULN2003的OUT1-OUT4相接。ULN2003模块的GND接地,COM口接一个5V电源,其他端口悬空。
2、通过单片机驱动控制步进电机实现如下功能:
(1)按钮1按下时,步进电机正向连续转动。
(2)按钮2按下时,步进电机正向连续转动。
(3)按钮3按下时,步进电机停止转动。

//实验代码

#include <reg52.h>

//函数声明
void DelayMs(int i);
void motor_z();
void motor_f();
void motor_off();

//A B C D相端口定义
sbit A1=P1^0; 
sbit B1=P1^1;
sbit C1=P1^2;
sbit D1=P1^3;

//按键端口定义
sbit key1=P3^2; 
sbit key2=P3^3;
sbit key3=P3^4;
sbit key4=P3^5;

//通电方式
#define Coil_A1   {A1=1;B1=0;C1=0;D1=0;}
#define Coil_B1   {A1=0;B1=1;C1=0;D1=0;}
#define Coil_C1   {A1=0;B1=0;C1=1;D1=0;}
#define Coil_D1   {A1=0;B1=0;C1=0;D1=1;}
#define Coil_OFF  {A1=0;B1=0;C1=0;D1=0;}

unsigned char Speed;
void main()
{
 
  Speed=50; 
  while(1)  
  {         
     keyscan();
  }
}

//电机正转
void motor_z()
{
     Coil_A1                 
     DelayMs(Speed);        
	                         
     Coil_B1
     DelayMs(Speed);
		
     Coil_C1
     DelayMs(Speed);
		
     Coil_D1
     DelayMs(Speed);
}

//电机反转
void motor_f()
{
     Coil_D1
     DelayMs(Speed);
	
     Coil_C1
     DelayMs(Speed);
	
     Coil_B1
     DelayMs(Speed);
	
     Coil_A1
     DelayMs(Speed);
}

//电机停止
void motor_off()
{
    Coil_OFF
}

//延时
void DelayMs(int i)
{	
	while(i--);	
}

//按键扫描
void keyscan()
{
  static int a=0;
	static int b=0;
	
	if(key1==0)
	{ 
	  DelayMs(100);	
		if(key1==0)
		{
			a=~a;
			while(!key1);
		}
	}				
	
	if(a)
	{
	  motor_z();	
	}
	
	
	if(key2==0)
	{ 
	  DelayMs(100);	
		if(key2==0)
		{
			b=~b;
			while(!key2);
		}
	}				
	
	if(b)
	{
	  motor_f();	
	}
	
	
	if(key3==0)
	{ 
	  DelayMs(100);	
		if(key3==0)
		{
			a=0;
			b=0;
			while(!key3);
		}
	}				
	
	if(a==0&&b==0)
	{
	  motor_off();	
	}
	
}

原文链接:https://blog.csdn.net/Caoyang_He/article/details/87954054

  • 11
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
ULN2003是一种高电压、高电流的驱动器,适用于驱动步进电机、直流电机和其他高压负载。在经典的51单片机中,使用ULN2003驱动步进电机的方如下: 1. 首先,需要定义控制步进电机的引脚,包括四个输入引脚和一个使能引脚。这些引脚的连接方式如下: IN1 -> P2.0 IN2 -> P2.1 IN3 -> P2.2 IN4 -> P2.3 EN -> P2.4 其中,EN引脚为使能引脚,当使能引脚为低电平时,步进电机将停止运动。 2. 初始化端口:设置P2口为输出端口,使能引脚为高电平。 3. 编写一个函数用于控制步进电机的转动。该函数需要传入一个参数,表示步进电机转动的方向(正转或反转)以及转动的步数。 4. 在函数中,使用一个循环语句控制步进电机的转动。每次循环,先将使能引脚置为低电平,然后根据步进电机的转动方向,依次置高或置低四个输入引脚,以实现步进电机的转动。最后,延时一段时间,再将使能引脚置为高电平,使步进电机停止转动。 下面是具体的代码实现: ``` #include <reg52.h> // 引入51单片机头文件 sbit IN1 = P2^0; // 定义步进电机的四个输入引脚 sbit IN2 = P2^1; sbit IN3 = P2^2; sbit IN4 = P2^3; sbit EN = P2^4; // 定义步进电机的使能引脚 void delay(unsigned int t) // 延时函数 { while(t--); } void StepperMotor(int dir, int steps) // 步进电机控制函数 { int i, j; EN = 0; // 先将使能引脚置为低电平 for(i = 0; i < steps; i++) // 循环控制步进电机转动的步数 { if(dir == 0) // 正转 { for(j = 0; j < 4; j++) { switch(j) { case 0: IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; break; case 1: IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0; break; case 2: IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; break; case 3: IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1; break; } delay(2000); // 延时一段时间,控制步进电机转速 } } else // 反转 { for(j = 3; j >= 0; j--) { switch(j) { case 0: IN1 = 0; IN2 = 0; IN3 = 0; IN4 = 1; break; case 1: IN1 = 0; IN2 = 0; IN3 = 1; IN4 = 0; break; case 2: IN1 = 0; IN2 = 1; IN3 = 0; IN4 = 0; break; case 3: IN1 = 1; IN2 = 0; IN3 = 0; IN4 = 0; break; } delay(2000); // 延时一段时间,控制步进电机转速 } } } EN = 1; // 最后将使能引脚置为高电平,使步进电机停止转动 } void main() { P2 = 0; // 初始化P2口为输出端口 EN = 1; // 将使能引脚置为高电平 StepperMotor(0, 512); // 步进电机正转512步 StepperMotor(1, 512); // 步进电机反转512步 } ``` 以上就是使用ULN2003驱动步进电机的经典51单片机代码实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值