12下一页
返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[AT32F403/403A] 使用定时器实现编码器脉冲计数功能

[复制链接]
 楼主| dffzh 发表于 2025-3-20 16:08 | 显示全部楼层 |阅读模式
<
本帖最后由 dffzh 于 2025-4-15 13:53 编辑

#申请原创# @21小跑堂
雅特力MCU AT32F403ACCT7的部分定时器自带编码器模式,可以实现编码器的脉冲计数功能,比如使用定时器2 TMR2实现对编码器的脉冲计数功能。
编码器模式的内部结构如下:
1417367dbcb827f935.png
编码器模式分类及BSP初始化配置如下:
1253367dbcb99c78bd.png
编码器模式的计数方向如下:
5370867dbcbac842c0.png
配置过程:
1、 配置通道模式寄存器CM1的C1DF[7:4],设置通道1输入信号的滤波值;
配置通道模式寄存器CM1的C2DF[15:12],设置通道2输入信号的滤波值;
22067dbcbc5d3ac2.png
2、 配置通道控制寄存器CCTRL的C1P和C1CP,设置通道1输入信号的有效电平;
配置通道控制寄存器CCTRL的C2P和C2CP,设置通道2输入信号的有效电平;
2326267dbcbdcf15d7.png
6174367dbcbe4be237.png
6450567dbcbecea43b.png
3、 配置通道模式寄存器CM1的C1C[1:0],设置通道1为输入模式;
配置通道模式寄存器CM1的C2C[9:8],设置通道2为输入模式;
3087467dbcc035039b.png
7078567dbcc08dda3a.png
7722767dbcc0ea6add.png
4、 配置次定时器控制寄存器STCTRL的SMSEL[2:0],选择编码器模式;
选择哪种编码器模式是配置的重点:
经过竞品分析和确认,项目上需选择4倍频模式,即选择编码模式C;
3153167dbcc47dd86e.png
4765667dbcc4dbe620.png
5、配置寄存器PR的PR[15:0],设置计数器计数周期;开启增强模式,PR值扩展至32位;
配置寄存器DIV的DIV[15:0],设置计数器计数周期;
7212267dbcc61a5aea.png
4303367dbcc6923ca2.png
6、 配置定时器2的增强模式,将PR值扩展至32位;
9248267dbcc7a6f1a0.png
7、 配置TMR2_CH1和TMR2_CH2对应的IO为复用模式;
但是看官方库里配置的是普通输入模式;
4417067dbcc8eb8b89.png
8、 配置CTRL1寄存器的TMREN,使能计数器;
6954167dbcca113802.png
脉冲计数:
在main程序里循环调用以下接口即可读取到脉冲值:
8396667dbccc1ebca7.png
返回值类型是一个 32位无符号整型数据,那如何与项目产品需求规格对应上呢?
比如需求规格为计数器范围[-2147483648, 2147483647],而脉冲读取接口返回值范围为[0, 4294967295],则可以直接按如下代码操作即可:
int32_tencoder_pulse_data = tmr_counter_value_get(TRM2);
encoder_pulse_data即为脉冲计数值,即:
[0,2147483647] 对应 [0,2147483647];
[2147483648,4294967295] 对应 [-2147483648,-1];
合在一起,其实就是一个环形计数器。


当然还有其他实现编码器脉冲读取的方法,如下所示:
1、IO查询法;速度太慢,会丢脉冲;
2、外部中断法;丢包概率较低,但频繁的中断触发会比较占用CPU资源;

以下简要介绍使用外部中断法实现编码器脉冲计数,供参考:
脉冲向上计数和向下计数的逻辑如下表所示:
中断触发源
A相电平
B相电平
计数方向
手轮转动
方向
备注
A相上升沿
1
0
向上
正转
A相触发中断:AB相不同电平则向上,同电平向下;
B相触发中断:正好相反
1


1
向下
反转
A相下降沿
0
0
向下
反转
0
1
向上
正转
B相上升沿
0
1
向下
反转
1
1
向上
正转
B相下降沿
0
0
向上
正转
1
0
向下
反转


中断实现的代码如下,其中encoder_pulse_data即为脉冲计数值:
2319467e3aac5d5cd8.png
2592967e3aad163ade.png
综上所述,优先使用定时器的编码器模式实现脉冲读取功能,如果MCU资源有限,则可以考虑使用外部中断法。

作者补充:(重要部分)
最近产品在客户现场由于环境干扰较强导致脉冲异常计数问题,所以从软件上增加了滤波处理机制,而定时器的编码器模式这个功能也正好有滤波机制,滤波配置API接口如下:

5149567fdf1ddabdd5.png
调用方式如下:
8288367fdf21837522.png
其中滤波值的配置对应通道模式寄存器CM1或CM2的CxDF:
1150467fdf367cbb1d.png
可以根据采样频率和滤波个数的实际需求选择合适的滤波值;
其中采样频率可以根据控制寄存器1的CLKDIV进行配置:
9690567fdf3e71e809.png
增加软件滤波机制后,现场未出现脉冲异常计数问题!



3649867dbcc2add921.png
5443767dbccab6742e.png

打赏榜单

21小跑堂 打赏了 50.00 元 2025-03-28
理由:恭喜通过原创审核!期待您更多的原创作品~~

评论

使用AT32F403ACCT7定时器的正交编码功能,实现增量式编码器的脉冲计数功能。  发表于 2025-3-28 14:45
 楼主| dffzh 发表于 2025-3-20 16:21 | 显示全部楼层
@21小跑堂,申请原创,敬请审核。

评论

[url=home.php?mod=space&uid=760190]@21小跑堂[/url] :已修改,请审核  发表于 2025-3-26 16:57
感谢的大佬的分享~~本次文章内容不满800字未达原创审核门槛,可填充内容后再次@21小跑堂进行审核,活动详情链接: https://bbs.21ic.com/icview-3431776-1-1.html  发表于 2025-3-25 15:37
电竞孔乙己 发表于 2025-3-20 20:37 | 显示全部楼层
这个实际运行的结果有没有,实现效果咋样。
我喜欢打游戏 发表于 2025-3-20 20:45 | 显示全部楼层
可以支持多高的采样率
qinlu123 发表于 2025-3-21 08:13 | 显示全部楼层
当年芯片荒的时候,推荐雅特力替代stm32,单片机确实不赖结果比stm32还难买,我现在还有几片雅特力的样片呢
绝影孤狼 发表于 2025-3-21 08:35 | 显示全部楼层
使能计数器后,脉冲计数的实时性如何保证呢
xionghaoyun 发表于 2025-3-21 08:50 | 显示全部楼层
给萌新的教程
 楼主| dffzh 发表于 2025-3-21 09:12 | 显示全部楼层
我喜欢打游戏 发表于 2025-3-20 20:45
可以支持多高的采样率

我们的项目规格是支持最高输入频率为50KHz,脉冲输入方式是正交相位脉冲(x4).
 楼主| dffzh 发表于 2025-3-21 09:15 | 显示全部楼层
电竞孔乙己 发表于 2025-3-20 20:37
这个实际运行的结果有没有,实现效果咋样。

我们应用在工业EtherCAT模块上,目前能满足项目规格最高输入频率50KHz.
 楼主| dffzh 发表于 2025-3-21 09:18 | 显示全部楼层
绝影孤狼 发表于 2025-3-21 08:35
使能计数器后,脉冲计数的实时性如何保证呢

我们应用在工业EtherCAT总线模块上,对实时性要求较高(最低支持1ms周期),目前将其放在main里轮询调用,满足应用需求;或者可以再尝试使用两个外部中断检测脉冲的方式试试实时性效果.

评论

[url=home.php?mod=space&uid=3531932]@绝影孤狼[/url] :那你们的任务实时性更好了!  发表于 2025-3-26 11:24
我们也用的EtherCAT通讯,也是1ms通讯,不过使用的是带有操作系统的  发表于 2025-3-25 21:16
 楼主| dffzh 发表于 2025-3-21 09:21 | 显示全部楼层

定时器的编码器模式驱动配置代码基本如下,可以参考一下: 3643967dcbf1246d69.png
 楼主| dffzh 发表于 2025-3-21 09:23 | 显示全部楼层
qinlu123 发表于 2025-3-21 08:13
当年芯片荒的时候,推荐雅特力替代stm32,单片机确实不赖结果比stm32还难买,我现在还有几片雅特力的样片呢 ...

较STM32相比,雅特力的SPI外设使用起来稍微有些区别,需要注意.
jwdxu2009 发表于 2025-3-21 10:02 | 显示全部楼层
学习和参考,很适用,写的,交流,学习,参考应用,好机会
穷得响叮当侠 发表于 2025-3-22 12:22 | 显示全部楼层
比如机器人、自动化设备等,这种定时器实现编码器脉冲计数的功能应该很有价值
 楼主| dffzh 发表于 2025-3-23 11:52 | 显示全部楼层
穷得响叮当侠 发表于 2025-3-22 12:22
比如机器人、自动化设备等,这种定时器实现编码器脉冲计数的功能应该很有价值
...

是的,在工业自动化设备或者PLC设备上,可以得到应用。
作业天敌在此 发表于 2025-3-23 16:16 | 显示全部楼层
这个配置过程看起来挺复杂的,不过很详细
蚊子的噩梦 发表于 2025-3-23 17:10 | 显示全部楼层
将PR值扩展至32位,可以满足更大范围的计数需求
 楼主| dffzh 发表于 2025-3-23 20:50 | 显示全部楼层
作业天敌在此 发表于 2025-3-23 16:16
这个配置过程看起来挺复杂的,不过很详细

是的,产品项目实测通过。

评论

[url=home.php?mod=space&uid=3531966]@作业天敌在此[/url] :相互学习  发表于 2025-4-5 20:13
受教了  发表于 2025-3-28 21:10
 楼主| dffzh 发表于 2025-3-23 20:53 | 显示全部楼层
蚊子的噩梦 发表于 2025-3-23 17:10
将PR值扩展至32位,可以满足更大范围的计数需求

是的,我们使用环形计数器,计数范围是从﹣2147483648~2147483647
515192147 发表于 2025-4-3 17:40 | 显示全部楼层
本帖最后由 515192147 于 2025-4-3 17:42 编辑

用定时器中断是可以的
下面的视频 就是用 定时器完成的



wgjjd1b1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

1165

帖子

22

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