编码器的使用和电池的连接——华中科技大学智能车队华科瑞萨淘宝店地址:编码器的使用:1.1.增量式编码器原理:一般来说,增量式光电编码器输出A、B两相互差90°电度角的脉冲信号(即所谓的两组正交输出信号),从而可方便地判断出旋转方向。同时还有用作参考零位的Z相标志(指示)脉冲信号,码盘每旋转一周,只发出一个标志信号。标志脉冲通常用来指示机械位置或对积累量清零。增量式光电编码器主要由光源、码盘、检测光栅、光电检测器件和转换电路组成,如图1-1所示。码盘上刻有节距相等的辐射状透光缝隙,相邻两个透光缝隙之间代表一个增量周期;检测光栅上刻有A、B两组与码盘相对应的透光缝隙,用以通过或阻挡光源和光电检测器件之间的光线。它们的节距和码盘上的节距相等,并且两组透光缝隙错开1/4节距,使得光电检测器件输出的信号在相位上相差90°电度角。当码盘随着被测转轴转动时,检测光栅不动,光线透过码盘和检测光栅上的透过缝隙照射到光电检测器件上,光电检测器件就输出两组相位相差90°电度角的近似于正弦波的电信号,电信号经过转换电路的信号处理,可以得到被测轴的转角或速度信息。图增量式光电编码器的输出信号波形1.2.编码器的使用:1.2.1.简介:码盘转动的时候,编码器输出的A、B两相方波信号时我们所需要的。一般只需要一相方波就可以计算出转速了。设编码器线数为N,编码器的编码轮的直径为R,程序编码器计数采样周期为T。则可知编码器转一圈会有N个正方波,编码器转一圈时代表的实际距离为编码轮的周长,即2*π*R,设在时间间隔T内检测到的正方波为n个,则可以计算出这段时间内的平均速度为2nRπ/(NT)。只要采样周期T足够小,就可以认为这个速度是当前的瞬时速度。现在的问题就是如何计算出在采样时间周期T内的正方波数。编码器计数一般是使用输入捕捉模式(InputCaptureMode),但是也可以使用事件计数模式(EventCounterMode),只是后者无法实现程序上的倍频,而前者则可以。由于六路PWM输出占用了一些具有输入捕捉模式的定时器(RC,RD,RG),剩下的具有输入捕捉模式的空闲的定时器就只有RF了,但是出于某种考虑(现在也找不清楚到底是什么原因了,可能是走线的问题,因为定时器RF的输入引脚只有一个P8_3,而RA则有四个引脚可以选择),我们没有选择RF,而是选择了RA,定时器RA是没有输入捕捉模式的,但是其具有的事件计数模式功能也可以实现编码器的计数功能。看R8C芯片资料:定时器RA是具有一个8位计数器和8位预定标器的定时器。所谓预定标器实际上也就是一个分频器,即对于计数器来说,只有当预定标器溢出的时候计数器才会记一次数。使用定时器RA作为编码器计数的时候,选用的是事件计数模式,这与一般使用的输入捕捉模式不太一样,它只可以对单边沿的电平变化进行计数(上升或下降都可以),所以无法实现程序上的倍频。但由于编码器线数已经比较高,而且也在电路上进行了倍频,所以程序上不实现倍频也是可以满足需求的了。定时器RA还有一个特点是它是递减计数的,所以预定标器和计数器的溢出都是向下溢出的。再者当定时器RA用作编码器计数的时候,只需要将预定标器和计数器的值都设为0xff,就可以将预定标器作为计数的低八位来用,而计数器则作为计数器的高八位,从而实现类似于16位计数器的功能。我们使用的就是TimerRA的Eventcountermode,具体功能描述见下:1.2.2.定时器初始化配置:TimerRA的配置程序可以如下编写:/************************************************************************//*FunctionInitTimerRA*//*UsageInitializeTimerRA*//*ArgumentNONE*//*ReturnvalueNONE*//*ModificationHistory:*//*01a2012-4-716:18:38*//************************************************************************/voidInitTimerRA(void){/*StoptheRAtimer*/tstart_tracr=0;while(tcstf_tracr==1){/*WaitforTimerRAtostop*/}/*DisableRAinterrupt*/traic=0;/*InitializeRA'sregisters*/tstop_tracr=1;tracr=0;/*Choosethep1_7asTheEventCountInput*/traiosel0=1;traiosel1=0;traiosel2=0;/*SetTRAIOoutputactiveedgeto'L'*/tedgsel_traioc=0;/*SetEVENTCountermode*/tmod0_tramr=0;tmod1_tramr=1;tmod2_tramr=0;/*SetRACounters*/trapre=0xff;tra=0xff;/*DisabletheTimerRAInterruptbyTRCIC*/traic=0x00;/*StarttheRAtimer*/tstart_tracr=1;}/*-----endoffunctionInitTimerRA-----*/如果RA没有使用,这段代码可以在你们的初始化程序中直接调用。如果出现问题,请自行参看芯片资料编写初始化程序。具体每个寄存器对应的配置请参看芯片资料。1.2.3.速度与距离的计算:速度与距离的计算可以如下编写(这段代码应该加在定时中断程序中,我们的定时中断周期为1ms,如果有不同定时中断周期只需要进行少量修改即可):/*----------------------------UpdateEncoderCounter------------------------------*/s_ucEncoderTimer++;if(s_ucEncoderTimerSPEED_SAMPLE_TIME)//SPEED_SAMPLE_TIMEis9,whichmeansitwillsample//thespeedandthedistanceevery10ms.{/*CleartheSpeedSampleTime*/s_ucEncoderTimer=0;/*CombinethetheTRAandTRAPREtoforma16-bitbinarynumber*/ucTRABuff=tra;ucTRAPREBuff=trapre;uiTempEncoderCount=((unsignedint)ucTRABuff)8;uiTempEncoderCount|=(unsignedint)ucTRAPREBuff;/*CalculatetheDifferenceoftheEncoderCountbetweenthistimeandlasttime*/s_uEncoder=s_uEncoderBuff-uiTempEncoderCount;/*UsetheDifferenceoftheEncoderCounttoCalculatetheTotalEncoderCount.*/gl_ulEncoderTotalCnt=gl_ulEncoderTotalCnt+(unsignedlong)s_uEncoder;/*RecodethelastEncoderCount*/s_uEncoderBuff=uiTempEncoderCount;/*CalculatetheTotalDistance*/gl_ulTotalDistance=(gl_ulEncoderTotalCnt*(unsignedlong)13)/(unsignedlong)200;/*CalculatetheSpeed*/gl_iCurSpeed=((unsignedlong)s_uEncoder*(unsignedlong)13)/(unsignedlong)2;}华科瑞萨淘宝店地址:程序说明:前面已经提到过,TimerRA有一个八位的预定标器和一个八位的计数器。由于已经将预定标器的初始值设为了0xff,所以可以将预定标器作为计数器的低八位来用。程序的前面四句就是用来将预定标器的数值和计数器的数值合并为一个16位的二进制数。由于TimerRA是递减计数的,所以用上次的计数值减去这次的计数值就可以算出一个正的计数的差值(第五句)。将每次计算的差值加起来就可以得出总共的计数值(第六句)。第七句是用来记录这次的计数值,也就是下次取样的时候的上次的计数值。第八句是用来计算总距离的。计算公式如下:总距离=计数器总计数值编码器线数∗编码轮周长第九句是用来计算速度的。计算公式如下:速度=计数器在一个采样周期内的差值编码器线数∗编码轮周长公式中的编码器线数指的是编码器转一圈所产生的脉冲数,这个数值可以通过转动编码器一圈所返回的计数值的差来确定。不过一般来说在购买编码器时都会有编码器的线数的说明,可以参看相应的产品说明。不过建议最好是实测一下以确定无误。我们程序中的gl_ulTotalDistance(总距离)和gl_iCurSpeed(当前速度)分别以cm和cm/s为单位的,我们的编码器用的是200线的,编码轮的周长约为40mm,所以程序中的计算公式会如上所示(可以计算验证一下)。1.3.编码器电路:理解了以上编码器的原理后,就可以知道编码器的电路实际上是非常简单的,只需要把编码器的输出波形接到单片机相应的IO口就行了。在实际的编码器使用中,常常会对编码器的输出作倍频处理,利用输出的A、B两相波形,做一个异或处理,即可以实现编码器的倍频。2.电池的连接:华科瑞萨淘宝店地址:我们使用的是八节三洋电池,我们直接用导线焊接来连接电池。焊接的时候先把电池两头稍微打磨一下即可,然后再用稍高(350°)的温度焊接,如果有焊锡膏的话会更方便。焊接的时候一定要注意安全,防止电池受热爆炸。加热的时间一定要尽量短,动作要快,如果整个电池都已经发烫了就要停止,灯电池冷了再接着焊接。华科瑞萨淘宝店地址: