5.EV_HC32F460_Timer之正交编码器调试
[复制链接]
本帖最后由 gao_hex 于 2021-5-23 23:40 编辑
简介
Timer
HC32F460 中与 PWM 相关的外设有
– 3 个多功能 16bit PWM Timer(Timer6)
– 3 个 16bit 电机 PWM Timer(Timer4)
– 6 个 16bit 通用 Timer(TimerA)
– 2 个 16bit 基础 Timer(Timer0)
其中(Timer6)支持 6 路互补 PWM输出,可以用做正交编码器接口、而(Timer4)3 个电机 PWM,支持 18 路互补 PWM 输出、通用定时器(TimerA)、支持 3 路 3 相正交编码输入及 48 路独立可调占空比的 PWM 、
通用定时器(Timer0)是一个可以实现同步计数 、异步计数两种方式的基本定时器。该定时器内含 2 个通道,可以在计数期间产生比较匹配事件。该事件可以触发中断,也可作为事件输出来控制其它模块等。
正交编码器
在本章中需要配置调试的是正交编码器功能,在这几个定时器外设中有正交编码接口功能的 Timer 为 Timer6 和 TimerA
Timer6 中将 TIM6_<t>_PWMA 输入看作 AIN 输入、 TIM6_<t>_PWMB 输入看作 BIN 输入、TIM6_TRIGA-B 中的任意一个输入看作 ZIN 输入, Timer6 就可以实现三路输入的正交编码计数。
TimerA 中将 TIMA_<t>_CLKA 输入看作 AIN 输入、 TIMA_<t>_CLKB 输入看作 BIN 输入、TIMA_<t>_TRIG 输入看作 ZIN 输入, TimerA 就可以实现三路输入的正交编码计数。
在 TimerA 中共计 6 个单元,每个单元有八个通道
硬件
本章硬件端口的确定要从自己选定的正交编码端口去查找,我们使用TimerA的正交编码功能,我们要找到的是TIMA_<t>_CLKA、TIMA_<t>_CLKB、TIMA_<t>_TRIG,这三类端口(其中t=1~6)对应编码器的 ABZ在数据手册的引脚功能表中我们能找到相应的引脚,其引脚复用功能4、5、6都是关于TimerA 的,本章官方的示例代码中我们结合文档详细讲解其配置和使用。通过理解官方 Encoder 功能的配置来学习如和使用 HC32F460的Encoder 功能。
在官方的 Encoder 功能的例程中使用的是端口PE9 PE11(除PA11、PA12不支持5V耐压外其余全支持5V耐压),我用的是伺服电机上的5V光电编码器。
使用的接口
如上图所示编码器 AB 的接口在 PE9 PE11
软件
先对大概的配置做个简介,这样感觉更好去理解。TimerA 的工作时钟源为 PCLK1,配置正交编码器需要使用到单片机的中断,中断单片机的灵魂,这里先简单讲解一下与本篇章相关的中断,至于整体的中断感觉还要像时钟那样单独写一篇,我脚着有必要,哈哈。华大的中断和STM32的中断有点差别的,目前先简单讲解一下。在配置的时候会遇到两个单词首写,Inc Dec 这两个,对我的英语水平感觉 Up Down 比较好,哈哈。
Increase 增加
Decline 下降
时钟初始化函数
系统时钟的初始化这个和前面讲解都类似的,可以参照代码中的注释及前面时钟介绍的文章很好理解的,下面的是系统时钟代码的注释及配置流程。主要时配置了几个工作时钟的频率,这个工作时钟在用户手册的4.4节有详细介绍,可以参照用户手册来了解学习。然后就是倍频器的配置了,主要时配置MPLL 因为MPLLP是系统时钟的选择源之一。配置流程及代码含义的详细请查看下列代码的配置。
下图红框标注的要去用户手册了解一下,用户手册 7.4.1 章。
TimerA的配置函数概述
配置使能 TimerA 单元1的时钟,配置端口功能的复用,然后就是TimerA 的基础初始化,TimerA 的正交编码功能初始化,最后其对相关的中断功能进行初始化。TimerA的基础功能配置为锯齿波模式,不与其他单元一起启动,配置周期基准(寄存器PERAR)。 编码器功能的配置,配置为当 ClkB 为高电平时 ClkA 上升沿时硬件递加有效(TMRA_HCUPR[6]),当 ClkB 为低电平时 ClkA 下降沿时硬件递减有效(TMRA_HCDOR[5]),使能 ClkA ClkB输入端口滤波功能使能,滤波采样基准时钟选择CA CB (PCLK1的四分频)这个地方用户手册上写的PCLK 我理解的是PCLK1,大家可以注意看一下。
中断的配置,这个地方需要花点时间理解,目前的话我理解的是中断可以随意配置到中断向量表的任意一个,配置相对稍稍麻烦些,或者不熟悉的原因。
TimerA的配置函数代码详注
上述对配置过程大致做了概括,下面的话就看代码了。下面对代码的每一句进行了详细注释,中断的注册函数相对比较麻烦一点,会放在中断的篇章中讲解,大致和时钟概述那篇差不多的形式,单独写一篇。
中断回调函数处理
代码中是使相应的LED电平进行反转。
溢出中断函数处理
更新中断函数处理
编码器的处理,看下图逻辑分析仪对编码器的采样图,这个编码器的话是差分的接口,所有我们直接看通道0、2(或者1、3),假设Channel0连接在端口ClkA 上,Channel2连接到端口ClkB上,我们配置的是当 ClkB 为高电平时 ClkA 上升沿时硬件递加有效、当 ClkB 为低电平时 ClkA 上升沿时硬件递减有效。对照下图中我们看Channel0上升沿时对应Channel2的电平状态,可以看出硬件递加对应的电机顺时针旋转时的编码器波形,硬件递减对应的时电机逆时针旋转时的编码器波形。这样对应编码器的精度能计算出电机位置了,Z的话是计算电机转的圈数。
顺时针旋转
逆时针旋转
主函数 main() 处理
主函数内容就比较简单,这里不用详细讲了,看注释就可。
总结
大概内容差不多了,说一下感受吧,中断可以随意配置到向量表的任意一个,我这么理解的,但是吧我是觉得终端配置是有些繁琐的,但是写的库函数就不必担心这些东西了,只要调用相应的函数即可,写寄存器的话就稍稍比较麻烦些了。总体感觉还是不错毕竟刚刚上手。接下来会写篇关于中断的吧,毕竟是单片机的灵魂,有必要写一篇,这个就到这里了。如有错误之处还请大佬指出,互相学习,嘿嘿。
注释好的代码在附件中,互相交流学习。
|