我编了一个正交编码脉冲电路的程序。<br />使用定时器2,当电机旋转时,让定时器增计数。<br />(使用EVA的QEP电路)。<br />当捕捉到CAP6的低电平后,<br />定时器2清零。此外,还有通讯的程序。<br />现在的问题是,程序烧好以后,转动电机。<br />T2CNT的值根本不变。<br />以下是我得程序,请高手指教,多谢。<br />#include "register.h"<br />#include "math.h"<br />#include "float.h"<br />unsigned int TMP,TMP1,TMP2,TMP3;<br />volatile unsigned int RECE_DATA; //接收数据<br />unsigned int ERR_DATA; //错误数据<br />unsigned int T3COUNT;<br />void COMMON()<br />{ <br /> asm(" CLRC SXM ";<br /> asm(" CLRC CNF ";<br /> asm(" CLRC OVM ";<br /> asm(" SPM 0 ";<br /> asm(" SETC INTM ";<br /> WSGR=0X00;<br /> *SCSR1=0x81fe;<br /> *WDCR=0xe8;<br /> *IMR=0;<br /> *IFR=0X0FFFF; <br />} <br />//*端口初始化******************************************/<br />void DKCHSHH() <br />{ *MCRA=0x1B; //QEP1,QEP2,SCITXD,SCIRXD<br /> *MCRB=0X0FF00;<br /> *MCRC=0X0200; //CAP6<br /> *PADATDIR=0X0C000;<br /> *PBDATDIR=0X7F10;<br /> *PCDATDIR=0X0F4D0;<br /> *PEDATDIR=0X7100;<br /> *PFDATDIR=0X5C04;<br />}<br />//*EVA、EVB和中断初始化子程序****************************/ <br />void EVINT() <br />{ *GPTCONB=0X0000;<br /> *T3PER=0X0FFFF;<br /> *T3CNT=0;<br /> *T3CON=0X0C40; //连续增减,16分频<br /> *GPTCONA=0;<br /> *T2PER=0X0FFFF;<br /> *T2CNT=0;<br /> *T2CON=0X187A; // ;定向增减计数方式,<br /> //正交编码脉冲电路,允许T2<br /> *T4PER=0X0FFFF;<br /> *T4CNT=0;<br /> *T4CON=0X1442; //连续增计数模式 <br /> *CAPCONA=0X0600; //使能QEP<br /> *CAPCONB=0X1008; //使能捕获单元6,检测下降沿<br /> //选中定时器4 <br /> *EVAIFRA=0X0FFFF;<br /> *EVAIFRB=0X0F;<br /> *EVAIFRC=0X0F;<br /> *EVAIMRA=0;<br /> *EVAIMRB=0;<br /> *EVAIMRC=0;<br /> *EVBIFRA=0X0FFF;<br /> *EVBIFRB=0X000F;<br /> *EVBIFRC=0X000F;<br /> *EVBIMRA=0X0200; //;定时器3下溢中断 <br /> *EVBIMRB=0;<br /> *EVBIMRC=4; //捕捉6中断<br /> *IFR=0X0FFF;<br /> *IMR=0X1A; // ;开INT2、4、5中断<br /> asm(" CLRC INTM "; // ;开总中断<br />} <br />//;**********SCI初始化**************************************** <br />void SCIINIT() <br />{ *SCICCR=0X07; //;没有校验<br /> *SCICTL1=0X13; //;SLEEP=0,使能发送、接收<br /> *SCICTL2=0X00; // ;接收中断使能<br /> *SCIHBAUD=0X02;<br /> *SCILBAUD=0X08; // ;波特率9600<br /> *SCICTL1=0X33; // ;SW RESET<br /> *SCIPRI=0X60; // ;低优先级中断请求<br />} <br />//;*************变量初始化*************************************<br />void BSSINIT()<br />{ TMP=0;<br /> TMP1=0;<br /> TMP3=0;<br /> TMP2=0;<br /> T3COUNT=0;<br /> <br /> <br />}<br />//;********假中断********************************************** <br />void interrupt nothing()<br />{ asm(" clrc INTM ";<br /> return;<br />} <br />main()<br />{ int i;<br /> COMMON();<br /> DKCHSHH();<br /> EVINT();<br /> SCIINIT();<br /> BSSINIT();<br /> while(1)<br /> {for(i=100;i>0;i--)<br /> ;<br /> *T4PER=0XFFFF;<br /> *T4CNT=0;<br /> <br /> } <br />}<br />//中断服务子程序--------------------------------<br />void send()<br />{ *EVBIFRA=*EVBIFRA|0X0200;<br /> TMP1=*T2CNT;<br /> TMP1=TMP1>>1; //控制在256以内<br /> *SCITXBUF=TMP1;<br /> <br /> *T3PER=0X0FFFF;<br /> *IFR=0X0010; <br />}<br />//清除定时器2计数值<br />int load()<br />{TMP=*CAP6FIFO;<br />*T2CNT=0;<br />}<br />//定时器3下溢中断<br />void interrupt C_INT2()<br />{ switch(*PVIR)<br /> {case 0x0031:send();break;<br /> <br /> default:break;<br /> }<br /> <br /> asm(" clrc INTM ";<br /> return;<br />} <br />void interrupt cap6int()<br />{ int flag;<br /> flag=*EVBIFRC&0X04;<br /> if(flag!=0x04)<br /> {asm(" clrc INTM ";<br /> return;<br /> }<br /> load();<br /> *EVBIFRC=*EVBIFRC|0x04;<br /> asm(" clrc INTM ";<br /> return;<br />}<br /><br /> |
|