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

更简单的旋转编码器程序(不用中断的)

[复制链接]
fanjiezz 发布时间:2021-1-7 20:26
       几年前在此发过类似的文章,见<https://www.stmcu.org.cn/module/forum/thread-614394-1-1.html>
       但还觉得不够简单,今天发一个更简单的,除去设置、打印、指示灯、延迟语句后,只用了两行指令(见//***标记)。
代码如下:

//test 旋转编码器 STM32F103 20210106.ino
long keyN;
void setup() {
  pinMode (PA13, INPUT_PULLUP);
  pinMode (PA14, INPUT_PULLUP);
  pinMode (PC13, OUTPUT);
  Serial.begin (115200);
}
void loop() {  
  if ( digitalRead( PA13 ) & digitalRead( PA14 )){                 // ***
    digitalWrite(
PC13, !digitalRead( PC13 ) ); // 指示灯
    Serial.println( keyN );  // 打印
    delay(2); // 延迟
    keyN = keyN + !digitalRead(PA13) - !digitalRead(PA14);  //***
   }
}
注:
1。延迟时间可根据具体需求自定义大小。
2。GPIO可按需任选,这里偷懒用了SWD引脚,最好改用其他脚。
3。好像不能再精简到一行指令就能完成了,因为有时序关系。
4。望各位不吝指教。


收藏 1 评论3 发布时间:2021-1-7 20:26

举报

3个回答
goyhuan 回答时间:2021-1-8 08:23:45
看不懂,怎么识别方向和脉冲数
fanjiezz 回答时间:2021-1-8 10:18:40
keyN = keyN + !digitalRead(PA13) - !digitalRead(PA14);  //***
keyN就是脉冲数值
!digitalRead(PA13) 和 !digitalRead(PA14)的先后就是方向,它们同时只能有一个在变化。
另外:旋转编码器有两种
1.触点是长开型的,上面的程序可用。
2.市场上买来的简易旋转编码器模块,往往是长闭型的。上面加的两个103上拉电阻,请自行去掉。
并需将上面的程序中加“//***”号的改为
if ( !digitalRead( PA13 ) & !digitalRead( PA14 )){              // ***
    keyN = keyN + digitalRead(PA13) - digitalRead(PA14);  //***
即可。
fanjiezz 回答时间:2021-1-9 16:03:55
1.纠错:长开和长闭应改为常开和常闭
2.投文的目的是希望与大家共同改进、提高。本文今已投放到CSDN上,几小时便有600多人查看。希望各位大虾关心、指正。

所属标签

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