用单片机控制两台步进电机能做到吗?
这是我自己做过的。源码都给你了
#include
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
uint count; //当前计数值
uint distance;
bit intt=1;
unsigned char cont=0;
unsigned char co=0;
uchar buf;
//uchar m,lm,cm;
/**************针脚定义************/
sbit rect_wave=P2^0; //晶振控制信号
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit CLR=P1^3;
sbit DATA=P1^4;
sbit CLK=P1^5;
sbit d=P2^1;
sbit cp=P2^2;
sbit dir=P2^3;
/***********************************/
/**************函数声明************/
void time0over(void); //定时器计时程序
void clrlcd(void); //clr LCD
void c_send(unsigned char y); //发命令
void reset(void); // reset LCD
void d_send(unsigned char x); //发数据
void pos(unsigned char pos); //设定显示位置
void l_delay(unsigned int t); //长延时
void trans(j);
void ret(void); //初始化系统
void retcont(void); //定时器复位
void math(void); //计算测量距离
/***************************/
void init(void)
{ TH1=0xf3;
TL1=0xf3;
PCON=0x80;
TR1=1;
SCON=0x50; /*串口初始化设置,波特率4800BPS*/
}
//*******************************//
void send(uchar dat) /*发送子程序*/
{ //uchar i;
/*发送一个数据*/
SBUF=dat;
while(TI==0);
TI=0;
}
/***********************************/
void turn (void) //电机转动控制
{
unsigned char x;
cont++;
cp=~cp;
l_delay(50);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
if (cont == 200) //判断是否进行反转复位
{dir=~dir;
cont=0;
for(x=0;x < 200;x++)
{cp=~cp;
l_delay(5);
cp=~cp;
co++;
if(co == 3)
{d=~d;
}
if(co == 4)
{d=~d;
co=0;
}
}
dir=~dir;
cont=0;
}
}
/**************子程序**********************/
void int0 () interrupt 0 //中断0服务程序
{
EX0=0; //关闭中断
TR0=0; //关闭定时器
TF0=0; //标志位清零
rect_wave=0; //停止发送超声波
intt=0;
}
void work(void)
{
if(!intt)
{
intt=1;
if (distance < 400)
{
buf=distance;
send(buf);
turn();
math();} //计算所测得的距离
l_delay(5); //延时
retcont(); //定时器复位
rect_wave=1;
count=0;
}
}
void math(void) //计算所测得的距离
{ uchar m,lm,cm;
cm=distance%10; //取距离的最低位
distance=distance/10; //取距离的次高位
lm=distance%10;
distance=distance/10; //取距离的最高位
m=distance%10;
clrlcd(); //输出计算结果
pos(0);
d_send('d');
d_send('i');
d_send('s');
d_send('=');
//pos(4);
d_send(m+0x30);
d_send(lm+0x30);
d_send(cm+0x30);
d_send('c');
d_send('m');
l_delay(500);
}
void time0over(void) //定时器计时程序
{ TF0=0;
count++;
distance=count;
}
/*
void trans(j)
{
switch(j)
{
case 0: d_send('0');break;
case 1: d_send('1');break;
case 2: d_send('2');break;
case 3: d_send('3');break;
case 4: d_send('4');break;
case 5: d_send('5');break;
case 6: d_send('6');break;
case 7: d_send('7');break;
case 8: d_send('8');break;
case 9: d_send('9');break;
}
}
*/
delay() //延时
{
int i;
for(i=0;i<1000;i++);
}
void l_delay(unsigned int t) //延时
{
unsigned int p;
unsigned int j;
for(j=0;j<t;j++)
{
for(p=0;p<1000;p++);
}
}
void reset(void) // reset LCD
{
delay();
c_send(0x38);
c_send(0x01);
c_send(0x06);
c_send(0x0c);
c_send(0x80);
}
void clrlcd(void) // clr LCD
{
delay();
c_send(0x01);
}
void pos(unsigned char pos) //设定显示位置
{
c_send(pos | 0x80);
}
void c_send(unsigned char y) //发命令
{
unsigned char i;
EN=1;
RS=0;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(y,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}
void d_send(unsigned char x) //发数据
{
unsigned char i;
EN=1;
RS=1;
RW=0;
for(i=0;i<8;i++)
{
if(_crol_(x,i)&0x80)
DATA=1;
else
DATA=0;
CLK=0;
CLK=1;
}
EN=0;
delay();
}
void ret(void) //初始化计数器
{ TMOD=0x22; //设置定时器计数器1为工作方式2
TH0=0xc6; //设置计数初值高字节
TL0=0xc6; //设置计数初值低字节
count=0;
IE=0x00; //禁止中断
TF0=0; //溢出标志位清零
TR0=1; //打开定时器1
rect_wave=1;
EA=1; //打开中断
IP=0x01; //外部中断0为高中断优先级
IT0=0; //外部中断低电平触发シ?
EX0=1;
}
void retcont(void)
{ TF0=0; //溢出标志位清零
TR0=1; //打开定时器1
EA=1; //打开中断
IP=0x01; //外部中断0为高中断优先级
IT0=0; //外部中断下降沿触发
EX0=1;
rect_wave=1;
}
/**************主程序************/
void main(void)
{ rect_wave=0;
reset();
l_delay(10);
ret();
init();
math();
for(;;)
{
if(TF0)
{
time0over();
}
work();
}
}
这个简单,让我来教楼主怎么玩
首先我说下思路:
我们采用P1口来采集ADC0832的8位数据,用P0.0口控制步进电机动作,利用T0的时间中断来采集P1口的ADC0832数据并做出比较后设置步进电机启动标志位start=1;并设置他的运行频率,当然,楼主没说怎么比较,我这就只是写了个简单的例子,一通百通,希望对你有帮助
下面是程序:
#include //选用晶振11.0592MHz
unsigned int m=0,n=0; //设置循环的周期
unsigned char start=0,t0temp=0;
sbit Y0=P0^0; //控制步进电机的管脚
delay()
{
unsigned char i,j;
for(i=m;i>0;i--)
for(j=n;i>0;j--);
}
main()
{
//自检测T0时间设置
ET0=1;
TMOD|=0x01;
TH0=0XFC; //1ms中断扫描
TL0=0X66;
IT0=1; //下降沿触发
TR0=0; //关闭扫描
/***********************初始化完毕***********************/
//****************I/O口程序
while(1)
{
while(start)
{
delay();
Y0=~Y0;
}
}
}
void counter1(void) interrupt 1 //T0计时器中断
{
if(t0temp%4)t0temp++; //4ms时间才采集一次P0口的数据
else
{
t0temp++;
//这里就写你怎么做对比的程序,我举个例子
if(P1>150)
{start=1;n=1000;m=0;} //入错采用12M晶振,那这时候控制步进电机的输出周期就是1ms一次,也就是1000HZ
else {start=0;n=0;m=0;}
}
}
//PS:我在输出频率中用了两个全局变量m,n可以延迟很长时间,楼主可以根据需要选用,一般16位的,选用一个就可以了,另一个放弃
OK,至于电路图,我软件没有ADC0832的封装,不然就发给你了,但想来楼主完全就没必要担心,ADC0832的8位数据接到P1口,P0.0控制步进电机启动的三极管,电路图就那么简单!
通常来讲,单片机是可以做到的,除非你的单片机资源特少,步进电机的控制可以使用匹配的驱动器,也可以用功率管直接驱动,这就看使用的要求了。如果使用驱动器,则控制两个步进电机只要单片机输出两路脉冲即可,脉冲的频率正比于电机的转速。如果使用功率管直接驱动电机,那么就要用软件控制功率管的导通时序实现电机的预定运动。
一台控制器可以同时控制两台步进电机吗,连接两台驱动器分别控制,能实现...
总体来说可以,但是具体选型要看你的PLC机种或单片机类型要求了。如1、有些专门控制电机的PLC或单片机只有一套脉冲(Dir+pulse 或双脉冲或正交脉冲)端口;而有些是有2套以上端口。就是说是专门的供电机使用的控制端口。专门端口的优势就是输出脉冲的速度比较快,编程也可能简单。如DSP-12SC11T机种是...
单片机控制两个步进电机,控制传动系统实现X,Y轴向直线运动,如何实现...
可以根据输入步进电机的方波频率调速,算下转动的角度和圈数再乘以轮子的周长,就知道前进了多少距离。每个方向都知道走了多少距离就可以知道X、Y地址了。编程问题太多细节,自己去弄懂吧,这个不难。自己努力了才会真正明白。
用C编写单片机控制两个步进电机正反转程序,驱动用ULN2803,四个按键分...
uchar REV_shang[8]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10}; \/\/\/四相八拍反转编码 uchar bujinjiao=0; \/\/控制步进电机的步进角 void IO_bujin(void){ P1DIR|=0XFF;P1OUT|=~(BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7); \/\/初始化电机接口 } \/ DAO时钟函数...
如何用单片机控制步进电机?
当控制脉冲Ui为低电平时,光耦OT截断,线圈W断电,步进电机停止转动。2、图中W上的电流、电压波形图:电流波形图:由于步进电机驱动是通过控制脉冲Ui来实现的,因此W上的电流波形会随着脉冲信号的变化而变化。当控制脉冲Ui为高电平时,W上的电流为正向脉冲;当控制脉冲Ui为低电平时,W上无电流流过。电...
怎样用51单片机接两相步进电机驱动器来控制步进电机?
脉冲信号就是像流水灯差不多,用两个口。例如:用到P1^0和P1^1;把P10制低电平,P11制高电平,延时一段时间后,P10制高电平 P11制低电平,如此循环,看程序:include "reg52.h"sbit P10=P1^0;sbit P11=P1^1;void delay(unsigned int x)P10=0;P11=1;delay(1000);P10=1;P11=0;delay(...
89C52单片机控制两相步进电机的程序
ORG 0030H MOV R1,#00H MAIN:JB P3.2,RRR P3.2为1 右转 MOV DPTR,#TAB 否则左转 TAB为左转时序 SJMP TT RRR:MOV DPTR,#TAB1 TT:MOV A,R1 MOVC A,@A+DPTR MOV P2,A LCALL DELAY INC R1 下一拍 CJNE R1,#04H,TT MOV R1,#00H SJMP MAIN DELAY:MOV R2,#25 拍与拍之间的...
如何控制k60使两个步进电机的步数相同
在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为0.72度。这种步进电机的应用最为广泛。二、永磁式步进电机的控制 下面以电子爱好者业余制作中常用的永磁式步进电机为例,来介绍如何用单片机控制步进电机。图...
我有单片机最小系统,两个步进电机,步进电机驱动怎么制作智能小车,特别...
参照说明连接起来就行了啊,不过步进电机如果是减速步进电机的话,做小车的动力源估计会很火大,要么用变速箱提速要么就干脆换成直流电机驱动
怎么用一个单片机控制多个步进电机
要实现真正意义上的同时,用FPGA\/CPLD是可以完成的。 话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电机,那就好办多了。 一个步进电机,比如四相5线那种,四个IO口可控制一个,四个步进电机就要一陆个,驱动芯片用ULN二00三即可。 当然,如果你的IO口不...
怎样用单片机给两相步进电机驱动器发脉冲,该怎么与步进电机接,有没有...
1、共阳极接法:分别将CP+,U\/D+,EN+连接到控制系统的电源上,如果此电源是+5V 则可直接接入,如果此电源大于+5V,则须外部另加限流电阻R,保证给驱动器内部光藕提供8—15mA 的驱动电流。脉冲输入信号通过CP-接入;此时,U\/D-,EN-在低电平有效。2、共阴极接法:分别9将CP-,U\/D-,EN-连接...
播莺活血: 可以做到啊,你所说的一样速度,指的是角速度还是线速度?所说的两台电机,是已经在水平方向和30°方向了还是需要一个运动到30°方向?角速度比较好办,一个脉冲同时驱动两个电机转动就是了,如果是线速度,在机械上做下调整最省事,不过也可以调整两个电机的转动速度,这个主要在程序上调整就好了.
承德县13326059548: 我想用51单片机单独控制两台步进电机,实现一台电机停,一台电机转和两台电机同时转,可以么?课设用?
播莺活血: 如果有驱动器的话,步进电机的控制一台只需要两个信号即CW(正转)和CCW(反转)信号就OK了,或者PAUSE(脉冲)+DIR(方向),因此控制两台步进电机只需要4路信号即可,所以任意实验板都可以达到,当然买最便宜的了.
承德县13326059548: 如何用单片机控制两个步进电机的交替运动?如何用单片机控制两个步进 ?
播莺活血: 你说的单片机加上相应的驱动放大电路就是一个控制器了.不知道你对单相电机速度有没有要求,用单片机控制它,是不是只做开关控制?你要说清楚.两个步进电机可以用PWM波来控制,驱动放大电路可用一个移位器和普通的步进电机来实现.然后做间歇运动的话,可以用单片机里的定时器和中断来实现,这个不难.
承德县13326059548: 如何实现一个单片机同时控制多个步进电机工作? - ?
播莺活血: 用单片机同时是不可能的,当然,时间间隔小到可以接受,跑几个任务,那也可以视为同时.要实现真正意义上的同时,用fpga/cpld是可以完成的.话说回来,也许你的同时并不是说一定严格地同时工作,只是说一个单片机去控制四个步进电...
承德县13326059548: 用一片51单片机控制两个小功率两相四线步进电机,怎样实现两个电机各自加速减速不干拢另个电机正常运转? - ?
播莺活血: 51单片机速度慢点,不用微步技术的话,速度也够用的,得配合中断,别说只两步进电机,就是四个到八个步进电机,也一样可以各不相干的正常运转,这个同步和实时不是绝对的,只要肉眼分辩不出来数据又不丢失就可以让为是同步和实时....
承德县13326059548: 请问不用驱动器,而用单片机控制两相步进电机可以吗? - ?
播莺活血: 这是不可能的,单片机的IO口无法承受0.2A电流.用IO口控制三极管驱动就行了
承德县13326059548: 需要用一个51单片机控制两个有变速功能的步进电机,怎么弄? - ?
播莺活血: 单片机实现步进电机的变速控制可以用PWM来控制,通过改变输出脉冲宽度,改变速度.欢迎进一步咨询,谢谢采纳!!
承德县13326059548: 单片机如何控制两个步进电机同步 - ?
播莺活血: 根据我的实战经验,不要用同一路输出,这样在实际运用过程中万一一台失步你将如何是好?为了确保良好同步,其一两台步进电机型号相同、驱动器型号相同、细分数相同,其二独立的原点信号,其三每做完一个循环时间允许的情况下各自找一次“原点”,其三正常运行过程中两路方向信号和脉冲性号在同一语句里发出.如果你严格做到上述三点,同步就不是问题!
承德县13326059548: 控制3个步进电机用单片机可以吗 - ?
播莺活血: 当然没问题.控制10个也行啊.需要配合电机驱动芯片,ULN2003最常用,L298用的也比较多.如果端口不够可以自己设计环形分配的数字电路,网上也有现成的模板
承德县13326059548: 两个步进电机控制器能否用一个单片机接口 或两个步进驱动器能否共用一个单片机方向接口 - ?
播莺活血: 可以,如果两个步进电机方向转换始终同步的话,可以共用一个信号控制