数码之家

 找回密码
 立即注册
搜索
查看: 3774|回复: 6

[Arduino] 旋转编码器与arduino

[复制链接]
发表于 2019-12-15 08:57:39 | 显示全部楼层 |阅读模式
廉价旋转编码器


电路如此




与arduino相连接


采用中断方式来计数,搞了半天,还是有误码出现,不知大家有没好的例程


:mad:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 4家元 +70 收起 理由
zhuqing-1920 + 14
moontree + 20 謝謝分享
lrm888 + 20 謝謝分享
hfsp + 16 謝謝分享

查看全部打赏

发表于 2019-12-15 09:48:24 | 显示全部楼层
我记得我用编码器是偷懒了,直接在GitHub上找了一个库。
方法好像是枚举所有可能性,然后检测两个信号的先后顺序,再与预设是所有可能性对比,得出旋转方向和次数/角度
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-15 09:50:42 | 显示全部楼层
msi12 发表于 2019-12-15 09:48
我记得我用编码器是偷懒了,直接在GitHub上找了一个库。
方法好像是枚举所有可能性,然后检测两个信号的先 ...

准确率怎么样呢:loveliness:
回复 支持 反对

使用道具 举报

发表于 2019-12-15 13:02:59 来自手机浏览器 | 显示全部楼层
不知道为啥,总是会有错误码出来
回复 支持 反对

使用道具 举报

发表于 2019-12-15 13:30:59 | 显示全部楼层
  1. /*******************************************/
  2. //旋转编码器
  3. /*将你看到的角度位移旋转编码器串行打印在监视器上。
  4.   当旋转编码器顺时针转动时,角位移被增加;
  5.   当逆时针旋转,位移下降。
  6.   如果按下此开关的旋转编码器,其读数归零。*/
  7. //2017.11.11
  8. /*******************************************/

  9. const int clkPin = 2; //连接到CLK引脚2
  10. const int dtPin = 3; //在DT引脚连接到引脚3
  11. const int swPin = 4 ; //SW引脚连接到引脚4
  12. int encoderVal = 0;

  13. void setup()
  14. {
  15.   //设置clkpin,depin,swpin作为输入
  16.   pinMode(clkPin, INPUT);
  17.   pinMode(dtPin, INPUT);
  18.   pinMode(swPin, INPUT);
  19.   digitalWrite(swPin, HIGH);
  20.   Serial.begin(9600); // 初始化串行通信在9600bps
  21. }

  22. void loop()
  23. {
  24.   int change = getEncoderTurn();//
  25.   encoderVal = encoderVal + change;
  26.   if (digitalRead(swPin) == LOW) ////如果转动 按钮
  27.   {
  28.     encoderVal = 0;
  29.   }
  30.   Serial.println(encoderVal);
  31. }
  32. int getEncoderTurn(void)
  33. {
  34.   static int oldA = HIGH; //标志为高
  35.   static int oldB = HIGH;
  36.   int result = 0;
  37.   int newA = digitalRead(clkPin);//读取旋转编码器的值
  38.   int newB = digitalRead(dtPin);//读取旋转编码器的值
  39.   if (newA != oldA || newB != oldB) //如果发生改变
  40.   {

  41.     if (oldA == HIGH && newA == LOW)
  42.     {
  43.       result = (oldB * 2 - 1);
  44.     }
  45.   }
  46.   oldA = newA;
  47.   oldB = newB;
  48.   return result;
  49. }
复制代码
这我网上搜的 , 8266能用

打赏

参与人数 1家元 +20 收起 理由
人艰不拆了 + 20 谢谢,我试试

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-12-15 17:46:44 | 显示全部楼层
其实这个和硬件也有很大关系,硬件最好要消抖,软件就好处理

打赏

参与人数 1家元 +10 收起 理由
人艰不拆了 + 10

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2019-12-15 17:56:39 | 显示全部楼层
我以前玩过,arduino有库,但是不好用,自己用中断,轮询、硬件加电容防抖,也和楼主一样。
直到最后用了stm32的定时器。那个好用……,建议楼主试一试。

最后得出结论,硬件没问题,主要还是软件检测脉冲和处理方式。

  1. static void MX_TIM4_Init(void)
  2. {

  3.   TIM_Encoder_InitTypeDef sConfig;
  4.   TIM_MasterConfigTypeDef sMasterConfig;

  5.   htim4.Instance = TIM4;
  6.   htim4.Init.Prescaler = 2-1;
  7.   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;          //向上计数
  8.   htim4.Init.Period = 0xff;           //自动重装值65535  16位   0xff
  9.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;           //内部不分频,改变没反应
  10.   htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;          //自动重装
  11.   sConfig.EncoderMode = TIM_ENCODERMODE_TI12;  //A和B相都参与触发
  12.   sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;  //上升沿
  13.   sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  14.   sConfig.IC1Prescaler = TIM_ICPSC_DIV1;  //分频???改变没反应
  15.   sConfig.IC1Filter = 0;
  16.   sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  17.   sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  18.   sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  19.   sConfig.IC2Filter = 0;
  20.   if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
  21.   {
  22.     _Error_Handler(__FILE__, __LINE__);
  23.   }

  24.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  25.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  26.   if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  27.   {
  28.     _Error_Handler(__FILE__, __LINE__);
  29.   }

  30. }


  31.   htim4.Init.Prescaler = 2-1;  预分频2,每两个脉冲算一次有效计数触发改变定时器的值。因为这里选择的是A和B相都参与采样,只在上升沿采样,编码器一格会触发两个上升沿。这里选择2分频,因为从0开始,所以2-1
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 1家元 +20 收起 理由
人艰不拆了 + 20 熱心會員

查看全部打赏

回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-12 03:19 , Processed in 0.390000 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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