搜索
查看: 1011|回复: 3

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

[复制链接]

该用户从未签到

6

主题

19

帖子

0

蝴蝶豆

高级会员

最后登录
2021-1-9
发表于 2021-1-7 20:26:54 | 显示全部楼层 |阅读模式
       几年前在此发过类似的文章,见<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。望各位不吝指教。


回复

使用道具 举报

该用户从未签到

8

主题

734

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-5-15
发表于 2021-1-8 08:23:45 | 显示全部楼层
看不懂,怎么识别方向和脉冲数
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

19

帖子

0

蝴蝶豆

高级会员

最后登录
2021-1-9
 楼主| 发表于 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);  //***
即可。
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

19

帖子

0

蝴蝶豆

高级会员

最后登录
2021-1-9
 楼主| 发表于 2021-1-9 16:03:55 | 显示全部楼层
1.纠错:长开和长闭应改为常开和常闭
2.投文的目的是希望与大家共同改进、提高。本文今已投放到CSDN上,几小时便有600多人查看。希望各位大虾关心、指正。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 05:25 , Processed in 0.152152 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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