找回密码
 立即注册
查看: 111|回复: 6

关于编码器模式的一些疑问 想用在EC11手动编码器上

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-24 11:40:18

8

主题

25

回帖

516

积分

高级会员

积分
516
发表于 2025-4-1 12:04:06 | 显示全部楼层 |阅读模式
看了例程和视频,看的有点迷糊,现有如下疑问,
1.这个编码器模式适合EC11这类手动编码器吗,还是说使用PWM捕获做中断更合适?
2.这个编码器模式 可以实现速度读取吗 实时改变步长 例如下
  1. if (speed< 1) {         // 超快速
  2.         step = 50;
  3.     } else if (speed< 10) { // 快速
  4.         step = 20;
  5.     } else if (speed< 15) { // 中速
  6.         step = 5;
  7.     } else {                       // 慢速
  8.         step = 1;
  9.     }
复制代码


目前就这两个疑问。还请大佬指点个思路
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-1 12:08:00 | 显示全部楼层
关于编码器模式在EC11手动编码器上的应用,以下是对您提出的两个疑问的专业解答:

1. 编码器模式是否适合EC11手动编码器?
EC11手动编码器是一种常见的旋转编码器,通常用于检测旋转方向和步进。编码器模式(Encoder Mode)是一种专门用于处理旋转编码器信号的硬件功能,通常集成在微控制器的定时器模块中。它通过捕获编码器的A相和B相信号,自动计算旋转方向和步进数。

对于EC11这类手动编码器,使用编码器模式是非常合适的。编码器模式能够高效地处理编码器信号,减少CPU的负担,并且能够准确检测旋转方向和步进数。相比之下,使用PWM捕获做中断虽然也可以实现类似功能,但需要更多的软件处理,且实时性和准确性可能不如编码器模式。

2. 编码器模式是否可以实现速度读取并实时改变步长?
编码器模式本身主要用于检测旋转方向和步进数,但通过适当的软件处理,可以实现速度读取并实时改变步长。具体实现思路如下:
速度读取:可以通过定时器中断或定时器捕获功能,定期读取编码器的步进数,并计算旋转速度。例如,每隔一定时间(如10ms)读取一次编码器的步进数,然后根据步进数的变化计算速度。
实时改变步长:根据计算得到的速度,动态调整步长。您提供的代码片段已经展示了如何根据速度调整步长的逻辑。在编码器模式中,可以通过软件实现类似的逻辑,根据速度动态调整步长。

以下是一个简单的示例代码,展示如何实现速度读取和步长调整:
  1. c
  2. // 假设编码器步进数存储在变量encodercount中
  3. int encodercount = 0;
  4. int lastencodercount = 0;
  5. int speed = 0;
  6. int step = 1;
  7. // 定时器中断服务程序,每隔10ms执行一次
  8. void TIMERIRQHandler(void) {
  9.     // 计算速度
  10.     speed = (encodercount - lastencodercount)  100; // 假设单位为步/秒
  11.     lastencodercount = encodercount;
  12.     // 根据速度调整步长
  13.     if (speed < 1) {         // 超快速
  14.         step = 50;
  15.     } else if (speed < 10) { // 快速
  16.         step = 20;
  17.     } else if (speed < 15) { // 中速
  18.         step = 5;
  19.     } else {                 // 慢速
  20.         step = 1;
  21.     }
  22. }
  23. // 主循环中根据步长处理编码器步进
  24. while (1) {
  25.     // 处理编码器步进
  26.     if (encodercountchanged) {
  27.         // 根据步长处理步进
  28.         // ...
  29.     }
  30. }
复制代码

总结
编码器模式非常适合EC11手动编码器,能够高效准确地处理编码器信号。
通过适当的软件处理,编码器模式可以实现速度读取并实时改变步长。

希望以上解答能够帮助您更好地理解编码器模式在EC11手动编码器上的应用。如有进一步疑问,欢迎继续探讨。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

积分
5452
发表于 2025-4-1 13:01:42 | 显示全部楼层
手动编码器的速度不快,并且拧动的时候有噪声,所以更适合直接使用I/O中断来读取脉冲和判断方向,同时软件内加入消抖部分即可
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 14:00:12 | 显示全部楼层
当按键读,用执行其他程序的时间消抖
  1. void Encoder_Scan(void)
  2. {
  3.         static bit encoder_up_flag,encoder_down_flag;
  4.         static unsigned char encoder_up_temp,encoder_down_temp;
  5.         if(PHASE_A==0&&PHASE_B==1&&encoder_down_temp==0&&encoder_down_flag==0&&encoder_up_flag==0&&encoder_up_temp==0)
  6.         {
  7.                 encoder_down_flag=1;
  8.                 encoder_down_temp=1;
  9.                 encoder_up_flag=0;
  10.                 encoder_up_temp=0;
  11.         }
  12.         if(PHASE_A==1&&PHASE_B==0&&encoder_up_temp==0&&encoder_up_flag==0&&encoder_down_flag==0&&encoder_down_temp==0)
  13.         {
  14.                 encoder_up_flag=1;
  15.                 encoder_up_temp=1;
  16.                 encoder_down_flag=0;
  17.                 encoder_down_temp=0;
  18.         }
  19.         if(PHASE_A==0&&PHASE_B==0&&encoder_down_temp==1&&encoder_down_flag==1&&encoder_up_flag==0&&encoder_up_temp==0)
  20.                 encoder_down_temp=2;
  21.         if(PHASE_A==0&&PHASE_B==0&&encoder_up_temp==1&&encoder_up_flag==1&&encoder_down_flag==0&&encoder_down_temp==0)
  22.                 encoder_up_temp=2;
  23.         if(PHASE_A==1&&PHASE_B==0&&encoder_down_temp==2&&encoder_down_flag==1&&encoder_up_flag==0&&encoder_up_temp==0)
  24.                 encoder_down_temp=3;
  25.         if(PHASE_A==0&&PHASE_B==1&&encoder_up_temp==2&&encoder_up_flag==1&&encoder_down_flag==0&&encoder_down_temp==0)
  26.                 encoder_up_temp=3;
  27.         if(PHASE_A==1&&PHASE_B==1&&encoder_down_temp==3&&encoder_down_flag==1&&encoder_up_flag==0&&encoder_up_temp==0)
  28.                 encoder_down_temp=4;
  29.         if(PHASE_A==1&&PHASE_B==1&&encoder_up_temp==3&&encoder_up_flag==1&&encoder_down_flag==0&&encoder_down_temp==0)
  30.                 encoder_up_temp=4;
  31.         if(PHASE_A==1&&PHASE_B==1&&encoder_down_temp!=4&&encoder_down_flag==1&&encoder_up_flag==0&&encoder_up_temp==0)
  32.         {
  33.                 encoder_down_temp=0;
  34.                 encoder_down_flag=0;
  35.         }
  36.         if(PHASE_A==1&&PHASE_B==1&&encoder_up_temp!=4&&encoder_up_flag==1&&encoder_down_flag==0&&encoder_down_temp==0)
  37.         {
  38.                 encoder_up_temp=0;
  39.                 encoder_up_flag=0;
  40.         }
  41.         if(encoder_down_temp==4)
  42.         {
  43.                 encoder_down_flag=0;
  44.                 encoder_down_temp=0;
  45.                 encoder_up_temp=0;
  46.                 encoder_up_flag=0;
  47. //逆时针执行的操作
  48.         }
  49.         if(encoder_up_temp==4)
  50.         {
  51.                 encoder_up_flag=0;
  52.                 encoder_up_temp=0;
  53.                 encoder_down_flag=0;
  54.                 encoder_down_temp=0;
  55. //顺时针执行的操作
  56.         }
  57. }
复制代码


点评

这是拧一格执行1次的,这个函数要以100~1000Hz执行,再套一层函数,判断方向和时间,实现可变步长  详情 回复 发表于 2025-4-1 14:05
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 14:05:34 | 显示全部楼层
Debu*** 发表于 2025-4-1 14:00
当按键读,用执行其他程序的时间消抖

这是拧一格执行1次的,这个函数要以100~1000Hz执行,再套一层函数,判断方向和时间,实现可变步长
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:32
  • 最近打卡:2025-04-24 11:40:18

8

主题

25

回帖

516

积分

高级会员

积分
516
发表于 2025-4-1 15:23:12 | 显示全部楼层
Debu*** 发表于 2025-4-1 14:05
这是拧一格执行1次的,这个函数要以100~1000Hz执行,再套一层函数,判断方向和时间,实现可变步长 ...

这种轮询的 对于速度计算 并不可靠,并不是不能用,就是体验感不好,因为我们有些参数范围比较大,理想状态,我快拧一圈能实现0-2000,慢拧又能1个1个步进,现在看来,用IO中断更合适,谢谢大佬

点评

EC11一圈20个格,20就可以了 您希望的快拧快速调节可以再套一层函数,判断时间  详情 回复 发表于 2025-4-1 16:23
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-4-1 16:23:44 | 显示全部楼层
菜鸟*** 发表于 2025-4-1 15:23
这种轮询的 对于速度计算 并不可靠,并不是不能用,就是体验感不好,因为我们有些参数范围比较大,理想状 ...

EC11一圈20个格,20就可以了
您希望的快拧快速调节可以再套一层函数,判断时间
放在主程序中只有中断会影响,也可以放在定时器中断中以固定频率执行
这个函数里又没有延时函数,完全就是状态机,也不会造成阻塞

DebugLab
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:19 , Processed in 0.121916 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表