我编了一个正交编码脉冲电路的程序。 使用定时器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; }
|