正交编码脉冲电路

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

本版积分规则

439

主题

2540

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部