cfydev 发表于 2010-2-6 15:56:46

请教: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或汇编都行。祝各位新春快乐!!!!!!!!!

cfydev 发表于 2010-2-6 21:36:14

正在看有关的参考程序,希望有人指点下。

TRINAMIC 发表于 2010-2-6 22:10:57

这个芯片可以在片内实现该功能
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)

cfydev 发表于 2010-2-7 19:39:01

这个电路需要外部时钟,有谁知道这个芯片的成品板那里有?

yahooxiaozi 发表于 2010-2-7 20:04:38

if(P2.0==1)//启动信号为高
{
   让它启动(具体代码不知道)
}
else if(P2.1==1)起始位置的停止信号为高
{
   让它停止(具体代码不知道)
}


不知是我想的太简单还是你想的太复杂

cfydev 发表于 2010-2-7 22:35:23

谢谢楼上,能否在下面的程序修改:
----------------------------------------------





// 控制线接到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;
          }
}
}

hongyancl 发表于 2010-2-8 10:25:26

cfydev 发表于 2010-2-25 11:03:53

回复【3楼】cfydev
这个电路需要外部时钟,有谁知道这个芯片的成品板那里有?
-----------------------------------------------------------------------

回复【4楼】yahooxiaozi
if(P2.0==1)//启动信号为高
{
   让它启动(具体代码不知道)
}
else if(P2.1==1)起始位置的停止信号为高
{
   让它停止(具体代码不知道)
}
不知是我想的太简单还是你想的太复杂
-----------------------------------------------------------------------
按这个来做,怎样解决-----在返回起点,光电开关会给停止信号(P2.1==1),而且电机还在起点位置,这个信号就一直存在,会和启动的光电开关信号(P2.0==1)有冲突.
页: [1]
查看完整版本: 请教:AT89S52+L297+L298+两相六线步进电机 的程序