搜索

[开发工具] 【华大测评】八、正交编码

[复制链接]
128|0
 楼主 | 2020-7-7 16:49 | 显示全部楼层 |阅读模式
      之前在另外一品牌微控制器上实现了EC11旋转编码器的正交解码,这次实验依然使用的EC11旋转编码器模块利用HC32F460PETB的TIMERA模块实现对其解码,同时利用串口将EC11旋转的正、反计数值送至PC端通过串口助手软件进行显示。

一、实验资源
1、HC32F460-EVB;
2、Keil V5.28;
3、ST-LINK调试器;
4、EC11模块;
5、串口调试助手

二、资源简介

      HC32F460PETB的TIMERA是一个通用16位计数宽度、8路PWM输出的计时器。支持向上、向上向下计数模式,支持2相、3相编码计数。本次试验即使用其2相编码计数功能。
2020-07-07_161418.png
2020-07-07_161509.png
2020-07-07_161525.png

      正交编码计数只是TIMERA众多功能中的一个小功能,当然在高级定时器TIMER6中也具有此功能。这里使用了2相正交编码计数功能。
2020-07-07_162157.png


      正交编码计数属于相位差计数,根据AIN和BIN的相位关系进行计数,可以实现1倍、2倍及4倍计数:
2020-07-07_162924.png
2020-07-07_162949.png

      下面是EC11模块资料中的截图,从中不难看出对于它的解码使用2相相位差计数非常匹配,根据一般的使用需求计数模式采用单倍计数即可。
2020-07-07_163656.png

三、代码实现
      实验代码参考了DEMO,通过阅读手册并结合DEMO对于正交编码的理解非常有益。AIN与BIN的配置使用了DEMO中的原代码,在中断回调函数中增加了计数判断:
  1. static void TimeraUnit1Over_IrqCallback(void)
  2. {
  3.     TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow);
  4.        
  5.         coding_value++;
  6.         if(coding_value > 99)
  7.                 coding_value = 0;
  8.         printf("\r\nCW = %d",coding_value);
  9. }


  10. static void TimeraUnit1Under_IrqCallback(void)
  11. {
  12.     TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow);
  13.        
  14.         coding_value--;
  15.         if(coding_value < 0)
  16.                 coding_value = 99;
  17.         printf("\r\nCCW = %d",coding_value);
  18. }
复制代码


四、实验结果
2020-07-07_141154.png

五、实验总结
      TIMERA虽然只是一个通用定时器模块但其功能非常强大,正交编码只是其中的功能之一,下来还要对TIMERA的功能进行深入学习。
2020-07-07_162430.png

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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