发新帖本帖赏金 50.00元(功能说明)我要提问
返回列表
打印
[AT32F403/403A]

使用定时器实现编码器脉冲计数功能

[复制链接]
1297|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-3-20 16:08 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-3-26 15:22 编辑

#申请原创# @21小跑堂
雅特力MCU AT32F403ACCT7的部分定时器自带编码器模式,可以实现编码器的脉冲计数功能,比如使用定时器2 TMR2实现对编码器的脉冲计数功能。
编码器模式的内部结构如下:

编码器模式分类及BSP初始化配置如下:

编码器模式的计数方向如下:

配置过程:
1、 配置通道模式寄存器CM1的C1DF[7:4],设置通道1输入信号的滤波值;
配置通道模式寄存器CM1的C2DF[15:12],设置通道2输入信号的滤波值;

2、 配置通道控制寄存器CCTRL的C1P和C1CP,设置通道1输入信号的有效电平;
配置通道控制寄存器CCTRL的C2P和C2CP,设置通道2输入信号的有效电平;



3、 配置通道模式寄存器CM1的C1C[1:0],设置通道1为输入模式;
配置通道模式寄存器CM1的C2C[9:8],设置通道2为输入模式;



4、 配置次定时器控制寄存器STCTRL的SMSEL[2:0],选择编码器模式;
选择哪种编码器模式是配置的重点:
经过竞品分析和确认,项目上需选择4倍频模式,即选择编码模式C;
5、配置寄存器PR的PR[15:0],设置计数器计数周期;开启增强模式,PR值扩展至32位;
配置寄存器DIV的DIV[15:0],设置计数器计数周期;


6、 配置定时器2的增强模式,将PR值扩展至32位;

7、 配置TMR2_CH1和TMR2_CH2对应的IO为复用模式;
但是看官方库里配置的是普通输入模式;

8、 配置CTRL1寄存器的TMREN,使能计数器;
脉冲计数:
在main程序里循环调用以下接口即可读取到脉冲值:
返回值类型是一个 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即为脉冲计数值:


综上所述,优先使用定时器的编码器模式实现脉冲读取功能,如果MCU资源有限,则可以考虑使用外部中断法。

3649867dbcc2add921.png (114.27 KB )

3649867dbcc2add921.png

5443767dbccab6742e.png (152.41 KB )

5443767dbccab6742e.png

使用特权

评论回复

打赏榜单

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

评论
21小跑堂 2025-3-28 14:45 回复TA
使用AT32F403ACCT7定时器的正交编码功能,实现增量式编码器的脉冲计数功能。 
沙发
dffzh|  楼主 | 2025-3-20 16:21 | 只看该作者
@21小跑堂,申请原创,敬请审核。

使用特权

评论回复
评论
dffzh 2025-3-26 16:57 回复TA
@21小跑堂 :已修改,请审核 
21小跑堂 2025-3-25 15:37 回复TA
感谢的大佬的分享~~本次文章内容不满800字未达原创审核门槛,可填充内容后再次@21小跑堂进行审核,活动详情链接: https://bbs.21ic.com/icview-3431776-1-1.html 
板凳
电竞孔乙己| | 2025-3-20 20:37 | 只看该作者
这个实际运行的结果有没有,实现效果咋样。

使用特权

评论回复
地板
我喜欢打游戏| | 2025-3-20 20:45 | 只看该作者
可以支持多高的采样率

使用特权

评论回复
5
qinlu123| | 2025-3-21 08:13 | 只看该作者
当年芯片荒的时候,推荐雅特力替代stm32,单片机确实不赖结果比stm32还难买,我现在还有几片雅特力的样片呢

使用特权

评论回复
6
绝影孤狼| | 2025-3-21 08:35 | 只看该作者
使能计数器后,脉冲计数的实时性如何保证呢

使用特权

评论回复
7
xionghaoyun| | 2025-3-21 08:50 | 只看该作者
给萌新的教程

使用特权

评论回复
8
dffzh|  楼主 | 2025-3-21 09:12 | 只看该作者
我喜欢打游戏 发表于 2025-3-20 20:45
可以支持多高的采样率

我们的项目规格是支持最高输入频率为50KHz,脉冲输入方式是正交相位脉冲(x4).

使用特权

评论回复
9
dffzh|  楼主 | 2025-3-21 09:15 | 只看该作者
电竞孔乙己 发表于 2025-3-20 20:37
这个实际运行的结果有没有,实现效果咋样。

我们应用在工业EtherCAT模块上,目前能满足项目规格最高输入频率50KHz.

使用特权

评论回复
10
dffzh|  楼主 | 2025-3-21 09:18 | 只看该作者
绝影孤狼 发表于 2025-3-21 08:35
使能计数器后,脉冲计数的实时性如何保证呢

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

使用特权

评论回复
评论
dffzh 2025-3-26 11:24 回复TA
@绝影孤狼 :那你们的任务实时性更好了! 
绝影孤狼 2025-3-25 21:16 回复TA
我们也用的EtherCAT通讯,也是1ms通讯,不过使用的是带有操作系统的 
11
dffzh|  楼主 | 2025-3-21 09:21 | 只看该作者

定时器的编码器模式驱动配置代码基本如下,可以参考一下:

使用特权

评论回复
12
dffzh|  楼主 | 2025-3-21 09:23 | 只看该作者
qinlu123 发表于 2025-3-21 08:13
当年芯片荒的时候,推荐雅特力替代stm32,单片机确实不赖结果比stm32还难买,我现在还有几片雅特力的样片呢 ...

较STM32相比,雅特力的SPI外设使用起来稍微有些区别,需要注意.

使用特权

评论回复
13
jwdxu2009| | 2025-3-21 10:02 | 只看该作者
学习和参考,很适用,写的,交流,学习,参考应用,好机会

使用特权

评论回复
14
丙丁先生| | 2025-3-21 13:28 | 只看该作者
感谢分享。

使用特权

评论回复
15
穷得响叮当侠| | 2025-3-22 12:22 | 只看该作者
比如机器人、自动化设备等,这种定时器实现编码器脉冲计数的功能应该很有价值

使用特权

评论回复
16
dffzh|  楼主 | 2025-3-23 11:52 | 只看该作者
穷得响叮当侠 发表于 2025-3-22 12:22
比如机器人、自动化设备等,这种定时器实现编码器脉冲计数的功能应该很有价值
...

是的,在工业自动化设备或者PLC设备上,可以得到应用。

使用特权

评论回复
17
作业天敌在此| | 2025-3-23 16:16 | 只看该作者
这个配置过程看起来挺复杂的,不过很详细

使用特权

评论回复
18
蚊子的噩梦| | 2025-3-23 17:10 | 只看该作者
将PR值扩展至32位,可以满足更大范围的计数需求

使用特权

评论回复
19
dffzh|  楼主 | 2025-3-23 20:50 | 只看该作者
作业天敌在此 发表于 2025-3-23 16:16
这个配置过程看起来挺复杂的,不过很详细

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

使用特权

评论回复
评论
作业天敌在此 2025-3-28 21:10 回复TA
受教了 
20
dffzh|  楼主 | 2025-3-23 20:53 | 只看该作者
蚊子的噩梦 发表于 2025-3-23 17:10
将PR值扩展至32位,可以满足更大范围的计数需求

是的,我们使用环形计数器,计数范围是从﹣2147483648~2147483647

使用特权

评论回复
发新帖 本帖赏金 50.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

30

帖子

2

粉丝