请教:AT89S52+L297+L298+两相六线步进电机 的程序
使用AT89S52+L297+L298控制步进电机,在步进电机的起点和返回点各有一个光电开关,另外在外面还有一光电开关是用来触发电机起动的。动作是:系统通电,电机没有动作----光电开关给一个“1”------电机正转运行-------运行到返回点----返回点的光电开关给一个“1”--------电机反转-----反转回到起点-----起点的光电开给一个“1”-----电机停止。直到下一个触发信号到来,再有动作。
1,在这里,所有的光电开关是用C集电极输出信号,常态是开关通的,通过E发射极接地,给P口一个“0”。
2,有一个难点,需要编程解决:在返回起点,光电开关会给停止信号,而且电机还在起点位置,这个信号就一直存在,会和启动的光电开关信号有冲突。
3,各个接口在AT89S52上的定义是:启动光电开关(P2.0),起点光电开关(P2.1),返回点光电开关(P2.2),ENABLE-MCU(P.3),RST-MCU(P2.4),CW/CCW-MCU(P2.5),HALF/FULL-MUC(P2.6),CLK-MCU(P2.7)。
4,由于有L297的存在,单片机不需要考虑相顺序的问题,在编程时,内容少些。
以上的编程有那位高手能帮下,C或汇编都行。祝各位新春快乐!!!!!!!!! 正在看有关的参考程序,希望有人指点下。 这个芯片可以在片内实现该功能
http://cache.amobbs.com/bbs_upload782111/files_26/ourdev_532833.gif
(原文件名:3.gif)
http://cache.amobbs.com/bbs_upload782111/files_26/ourdev_532834.gif
(原文件名:6.gif)
点击此处下载 ourdev_532835.pdf(文件大小:355K) (原文件名:TMC223_ShortSpec.pdf) 这个电路需要外部时钟,有谁知道这个芯片的成品板那里有? if(P2.0==1)//启动信号为高
{
让它启动(具体代码不知道)
}
else if(P2.1==1)起始位置的停止信号为高
{
让它停止(具体代码不知道)
}
不知是我想的太简单还是你想的太复杂 谢谢楼上,能否在下面的程序修改:
----------------------------------------------
// 控制线接到MCU的P1口 独立键盘的接口接到MCU的P2口。
// KEY0- 右运动一步; KEY1- 左运动一步;
// KEY2- 右运动200步; KEY3- 左运动200步
// KEY4- 右运动1000步;
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit en=P1^0; // 定义P1.0口
sbit rst=P1^1; // 定义P1.1口
sbit ccw=P1^2; // 定义P1.2口
sbit hf=P1^3; // 定义P1.3口
sbit clk=P1^4; // 定义P1.4口
sbit k1=P1^5; // 定义P1.5口
sbit k2=P1^6; // 定义P1.6口
void ShortDelay(void)
{ uchar x,y;
for(x=0;x<5;x++)
for(y=0;y<125;y++)
_nop_();
return;
}
void outclk(uint a)
{uint i,j;
while(a--)
{ en=1; // 定义P1.0口
rst=1; // 定义P1.1口
//if((k1&k2)!=0) // K1,K2限位置判断
// {
clk=1;
for(i=150;i>0;i--) //200
for(j=150;j>0;j--); //200
clk=0;
// }
// else {rst=1;en=0;}
}
}
ucharkey(void)
{uchar key_num;
if( ( P2 & 0x3f) != 0x3f ) //判断按键
{
ShortDelay(); //消除抖动
if( ( P2 & 0x3f ) != 0x3f )
{
switch ( P2 & 0x3f ) //将按键码转换成键值
{
case0x3e: returnkey_num=01;
case0x3d: returnkey_num=02;
case0x3b: returnkey_num=03;
case0x37: returnkey_num=04;
case0x2f: returnkey_num=05;
case0x1f: returnkey_num=06;
default : returnkey_num=00;
}
}
}
return key_num;
}
void main(void)
{ uchar b;
while(1)
{
b= key();
switch(b)
{ //4步走1CM设定走5Cm 半应该是200的为了调整误差所以少4步 (10CM为多8步)
case 00:rst=1;break;//0
case 01:ccw=1; outclk(1);break;//1 右运动1步
case 02:ccw=0; outclk(1);break;//2 左运动1步
case 03:ccw=1; outclk(200);break;//3 右运动1CM
case 04:ccw=0; outclk(200);break;//4 左运动1CM
case 05:ccw=1; outclk(1000);break;//5 右运动5CM
//case 06:ccw=0; outclk(1000);break;//6左运动5CM
default:break;
}
}
} 顶 回复【3楼】cfydev
这个电路需要外部时钟,有谁知道这个芯片的成品板那里有?
-----------------------------------------------------------------------
回复【4楼】yahooxiaozi
if(P2.0==1)//启动信号为高
{
让它启动(具体代码不知道)
}
else if(P2.1==1)起始位置的停止信号为高
{
让它停止(具体代码不知道)
}
不知是我想的太简单还是你想的太复杂
-----------------------------------------------------------------------
按这个来做,怎样解决-----在返回起点,光电开关会给停止信号(P2.1==1),而且电机还在起点位置,这个信号就一直存在,会和启动的光电开关信号(P2.0==1)有冲突.
页:
[1]