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