gao_hex 发表于 2021-5-23 23:34

5.EV_HC32F460_Timer之正交编码器调试

本帖最后由 gao_hex 于 2021-5-23 23:40 编辑

<h2 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:&quot;等线 Light&quot;">简介</span></span></span></h2>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">Timer</span></span></span></h3>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">HC32F460 中与 PWM 相关的外设有</span></span></p>

<p style="text-align:justify">&ndash; 3 个多功能 16bit PWM Timer(Timer6)<br />
&ndash; 3 个 16bit 电机 PWM Timer(Timer4)<br />
&ndash; 6 个 16bit 通用 Timer(TimerA)<br />
&ndash; 2 个 16bit 基础 Timer(Timer0)</p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;其中(Timer6)支持 6 路互补 PWM输出,<span style="color:red">可以用做正交编码器接口、</span>而(Timer4)<span lang="EN-US" style="color:red">3 </span><span style="color:red">个电机 PWM,</span>支持 18 路互补 PWM 输出、</span></span><span style="font-size:10.5pt"><span style="font-family:等线">通用定时器(TimerA)、支持 3 路 3 相<span style="color:red">正交编码输入</span>及 48 路独立可调占空比的 PWM 、</span></span></p>

<p><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;通用定时器(Timer0)是一个可以实现同步计数 、异步计数两种方式的基本定时器。该定时器内含 2 个通道,可以在计数期间产生比较匹配事件。该事件可以触发中断,也可作为事件输出来控制其它模块等。</span></span></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">正交编码器</span></span></span></h3>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在本章中需要配置调试的是正交编码器功能,在这几个定时器外设中有正交编码接口功能的 Timer 为 Timer6 和 TimerA</span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">Timer6 中将 TIM6_&lt;t&gt;_PWMA 输入看作 <span lang="EN-US" style="color:red">AIN </span><span style="color:red">输入</span>、 TIM6_&lt;t&gt;_PWMB 输入看作 <span lang="EN-US" style="color:red">BIN </span><span style="color:red">输入</span>、TIM6_TRIGA-B 中的任意一个输入看作 <span lang="EN-US" style="color:red">ZIN </span><span style="color:red">输入</span>, Timer6 就可以实现三路输入的正交编码计数。</span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">TimerA 中将 TIMA_&lt;t&gt;_CLKA 输入看作 <span lang="EN-US" style="color:red">AIN </span><span style="color:red">输入</span>、 TIMA_&lt;t&gt;_CLKB 输入看作 <span lang="EN-US" style="color:red">BIN </span><span style="color:red">输入</span>、TIMA_&lt;t&gt;_TRIG 输入看作<span style="color:red"> ZIN 输入</span>, TimerA 就可以实现三路输入的正交编码计数。</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 TimerA 中共计 6 个单元,每个单元有八个通道</span></span></p>

<h2 style="text-indent:16.0pt; text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:&quot;等线 Light&quot;">硬件</span></span></span></h2>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本章硬件端口的确定要从自己选定的正交编码端口去查找,我们使用TimerA的正交编码功能,我们要找到的是TIMA_&lt;t&gt;_CLKA、TIMA_&lt;t&gt;_CLKB、TIMA_&lt;t&gt;_TRIG,这三类端口(其中t=1~6)对应编码器的 ABZ在数据手册的引脚功能表中我们能找到相应的引脚,其引脚复用功能4、5、6都是关于TimerA 的,本章官方的示例代码中我们结合文档详细讲解其配置和使用。通过理解官方 Encoder 功能的配置来学习如和使用 HC32F460的Encoder 功能。</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在官方的 Encoder 功能的例程中使用的是端口PE9 PE11(<span style="color:red">除PA11、PA12不支持5V耐压外其余全支持5V耐压</span>),我用的是伺服电机上的5V光电编码器。</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">使用的接口</span></span></p>

<p>&nbsp;</p>

<p style="text-align:justify"></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">如上图所示编码器 AB 的接口在 PE9 PE11</span></span></p>

<h2 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:&quot;等线 Light&quot;">软件</span></span></span></h2>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">先对大概的配置做个简介,这样感觉更好去理解。TimerA 的工作时钟源为 PCLK1,配置正交编码器需要使用到单片机的中断,中断单片机的灵魂,这里先简单讲解一下与本篇章相关的中断,至于整体的中断感觉还要像时钟那样单独写一篇,我脚着有必要,哈哈。华大的中断和STM32的中断有点差别的,目前先简单讲解一下。在配置的时候会遇到两个单词首写,Inc Dec 这两个,对我的英语水平感觉 Up Down 比较好,哈哈。</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">Increase &nbsp;增加</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">Decline&nbsp; 下降</span></span></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">时钟初始化函数</span></span></span></h3>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">系统时钟的初始化这个和前面讲解都类似的,可以参照代码中的注释及前面时钟介绍的文章很好理解的,下面的是系统时钟代码的注释及配置流程。主要时配置了几个工作时钟的频率,这个工作时钟在用户手册的4.4节有详细介绍,可以参照用户手册来了解学习。然后就是倍频器的配置了,主要时配置MPLL 因为MPLLP是系统时钟的选择源之一。配置流程及代码含义的详细请查看下列代码的配置。</span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">下图红框标注的要去用户手册了解一下,用户手册 7.4.1 章。</span></span></p>

<p style="text-indent:21.0pt; text-align:justify"></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">TimerA的配置函数概述</span></span></span></h3>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">配置使能 TimerA 单元1的时钟,配置端口功能的复用,然后就是TimerA 的基础初始化,TimerA 的正交编码功能初始化,最后其对相关的中断功能进行初始化。</span></span><span style="font-size:10.5pt"><span style="font-family:等线">TimerA的基础功能配置为锯齿波模式,不与其他单元一起启动,配置周期基准(寄存器PERAR)。 </span></span><span style="font-size:10.5pt"><span style="font-family:等线">编码器功能的配置,配置为当 ClkB 为高电平时 ClkA 上升沿时硬件递加有效(TMRA_HCUPR),当 ClkB 为低电平时 ClkA 下降沿时硬件递减有效(TMRA_HCDOR),</span></span><span style="font-size:10.5pt"><span style="font-family:等线">使能 ClkA ClkB输入端口滤波功能使能,滤波采样基准时钟选择CA CB (PCLK1的四分频)<span style="color:red">这个地方用户手册上写的PCLK 我理解的是PCLK1,大家可以注意看一下。</span></span></span></p>

<p><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;中断的配置,这个地方需要花点时间理解,目前的话我理解的是中断可以随意配置到中断向量表的任意一个,配置相对稍稍麻烦些,或者不熟悉的原因。</span></span></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">TimerA的配置函数代码详注</span></span></span></h3>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">上述对配置过程大致做了概括,下面的话就看代码了。下面对代码的每一句进行了详细注释,中断的注册函数相对比较麻烦一点,会放在中断的篇章中讲解,大致和时钟概述那篇差不多的形式,单独写一篇。</span></span></p>

<p style="text-indent:21.0pt; text-align:justify"></p>

<p style="text-align:justify"></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">中断回调函数处理</span></span></span></h3>

<p><span style="font-size:10.5pt"><span style="font-family:等线">代码中是使相应的LED电平进行反转。 </span></span></p>

<p><span style="font-size:10.5pt"><span style="font-family:等线">溢出中断函数处理</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">更新中断函数处理</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">编码器的处理,看下图逻辑分析仪对编码器的采样图,这个编码器的话是差分的接口,所有我们直接看通道0、2(或者1、3),假设Channel0连接在端口ClkA 上,Channel2连接到端口ClkB上,我们配置的是<span style="color:red">当 ClkB 为高电平时 ClkA 上升沿时硬件递加有效、当 ClkB 为低电平时 ClkA 上升沿时硬件递减有效。</span><span style="color:black">对照下图中我们看Channel0上升沿时对应Channel2的电平状态,可以看出</span><span style="color:red">硬件递加</span><span style="color:black">对应的电机顺时针旋转时的编码器波形,</span><span style="color:red">硬件递减</span><span style="color:black">对应的时电机逆时针旋转时的编码器波形。这样对应编码器的精度能计算出电机位置了,Z的话是计算电机转的圈数。</span></span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">顺时针旋转</span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">逆时针旋转</span></span></p>

<p style="text-align:justify"></p>

<h3 style="text-align:justify; margin-top:17px; margin-bottom:17px"><span style="font-size:16pt"><span style="173%"><span style="font-family:等线">主函数 main() 处理</span></span></span></h3>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">主函数内容就比较简单,这里不用详细讲了,看注释就可。</span></span></p>

<p><span style="font-size:16pt"><span style="173%"><span style="font-family:&quot;等线 Light&quot;">总结</span></span></span></p>

<p style="text-align:justify"><span style="font-size:10.5pt"><span style="font-family:等线">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大概内容差不多了,说一下感受吧,中断可以随意配置到向量表的任意一个,我这么理解的,但是吧我是觉得终端配置是有些繁琐的,但是写的库函数就不必担心这些东西了,只要调用相应的函数即可,写寄存器的话就稍稍比较麻烦些了。总体感觉还是不错毕竟刚刚上手。接下来会写篇关于中断的吧,毕竟是单片机的灵魂,有必要写一篇,这个就到这里了。如有错误之处还请大佬指出,互相学习,嘿嘿。</span></span></p>

<p style="text-align:justify">&nbsp;</p>

<p style="text-align:justify"><font face="等线">注释好的代码在附件中,互相交流学习。</font></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

Jacktang 发表于 2021-5-24 20:22

<p>楼主有空可以介绍一下华大的中断和STM32单片机,在中断有哪些配置不一样的地方</p>

gao_hex 发表于 2021-5-24 23:43

Jacktang 发表于 2021-5-24 20:22
楼主有空可以介绍一下华大的中断和STM32单片机,在中断有哪些配置不一样的地方

<p>嗯嗯&nbsp; 在写了,下班时间写一点,周末没事的话,周日前可以写好,</p>
页: [1]
查看完整版本: 5.EV_HC32F460_Timer之正交编码器调试