打印

正交编码脉冲电路

[复制链接]
4485|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chen3bing|  楼主 | 2007-2-12 15:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我编了一个正交编码脉冲电路的程序。
使用定时器2,当电机旋转时,让定时器增计数。
(使用EVA的QEP电路)。
当捕捉到CAP6的低电平后,
定时器2清零。此外,还有通讯的程序。
现在的问题是,程序烧好以后,转动电机。
T2CNT的值根本不变。
以下是我得程序,请高手指教,多谢。
#include "register.h"
#include "math.h"
#include "float.h"
unsigned int TMP,TMP1,TMP2,TMP3;
volatile unsigned int RECE_DATA;           //接收数据
unsigned int ERR_DATA;           //错误数据
unsigned int T3COUNT;
void COMMON()
{    
      asm(" CLRC    SXM ";
      asm(" CLRC    CNF ";
      asm(" CLRC    OVM ";
      asm(" SPM     0 ";
      asm(" SETC    INTM ";
      WSGR=0X00;
      *SCSR1=0x81fe;
      *WDCR=0xe8;
      *IMR=0;
      *IFR=0X0FFFF;    
}    
//*端口初始化******************************************/
void DKCHSHH()  
{     *MCRA=0x1B;              //QEP1,QEP2,SCITXD,SCIRXD
      *MCRB=0X0FF00;
      *MCRC=0X0200;            //CAP6
      *PADATDIR=0X0C000;
      *PBDATDIR=0X7F10;
      *PCDATDIR=0X0F4D0;
      *PEDATDIR=0X7100;
      *PFDATDIR=0X5C04;
}
//*EVA、EVB和中断初始化子程序****************************/  
void  EVINT()   
{         *GPTCONB=0X0000;
          *T3PER=0X0FFFF;
          *T3CNT=0;
          *T3CON=0X0C40;       //连续增减,16分频
          *GPTCONA=0;
          *T2PER=0X0FFFF;
          *T2CNT=0;
          *T2CON=0X187A;       //   ;定向增减计数方式,
                               //正交编码脉冲电路,允许T2
          *T4PER=0X0FFFF;
          *T4CNT=0;
          *T4CON=0X1442;         //连续增计数模式     
          *CAPCONA=0X0600;      //使能QEP
          *CAPCONB=0X1008;       //使能捕获单元6,检测下降沿
                                 //选中定时器4          
          *EVAIFRA=0X0FFFF;
          *EVAIFRB=0X0F;
          *EVAIFRC=0X0F;
          *EVAIMRA=0;
          *EVAIMRB=0;
          *EVAIMRC=0;
          *EVBIFRA=0X0FFF;
          *EVBIFRB=0X000F;
          *EVBIFRC=0X000F;
          *EVBIMRA=0X0200;           //;定时器3下溢中断   
          *EVBIMRB=0;
          *EVBIMRC=4;                //捕捉6中断
          *IFR=0X0FFF;
          *IMR=0X1A;         // ;开INT2、4、5中断
          asm(" CLRC   INTM ";    //   ;开总中断
}   
//;**********SCI初始化**************************************** 
void SCIINIT()   
{       *SCICCR=0X07;                 //;没有校验
        *SCICTL1=0X13;             //;SLEEP=0,使能发送、接收
        *SCICTL2=0X00;          // ;接收中断使能
        *SCIHBAUD=0X02;
        *SCILBAUD=0X08;    //   ;波特率9600
        *SCICTL1=0X33;     //    ;SW RESET
        *SCIPRI=0X60;        // ;低优先级中断请求
}                         
//;*************变量初始化*************************************
void BSSINIT()
{   TMP=0;
    TMP1=0;
    TMP3=0;
    TMP2=0;
    T3COUNT=0;
   
   
}
//;********假中断**********************************************   
void  interrupt nothing()
{   asm(" clrc INTM ";
    return;

main()
{    int i;
     COMMON();
     DKCHSHH();
     EVINT();
     SCIINIT();
     BSSINIT();
    while(1)
    {for(i=100;i>0;i--)
      ;
     *T4PER=0XFFFF;
     *T4CNT=0;
     
    } 
}
//中断服务子程序--------------------------------
void send()
{   *EVBIFRA=*EVBIFRA|0X0200;
    TMP1=*T2CNT;
    TMP1=TMP1>>1;         //控制在256以内
    *SCITXBUF=TMP1;
        
    *T3PER=0X0FFFF;
    *IFR=0X0010;     
}
//清除定时器2计数值
int load()
{TMP=*CAP6FIFO;
*T2CNT=0;
}
//定时器3下溢中断
void interrupt C_INT2()
{ switch(*PVIR)
  {case 0x0031:send();break;
         
   default:break;
  }
  
  asm(" clrc INTM ";
  return;
}   
void interrupt cap6int()
{  int  flag;
   flag=*EVBIFRC&0X04;
   if(flag!=0x04)
   {asm(" clrc INTM ";
    return;
   }
   load();
   *EVBIFRC=*EVBIFRC|0x04;
   asm(" clrc INTM ";
   return;
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

2540

帖子

2

粉丝