之前在另外一品牌微控制器上实现了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相编码计数功能。
正交编码计数只是TIMERA众多功能中的一个小功能,当然在高级定时器TIMER6中也具有此功能。这里使用了2相正交编码计数功能。
正交编码计数属于相位差计数,根据AIN和BIN的相位关系进行计数,可以实现1倍、2倍及4倍计数:
下面是EC11模块资料中的截图,从中不难看出对于它的解码使用2相相位差计数非常匹配,根据一般的使用需求计数模式采用单倍计数即可。
三、代码实现
实验代码参考了DEMO,通过阅读手册并结合DEMO对于正交编码的理解非常有益。AIN与BIN的配置使用了DEMO中的原代码,在中断回调函数中增加了计数判断:
static void TimeraUnit1Over_IrqCallback(void)
{
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagOverflow);
coding_value++;
if(coding_value > 99)
coding_value = 0;
printf("\r\nCW = %d",coding_value);
}
static void TimeraUnit1Under_IrqCallback(void)
{
TIMERA_ClearFlag(TIMERA_UNIT1, TimeraFlagUnderflow);
coding_value--;
if(coding_value < 0)
coding_value = 99;
printf("\r\nCCW = %d",coding_value);
}
四、实验结果
五、实验总结
TIMERA虽然只是一个通用定时器模块但其功能非常强大,正交编码只是其中的功能之一,下来还要对TIMERA的功能进行深入学习。
|