你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

体验编码器功能利用非对称PWM模式

[复制链接]
攻城狮Melo 发布时间:2023-4-29 21:55
微信图片_20230429215520.png
/ n. Z0 k! t+ e5 y
通常在STM32芯片的通用TIMER或高级TIMER都带编码器功能,支持基于1路或2路输入的编码脉冲计数。我们一般外接正交编码器,使用2路输入。TIMER硬件基于2路输入的相差特征来确定计数方向并依据方向对计数器做递增或递减操作。
, E  [; w* _0 b/ n
微信图片_20230429215516.png

. }' K# c" W. P; o% V# d& G) e5 P9 F
正交编码器一般使用5根线连接,分别为A、B、 Z信号线及VCC和GND电源线。其中,A、B两路是存在相差的同频信号。Z信号即零点信号,当编码器旋转到某位置时,它会发出一个脉冲表示约定的零位。VCC、GND分别是电源线和地线。至于编码器线数,是指旋转一圈A(B)端会输出的脉冲个数 ,二者转一圈所发出的脉冲数相同,但存在90°相差。编码器的线数越高代表其能够反应的位置精度越高。

3 V* _7 p! \3 M" v4 Y% ?+ j: `: [
微信图片_20230429215511.png

. {4 Y3 e& L0 r/ y& I; k$ x
关于STM32片内TIMER编码器接口的工作原理,这里就不介绍了。更多细节请参考STM32的相应系列的参考手册。这里想重点分享的是,如果手头没有正交编码器实物,如何来验证或体验TIMER的编码器接口功能呢?
其实,TIMER编码器处理单元就是对外来的两路同频但输出具有前后时序差的脉冲信号进行方向辨认后做TIMER计数器的递增或递减计数。既然手头没有编码器实物,我们何不利用STM32片内的TIEMR产生2路带相差的同频信号,再接到另一个支持编码器接口的TIMER不就OK了吗?
当然,使用STM32的TIMER产生2路带相差的同频信号,有多种方法。比方通过2个定时器主从级联、单个定时器使用OC toggle模式加以DMA辅助、利用非对称PWM输出模式来实现。
其中,前2种方法在STM32芯片里通用性好,每个STM32系列都支持。而非对称PWM输出模式虽然可以非常方便地实现带相差的同频输出信号,但不是所有STM32系列支持。当然,不支持的主要是ST推出得比较早的STM32系列,比方STM32F1\STM32F2\STM32F4这些老旧的系列,后来推出的STM32系列,比方STM32L4,STM32G4,STM32C0、STM32U5、STM32F7、STM32H7、STM32H5等都支持非对称PWM输出模式。
我这里采用非对称PWM输出模式并使用STM32L4开发板来演示实现过程。先用TIM1结合非对称PWM输出模式输出2路带相差的同频信号,然后连接到TIM2的编码器接口。另外,我还用了个按键【接到PC13】动态调整TIM1两路输出相差的前后关系,以观察TIM2计数器的计数变化情况,即递增还是递减计数。
  v2 ]) H8 I( s
微信图片_20230429215503.png
* M/ U" P+ u1 J4 _
我先配置TIM1的CH1/CH2,实现2路带相差的PWM输出。【关于TIMER非对称PWM输出模式这里不介绍了,此处直接上配置。下面链接有相关文章介绍,或者自行研读STM32参考手册相关内容。】

4 o; i$ I$ l+ x) V8 w
微信图片_20230429215459.png
0 P: R+ @  r$ v& y$ O' P# K6 `
基于CubeMx配置后生成初始化工程,添加2行上图中的代码就可以输出了。
我这里使用ARM MDK IDE自带的逻辑分析仪就可以看到下面波形。2路波形分别从GPIOA_PIN8/GPIOA_PIN9输出。

& }/ B: Z; i* i2 Z' O9 H9 J# M
微信图片_20230429215456.png
% g' a1 K+ S) O7 u2 }  J6 g- n. L
然后我将这两路输出分别连接到TIM2的编码器接口脚【GPIOA_PIN0、GPIOA_PIN1】。
我把有关TIM2编码器应用的CubeMx配置也截图出来供参考。【其中ARR可按需调整,为了便于查看效果,后来我将其改为1000了。这点不影响功能演示。】:

5 q8 r* V! P5 d( k2 E. r; V! o
微信图片_20230429215439.png

9 T7 V# f, c) i3 B" |/ J9 C
然后,添加启动TIMER编码器功能的API函数。【API函数里启动了2个通道的输入捕获中断,我这里只保留通道1的而关闭了通道2的。即每次在TIM2通道1的捕获中断里读取其计数器的值。】
5 V4 m4 D& u- N# `" k
微信图片_20230429215431.png

1 P5 ~% s$ }0 H/ q8 M7 ]. U
编译、除错后运行,即可在IDE的逻辑分析仪上看到下面的结果。其中CNT_value就是TIM2的计数器动态值。目前看到的是TIM2的编码器接口针对当前2路输入信号进行周期计数。绿色和紫色是上面提到过的两路输入信号【因显示分辨率的关系下面相关图形变成单色方块了】。

: v% x; U4 Q2 Z! t$ @( {
6 J3 ]: v& O4 K
微信图片_20230429215424.png

& m) L  y( p, z
当然,我们可以通过按键来调整TIM1两路输出信号的相差时序,进而改变TIM2编码器计数的方向。不难看出下图中3个圆圈的地方就是切换计数方向的位置。
+ o/ W& |8 t9 I
微信图片_20230429215418.png

4 X9 c) z0 p! d; E+ p. H; l, D9 Q" R. |( _6 m
我们还可以调整TIM1的参数改变输出给TIM2的信号频率。整个过程就是利用TIMER的非对称PWM输出模式构造2路带相差的编码器信号,从而让TIMER的编码器接口电路实现对外部编码输入信号的计数。实现这些基本功能之后,可以进一步研究应用中可能涉及的各种测量功能。
聊到这里,可能有人对上面逻辑分析仪的配置感兴趣。之前我在本公众号专门介绍过,这里简单就今天查看的几个变量的配置过程介绍下。
这里的CNT_value连续记录TIM2计数器的值,这里为Analog量。
Level_PA8记录GPIOA_PIN8的电平情况,1或0两个值之一,为Bit量。
Level_PA9跟Level_PA8是完全相同的数据类型,不过显示的是GPIOA_PIN9的电平。显然,逻辑分析仪配置里关于Level_PA9的显示算式的屏蔽数应该是0x00000200,右移位为9。我目前是在SYSTICK的毫秒中断里读取GPIOA->IDR的值即管脚电平到变量Level_PA8和Level_PA9的。
当然,使用ST公司免费的STM32CubeIDE也可以实现上面逻辑分析仪的功能,之前我也在本公众号里介绍过相关内容,有兴趣可以自行体验。左下角阅读原文处可以链接到STM32CubeIDE的下载站点。

6 M( r+ n$ H) N$ C; P0 e1 e转载自:Miler
  a+ W; P, e1 s* A& S如有侵权请联系删除
4 B& }+ k- G% y8 ~* J/ _& b) i. o. m$ y

- G. f1 ?7 k4 N
收藏 评论0 发布时间:2023-4-29 21:55

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版