步进电机用单片机控制转动

作者&投稿:桐狠 (若有异议请与网页底部的电邮联系)
51单片机, 编一个控制步进电机转动的程序。~

#include //51芯片管脚定义头文件
#include //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw(uint n)
{
uchar i;
uint j;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
P1 = FFW[i]; //取数据
delay(15); //调节转速
}
}
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev(uint n)
{
uchar i;
uint j;
for (j=0; j<12*n; j++) //转1×n圈
{
for (i=0; i<8; i++) //一个周期转30度
{
P1 = REV[i]; //取数据
delay(15); //调节转速
}
}
}
/********************************************************
*
* 主程序
*
*********************************************************/

main()
{
while(1)
{
motor_ffw(5); //电机正转
delay(5000); //换向延时
//motor_rev(5); //电机反转
//delay(1000); //换向延时
}
}

/********************************************************/

现在控制步进电机方便的方法用步进电机驱动器。步进电机驱动器控制电机运转的信号有3个;使能、转向、时钟。
运转时使能、置为有效,转向按需要设定。此时给驱动器发一个时钟脉冲,电机就按转向转一个步距角。步进电机驱动器都有细分,电机本身的步距也不同,2相电机步距角有1.8和0.9度两种。如果用1.8度的电机,驱动器选择整步,那么给一个时钟电机就转1.8度。如再选1/2细分,一个时钟电机转0.9度,以此类推。要控制电机的转角就用转角除以前面的步距角,得出转角需要的脉冲数。写程序时按这个脉冲数给驱动器发时钟脉冲,电机就可以转过所要的转角。

步进电机的编程步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。采用的步进电机为24或28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A。。。),双(双相绕组通电)四拍(AB-BC-CD-DA-AB-。。。),八拍(A-AB-B-BC-C-CD-D-DA-A。。。)等。28BYJ48步进电机为四相八拍,其相序表如下
3 2 1 0 对应A口输出值
1 0 0 0 1 01H
2 0 0 1 1 03H
3 0 0 1 0 02H
4 0 1 1 0 06H
5 0 1 0 0 04H
6 1 1 0 0 0CH
7 1 0 0 0 08H
8 1 0 0 1 09H 步进电机为24或28BYJ48型四相八拍电机步进电机相序28BYJ48步进电机为四相八拍,其相序表如下
3 2 1 0 对应A口输出值

1 0 0 0 1 0 1H
2 0 0 1 1 0 3H
3 0 0 1 0 0 2H
4 0 1 1 0 0 6H
5 0 1 0 0 0 4H
6 1 1 0 0 0 CH
7 1 0 0 0 0 8H
8 1 0 0 1 0 9H 编程如下:#include <reg52.h> //52芯片管脚定义头文件
#include <intrins.h> //内部包含延时函数 _nop_();
#define uchar unsigned char
#define uint unsigned int
uchar code FFW[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
uchar code REV[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
sbit K1 = P3^2; //正转
sbit K2 = P3^3; //反转
sbit K3 = P3^4; //停止
sbit BEEP = P3^6; //蜂鸣器/********************************************************/
/*
/* 延时t毫秒
/* 11.0592MHz时钟,延时约1ms
/*
/********************************************************/
void delay(uint t)
{
uint k;
while(t--)
{
for(k=0; k<125; k++)
{ }
}
}/**********************************************************/
void delayB(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i=0; i<13; i++)
{ }
}
}/**********************************************************/
void beep()
{
uchar i;
for (i=0;i<100;i++)
{
delayB(4);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void motor_ffw()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1*n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = FFW[i]; //取数据
delay(2); //调节转速
}
}
}/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void motor_rev()
{
uchar i;
uint j;
for (j=0; j<8; j++) //转1×n圈
{
if(K3==0)
{break;} //退出此循环程序
for (i=0; i<8; i++) //一个周期转45度
{
P1 = REV[i]; //取数据
delay(2); //调节转速
}
}
}/********************************************************
*
* 主程序
*
*********************************************************/main()
{ uchar r,N=64; //N 步进电机运转圈数 因为我们的步进电机是减速步进电机 减速比是1/64 所以这里N=64时 步进电机外部的主轴转1圈
while(1)
{
if(K1==0)
{
beep();
for(r=0;r<N;r++)
{
motor_ffw(); //电机正转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else if(K2==0)
{
beep();
for(r=0;r<N;r++)
{
motor_rev(); //电机反转
if(K3==0)
{beep();break;} //退出此循环程序
}
}
else
P1 = 0xf0;
}
}/********************************************************/

#include "reg52.h"sbit P00=P0^0;sbit P01=P0^1;sbit P02=P0^2;sbit P03=P0^3;sbit P07=P0^7; void main(){ P00=1; P01=1; P03=1; P02=1; P07=1; TMOD=0x01; TH0=(-1500/256); TL0=(-1500%256); TR0=1; for(;;){ TH0=(-1500/256); TL0=(-1500%256); do{}while(!TF0); P07=!P07; TF0=0; }}
这个是我以前弄得一个步进电机的驱动程序,应该很好看懂,不是很深,关键你是要先搞清楚步进电机的原理,这样你只要在对应那对引脚上面给电,他就可以转动啦。

楼上说的还行,建议你用定时器的方法处理,电机。那样效果好。#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code FFW[]=
{
0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09

}; sbit K1 = P3^0;
sbit K2 = P3^1;
sbit K3 = P3^2;
uchar TT0=0;
uchar TT1=0;void timer0() interrupt 1 //定时中断0
{
TH0=TT0;//中断时间50MS
TL0=TT1; P1 = FFW[j];
j++;
if(j==8)
j=0;}
void main()
{

P3=0xff;
TMOD=0x01;
EA=1;
ET0=1; if(!P3_1)
{
TT0=0xD8;
TT1=0xF0;
//10毫秒
} if(!P3_2)
{
TT0=0x5B;
TT1=0xB1;
//20毫秒
} if(!P3_3)
{
TT0=0x4F;
TT1=0x3C;
//50毫秒
}}


如何用单片机控制步进电机?
当控制脉冲Ui为高电平时,光耦OT导通,使得线圈W接收到脉冲信号,产生磁场,推动步进电机转动一个步进角度。当控制脉冲Ui为低电平时,光耦OT截断,线圈W断电,步进电机停止转动。2、图中W上的电流、电压波形图:电流波形图:由于步进电机驱动是通过控制脉冲Ui来实现的,因此W上的电流波形会随着脉冲信号的...

单片机控制步进电机程序
单片机控制步进电机的程序主要通过设置适当的控制信号序列,以驱动步进电机的各相线圈,从而实现电机的旋转和定位。这通常涉及到对单片机I\/O端口的编程,以及对步进电机驱动器或控制器的接口操作。详细 步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。在非超载的情况下,电机的转速、停止的位...

如何用c51编写51单片机控制步进电机转动程序
A=( 50h ),SP=( 50h ),(51H)=( 30h ),(52H)=(50h ),PC=( 5030h )pc总是指向下一条指令的首地址的。但是在返回的时候得看堆栈中的数了。上面程序执行完之后:(A)=50H;sp=50H(因为在程序中,sp减了两次,后来又加了两次,在程序最后ret有在返回的时候减了两次...

如何用单片机控制步进电机运行?
电动机M2停车(画出梯形图)控制要求:按下SB1电动机M1启动,5S后,电动机M2启动;按下SB2电动机M1停车,过5S后,电动机M2停车(画出梯形图)控制要求:按下SB1电动机M1启动,5S后,电动机M2启动;按下SB2电动机M1停车,过5S后,

步进电机的单片机控制
步进电机的单片机控制 通过IO口输出的具有时序的方波作为步进电机的控制信号,信号经过芯片L298N驱动步进电机;同时,用 4X4的键盘来对电机的状态进行控制,并用数码管显示电机的转速,采用74LS164作为4位单个数码管的显示驱动,从单片机输入信号;采通过IO口输出的具有时序的方波作为步进电机的控制信号,信号...

步进电机基本控制方法?
进电机的基本控制方法有几下几种情况:1、采用专用芯片,这样控制简单,成本就低,但一般工作电流不大约2A左右,工作电压不高,36VDC左右;2、采用MCU+功率器件的方式,电流通过模拟电路来控制,MCU提供细分环形分配器,这种方式,控制相对简单,工作电流和电压都可以做大,但控制参数一般比较固定,应用不...

如何用单片机实现对四个步进电机的速度控制呢
推荐你使用表控,型号TPC4-4TD就可以满足你的要求。表控可以同时控制4个步进电机,对于你说的速度控制讲解如下:上图是表控的表格设置界面,省去了麻烦的编程,轻松实现步进电机控制。图中,第2行工作模式设置为“脉冲”模式,光标在脉冲模式的第2行时,脉冲频率项及脉冲个数输入项分别显示脉冲个数的...

51单片机, 编一个控制步进电机转动的程序。
\\x0d\\x0a while(t--)\\x0d\\x0a {\\x0d\\x0a for(k=0; k<125; k++)\\x0d\\x0a { }\\x0d\\x0a }\\x0d\\x0a}\\x0d\\x0a\/***\/\\x0d\\x0a\/*\\x0d\\x0a\/*步进电机正转\\x0d\\x0a\/*\\x0d\\x0a\/***...

如何用一个单片机控制多个步进电机
一个步进电机,比如四相5线那种,四个IO口可控制一个,四个步进电机就要一陆个,驱动芯片用ULN二00三即可。 当然,如果你的IO口不允许使用这么多,那也可以通过串转并的方法,扩展IO口,比如用漆四HC595,三根IO口控制它,它可以级联,三根线可以控制很多片。一片为吧位,两片就为一陆位,三...

用单片机对步进电机进行控制
很多工业控制设备对位移和角度的控制精度要求较高, 一般电机很难实现, 而步进电机可精确实现所设定的角度和转数。本设计主要是运用51 单片机控制六线4 相步进电机系统, 由单片机产生驱动脉冲信号, 控制步进电机以一定的转速向某一方向产生一定的转动角度。同时能够利用单片机实现电机的正、反转及速度控制,并能在数码管...

闸北区13581936197: 通过单片机给步数控制电机的转动? -
徵胃津彤: 选择某一种单片机 比如89c51 用P0或者别的口控制步进电机 连接驱动芯片 比如ULN2003在连接步进电机 在程序中给步进电机的控制字 正转的 反转的 单三拍 或者单四拍等这些在网上可以搜得到

闸北区13581936197: 具体怎么样用单片机控制步进电机的转速? -
徵胃津彤: 也许不是程序的问题,而是电机转动惯量大,当驱动时间小于某一数值,则不能完成一个步进.表现为卡住.能把电机转的更快的出路:1.从程序上:起动时转速是逐步加速,停止时转速是逐步减速,即不要从静止一下子加到2.2ms.2.从机械上,电机与被驱动物之间加弹性联接,得以缓冲.3.从电气驱动上,采用双电压驱动,以加快驱动(激磁)电流的建立.

闸北区13581936197: 用51单片机怎么控制步进电机(需要程序并解释) -
徵胃津彤: /************************************************************************************** * 步进电机实验 * 实现现象:下载程序后,按照光盘内操作视频接线,步进电机旋转 注意事项:无 ************************************************************************************...

闸北区13581936197: 单片机如何控制步进电机转动圈数,例如转一圈或者五圈就停止, -
徵胃津彤: 步进电机按照每步的角度进行控制即可,非步进电机高速运行情况下控制较难,可降低运行频率,降低转速,结合脉冲转速传感器或编码器,计算圈速并采用变频器v/f快速制动.

闸北区13581936197: 单片机怎么用一个按钮控制步进电机启动和停止? -
徵胃津彤: 单片机用一个按钮控制步进电机启动和停止,这很容易的,识别按键按下的程序会写吧,那定义一个位变量,即标志位,如flag,上电后flag=0,为电机停止状态.每按一次按键,flag=!flag,即取反一次,然后再判断标志位,flag=1,则启动电机.flag=0,则停止电机.

闸北区13581936197: 单片机接控制步进电机的程序 很简单的 过来看看吧 -
徵胃津彤: 把来break改为while(1)试下,,当a=100,时,让程序停在那里..如果你用break,当a=100时,程自序退出去了,这时单片机不知道该干什么事了,所以他百有可能又再次进入主函数运度行,就一直转了,

闸北区13581936197: 单片机控制步进电机 -
徵胃津彤: 但用单片机是不够的,关键是要有个专用的驱动芯片,驱动芯片含有每相电流检测,当收到单片机相位开关信号时打开电流通路,由电机电感形成三角波电流,到达电机额定电流即停止而维持等待下个相位信号,并且该芯片还有停转保持半电流控制脚等功能,具体可参考芯片资料,才能根据芯片功能编程,步进电机越转越快可通过单片机对相应相位脚发控制脉冲,使脉冲频率变快就可实现,但最高速度受给驱动芯片的主电源电压有关,电压低时电感中的三角波电流到不了额定就可能发生不同步. 如果带有电机控制器的,控制器只有步进输入脉冲脚,正反转控制脚,就可对控制器的这两脚控制,在步进输入脚脉冲加快就可使转速加快.

闸北区13581936197: 怎么用单片机控制步进电机转动角度 -
徵胃津彤: 步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制.步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB). ...

闸北区13581936197: 步进电机是如何来进行控制,以及和驱动等等,我是用单片机控制 -
徵胃津彤: 这个得看你用在什么地方了. 步进电机是用脉冲电压来驱动的,每个脉冲转动一个步进角度,脉冲的频率决定电机的转速. 如板级整合,可以考虑步进电机驱动芯片,像THB8128这类,只要提供脉冲和方向信号就可以控制电机转动了.如果想简单点,可以考虑用成品的驱动器,然后根据需要提供信号即可.当然,有时间折腾的,还可以单片机做步进电机驱动.这涉及到步进电机的相关基础知识,不是几句话能说清楚的,只能找资料来慢慢研究

闸北区13581936197: 如何使用单片机精确控制步进电机?
徵胃津彤: 首先看你步进电机的最小步进角和你L297的最小步进角,然后看用没有用L297的细分功能,每个单片机发出的电机驱动脉冲就会让步进电机转动最小步进角除以细分数的角度,另外启动停止需要慢慢升降速,不然步进电机会有丢步,这样就不是准确的角度了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网