c51 步进电机程序求助,100分。

c51 步进电机程序求助,100分。,第1张

编程思路不太对,延时太多太长,MCU基本上都在运行延时程序,进中断时主程序正在运行延时程序,出中断时仍然在延时,而下一次中断马上又来了(按键抬起时也有抖动),造成ID值改变但并没有输出相应的脉冲,时序就错了。

简单的改动是把switch(ID)部分也放到中断里,这样可以保证每个时序都能被输出,电机会动起来,但动的幅度角度可能不是你想要的。

最好重新写程序,改变一下思路,不能有那么多的死延时。

/*89C51控制步进电机c程序

使用89C51控制四相六线步进电机,

步进电机采用四相六线,步距角1.8度,半步工作0.9度八拍运行。

接口如下:

P15---启动信号输入

P14---停止信号输入

P13---接光电传感器

P20---输出控制步进电机的A相

P21---输出控制步进电机的B相

P22---输出控制步进电机的C相

P23---输出控制步进电机的D相

如下是我给步进电机八拍运行正向通电顺序:

P23(D相)、P22(C相)、P21(B相)、P20(A相)

第一步: 0 0 0 1

第二步: 0 0 1 1

第三步: 0 0 1 0

第四步: 0 1 1 0

第五步: 0 1 0 0

第六步: 1 1 0 0

第七步: 1 0 0 0

第八步: 1 0 0 1

使用光电传感器的输出作为脉冲信号,光电接收管的后面加一个三极管做信号放大。

光电传感器前有个齿盘,齿空的间隔距离是相等的,要求齿盘每移动一格,

光电传感器输出一个脉冲,步进电机移动一个角度0.9度。齿盘转动的速度不固定,

可能快也可能慢。步进电机没有转动之前,齿盘一直是转动的,

只有按下启动按钮步进电机才开始转动。

*/

//作成:吴天

//QQ.269829973

//完成时间2010.05.11

//上海.奉贤

#include<reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit START = P1^5

sbit STOP = P1^4

sbit COM = P1^3

//电机接在低4位,接在其他位可修改数组。

uchar code lab[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}

void Mdelay(uchar x)

{uchar j,k

for(j=xj>0j--)

{

for(k=124k>0k--)

{}

}

}

//步进程序,调用一次程序,移动一步,

//参数:方向,1为正转,0为反转。

void motormove(uchar dir)

{

static step=0

P2&=0xf0

if(dir)

{

if(step<=7)

{ P2|=lab[step++]}

else

{step=0P2|=lab[step]}

}

else

{

if(step==0)

{P2|=lab[step]step=7}

if(step>0)

{P2|=lab[step--]}

}

}

void main()

{

bit RUN=0

while(1)

{

if(RUN==0)

{

if(!START) //读启动

{Mdelay(1)

if(!START)

{RUN=1}

}

}

else

{

if(!COM)//读传感器,低电平移动步进电机

{motormove(1)}

if(!STOP) //读停止

{

Mdelay(1)

if(!STOP)

{RUN=0}

}

}

}

}

42步进电机是一个两相电机,一般控制可以分为全步或半步控制,全步控制,每一切换相序,步进电机走1.8度,半步控制则走0.9度。

全步控制相序分配为:A,/A,B,/B

半步控制相序分配为:A,AB,B,B/A,/A,/A/B,/B,/BA

加速的话,就使相序切换快一点就可以;当然减速就是相序切换慢点就行。举例如下:

#include<reg51.h>

#define uchar unsigned char

uchar stepd[]={0x01,0x03,0x02,0x06,0x04,0xc0,0x08,0x09}

uchar num=0,fx=0

sbit keyup=P3^0

sbit keydn=P3^1

sbit keyfx=P3^2

int speed=10000

void t0isr() interrupt 1

{

TH0=(65536-speed)/256

TL0=(65536-speed)%256

P2=stepd[num]

if(fx==0){num++num%=8}

if(fx==1)

{

if(num==0)num=7

else num--

}

}

main()

{

TMOD=0x01

TH0=(65536-10000)/256

TL0=(65536-10000)%256

TR0=1

ET0=1

EA=1

while(1)

{

if(keyup==0)

{

while(key1==0)

speed-=10

}

if(keydn==0)

{

while(keydn==0)

speed+=10

}

if(key3==0)

{

while(key3==0)

fx=~fx

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11107470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存