编码器的使用和电池的连接

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
增量式光电编码器主要由光源、码盘、检测光栅、光电检测器件和转换电路组成,如图 1-1 所示。码盘上刻有节距相等的辐射状透光缝隙,相邻两个透光缝隙之间代表一个增量周 期;检测光栅上刻有 A、B 两组与码盘相对应的透光缝隙,用以通过或阻挡光源和光电检 测器件之间的光线。它们的节距和码盘上的节距相等,并且两组透光缝隙错开 1/4 节距, 使得光电检测器件输出的信号在相位上相差 90°电度角。当码盘随着被测转轴转动时,检 测光栅不动,光线透过码盘和检测光栅上的透过缝隙照射到光电检测器件上,光电检测器件 就输出两组相位相差 90°电度角的近似于正弦波的电信号,电信号经过转换电路的信号处 理,可以得到被测轴的转角或速度信息。
定时器 RA 是具有一个 8 位计数器和 8 位预定标器的定时器。 所谓预定标器实际上也就是一个分频器,即对于计数器来说,只有当预定标器溢出的时 候计数器才会记一次数。 使用定时器 RA 作为编码器计数的时候,选用的是事件计数模式,这与一般使用的输入 捕捉模式不太一样,它只可以对单边沿的电平变化进行计数(上升或下降都可以),所以无 法实现程序上的倍频。但由于编码器线数已经比较高,而且也在电路上进行了倍频,所以程
华科瑞萨淘宝店地址:http://smartcar-hust.taobao.com/
程序说明: 前面已经提到过,Timer RA 有一个八位的预定标器和一个八位的计数器。由于已经将预 定标器的初始值设为了 0xff,所以可以将预定标器作为计数器的低八位来用。程序的前面四 句就是用来将预定标器的数值和计数器的数值合并为一个 16 位的二进制数。 由于 Timer RA 是递减计数的,所以用上次的计数值减去这次的计数值就可以算出一个 正的计数的差值(第五句)。将每次计算的差值加起来就可以得出总共的计数值(第六句)。 第七句是用来记录这次的计数值,也就是下次取样的时候的上次的计数值。 第八句是用来计算总距离的。计算公式如下:
华中科技大学智能车队
编码器的使用和电池的连接
——华中科技大学智能车队
华科瑞萨淘宝店地址:http://smartcar-hust.taobao.com/
1. 编码器的使用:
1.1. 增量式编码器原理:
一般来说,增量式光电编码器输出 A、B 两相互差 90°电度角的脉冲信号(即所谓的 两组正交输出信号),从而可方便地判断出旋转方向。同时还有用作参考零位的 Z 相标志(指 示)脉冲信号,码盘每旋转一周,只发出一个标志信号。标志脉冲通常用来指示机械位置或 对积累量清零。
图 增量式光电编码器的输出信号波形
华中科技大学智能车队
1.2. 编码器的使用:
1.2.1. 简介:
码盘转动的时候,编码器输出的 A、B 两相方波信号时我们所需要的。一般只需要一相 方波就可以计算出转速了。
设编码器线数为 N,编码器的编码轮的直径为 R,程序编码器计数采样周期为 T。则可 知编码器转一圈会有 N 个正方波,编码器转一圈时代表的实际距离为编码轮的周长,即 2* π*R,设在时间间隔 T 内检测到的正方波为 n 个,则可以计算出这段时间内的平均速度为 2nRπ/(NT)。只要采样周期 T 足够小,就可以认为这个速度是当前的瞬时速度。
在实际的编码器使用中,常常会对编码器的输出作倍频处理,利用输出的 A、B 两相波 形,做一个异或处理,即可以实现编码器的倍频。
2. 电池的连接:
华科瑞萨淘宝店地址:http://smartcar-hust.taobao.com/
我们使用的是八节三洋电池,我们直接用导线焊接来连接电池。 焊接的时候先把电池两头稍微打磨一下即可,然后再用稍高(350°)的温度焊接,如
计数器总计数值
总距离 =
∗ 编码轮周长
编码器线数
第九句是用来计算速度的。计算公式如下:
计数器在一个采样周期内的差值
速度 =
∗ 编码轮周长
编码器线数
公式中的编码器线数指的是编码器转一圈所产生的脉冲数,这个数值可以通过转动编码 器一圈所返回的计数值的差来确定。不过一般来说在购买编码器时都会有编码器的线数的说 明,可以参看相应的产品说明。不过建议最好是实测一下以确定无误。
华中科技大学智能车队
我们程序中的 gl_ulTotalDistance(总距离)和 gl_iCurSpeed(当前速度)分别以 cm 和 cm/s 为单位的,我们的编码器用的是 200 线的,编码轮的周长约为 40mm,所以程序中的 计算公式会如上所示(可以计算验证一下)。
1.3. 编码器电路:
理解了以上编码器的原理后,就可以知道编码器的电路实际上是非常简单的,只需要把 编码器的输出波形接到单片机相应的 IO 口就行了。
/* Disable the TimerRA Interrupt by TRCIC */ traic = 0x00;
/* Start the RA timer */
tstart_tracr = 1;
}
/* ----- end of function InitTimerRA ----- */
如果 RA 没有使用,这段代码可以在你们的初始化程序中直接调用。如果出现问题,请 自行参看芯片资料编写初始化程序。具体每个寄存器对应的配置请参看芯片资料。
序上不实现倍频也是可以满足需求的了。 定时器 RA 还有一个特点是它是递减计数的,所以预定标器和计数器的溢出都是向下溢
出的。再者当定时器 RA 用作编码器计数的时候,只需要将预定标器和计数器的值都设为 0xff, 就可以将预定标器作为计数的低八位来用,而计数器则作为计数器的高八位,从而实现类似 于 16 位计数器的功能。
/* Set TRAIO output active edge to 'L' */ tedgsel_traioc = 0;
/* Set EVENT Counter mode */ tmod0_tramr = 0; tmod1_tramr = 1; tmod2_tramr = 0;
/* Set RA Counters */ trapre = 0xff; tra = 0xff;
果有焊锡膏的话会更方便。 焊接的时候一定要注意安全,防止电池受热爆炸。加热的时间一定要尽量短,动作要快,
如果整个电池都已经发烫Fra Baidu bibliotek就要停止,灯电池冷了再接着焊接。
华科瑞萨淘宝店地址:http://smartcar-hust.taobao.com/
华中科技大学智能车队
1.2.3. 速度与距离的计算:
速度与距离的计算可以如下编写(这段代码应该加在定时中断程序中,我们的定时中断 周期为 1ms,如果有不同定时中断周期只需要进行少量修改即可):
/*----------------------------Update Encoder Counter------------------------------*/ s_ucEncoderTimer ++; if(s_ucEncoderTimer > SPEED_SAMPLE_TIME) //SPEED_SAMPLE_TIME is 9,which means it will sample
void InitTimerRA (void)
{
/* Stop the RA timer */
tstart_tracr = 0;
while (tcstf_tracr == 1)
{ /* Wait for Timer RA to stop */
}
/* Disable RA interrupt */ traic = 0;
华中科技大学智能车队
{ /* Clear the Speed Sample Time */ s_ucEncoderTimer = 0;
//the speed and the distance every 10 ms.
/* Combine the the TRA and TRAPRE to form a 16-bit binary number */ ucTRABuff = tra; ucTRAPREBuff = trapre; uiTempEncoderCount = ((unsigned int)ucTRABuff) << 8; uiTempEncoderCount |= (unsigned int)ucTRAPREBuff;
/* Initialize RA's registers */ tstop_tracr = 1; tracr = 0;
华中科技大学智能车队
/* Choose the p1_7 as The Event Count Input */ traiosel0 = 1; traiosel1 = 0; traiosel2 = 0;
我们使用的就是 Timer RA 的 Event counter mode,具体功能描述见下:
华中科技大学智能车队
1.2.2. 定时器初始化配置:
Timer RA 的配置程序可以如下编写:
/************************************************************************/
/* Function
InitTimerRA
*/
/* Usage
Initialize Timer RA
*/
/* Argument
NONE
*/
/* Return value NONE
*/
/* Modification History:
*/
/* 01a 2012-4-7 16:18:38
*/
/************************************************************************/
现在的问题就是如何计算出在采样时间周期 T 内的正方波数。 编码器计数一般是使用输入捕捉模式(Input Capture Mode),但是也可以使用事件计数 模式(Event Counter Mode),只是后者无法实现程序上的倍频,而前者则可以。 由于六路 PWM 输出占用了一些具有输入捕捉模式的定时器(RC,RD,RG),剩下的具 有输入捕捉模式的空闲的定时器就只有 RF 了,但是出于某种考虑(现在也找不清楚到底是 什么原因了,可能是走线的问题,因为定时器 RF 的输入引脚只有一个 P8_3,而 RA 则有四 个引脚可以选择),我们没有选择 RF,而是选择了 RA,定时器 RA 是没有输入捕捉模式的, 但是其具有的事件计数模式功能也可以实现编码器的计数功能。 看 R8C 芯片资料:
/* Calculate the Difference of the Encoder Count between this time and last time */ s_uEncoder = s_uEncoderBuff - uiTempEncoderCount; /* Use the Difference of the Encoder Count to Calculate the Total Encoder Count. */ gl_ulEncoderTotalCnt = gl_ulEncoderTotalCnt + (unsigned long)s_uEncoder; /* Recode the last Encoder Count */ s_uEncoderBuff = uiTempEncoderCount;
/* Calculate the Total Distance */ gl_ulTotalDistance = (gl_ulEncoderTotalCnt * (unsigned long)13) / (unsigned long)200; /* Calculate the Speed */ gl_iCurSpeed = ((unsigned long)s_uEncoder * (unsigned long)13) / (unsigned long)2; }
相关文档
最新文档