查看: 3439|回复: 6

[应用教程] arduino宏的应用实例7--读编码器模块

[复制链接]
用于读取旋转编码器模块




  1. //非阻塞编码器模块读取,通过编码器按键使能编码器事件,当编码器使能时分别增减计数值。
  2. //未用到中断,通过轮询读取编码器,周期5ms,编码器旋钮模块用,更高线数的编码器需要中断读。
  3. #include "key.h"     //按键检测宏
  4. #include "edge.h"    //边沿检测宏
  5. #include "encoder.h" //编码器检测宏
  6. #define pinA 2       //编码器A相
  7. #define pinB 3       //编码器B相
  8. #define pinK 4       //编码器按键
  9. int count = 0;       //编码器计数值
  10. bool en = true;      //编码器使能标志

  11. void setup() {
  12.   // put your setup code here, to run once:
  13.   Serial.begin(9600);
  14.   pinMode(pinK, INPUT_PULLUP);  //编码器按键设为内部上拉
  15.   Serial.println("Ready");
  16. }

  17. void loop() {
  18.   // put your main code here, to run repeatedly:
  19.   /*readKey(enable,cycleTime,x,no,onTrigger,onPop)   (使能,扫描周期,端口,信号是否反向,上升沿执行动作,下降沿执行动作)
  20.     按键使能,20ms扫描一次,4号端口,不反向,每次按下时把编码器使能标志反向,弹起时不动作*/
  21.   readKey(true, 20, pinK, false, if (en ^= true) {
  22.   Serial.println("Encoder enable");
  23.   } else {
  24.     Serial.println("Encoder unable");
  25.   }, void());
  26.   /*readEncoder(enable,cycleTime,pinA,pinB,incEvent,dincEvent   (使能,扫描周期,A相端口,B相端口,计数增执行动作,计数减沿执行动作)
  27.     编码器根据使能信号en启动,5ms扫描一次,2、3端口,分别增减计数值*/
  28.   readEncoder(en, 5, pinA, pinB, Serial.println(++count), Serial.println(--count));
  29. }
复制代码
  1. #ifndef __EDGE_H__
  2. #define __EDGE_H__
  3. //逻辑量的四种状态:低,上升,高,低
  4. enum edgeSta {low, trg, high, pop};
  5. //宏名:edge。 返回值:逻辑量状态。输入参数:bool值 用途:检测逻辑量的边沿。
  6. #define edge(ReadData) ({\
  7.     static bool Trg = false;\
  8.     static bool Cont = false;\
  9.     static bool Pop = false;\
  10.     Trg = ReadData & (ReadData ^ Cont); \
  11.     Pop = Cont != ReadData & !Trg; \
  12.     Cont = ReadData; \
  13.     enum edgeSta sta = low;\
  14.     if (Cont) {\
  15.       sta = high;\
  16.     } else {\
  17.       sta = low;\
  18.     }\
  19.     if (Trg) {\
  20.       sta = trg;\
  21.     }\
  22.     if (Pop) {\
  23.       sta = pop;\
  24.     }\
  25.     sta;\
  26.   })
  27. #endif
复制代码
  1. #ifndef __ENCODER_H__
  2. #define __ENCODER_H__
  3. #include "edge.h"
  4. #include "key.h"

  5. //readEncoder(enable,cycleTime,pinA,pinB,incEvent,dincEvent   (使能,扫描周期,A相端口,B相端口,计数增执行动作,计数减沿执行动作)
  6. #define readEncoder(enable,cycleTime,pinA,pinB,incEvent,dincEvent)({\
  7.     static bool no=false;\
  8.     if(edge(enable)==trg){\
  9.       pinMode(pinA, INPUT);\
  10.       pinMode(pinB, INPUT);\
  11.       no = !digitalRead(pinA);\
  12.     }\
  13.     readKey(enable,cycleTime,pinA, no, if (digitalRead(pinB)^no) {incEvent;} else {dincEvent;}, if (digitalRead(pinB)^no) {dincEvent;} else {incEvent;});\
  14.   })

  15. #endif
复制代码
  1. #ifndef __KEY_H__
  2. #define __KEY_H__
  3. #include "edge.h"

  4. //readKey(enable,cycleTime,x,no,onTrigger,onPop)   (使能,扫描周期,端口,信号是否反向,上升沿执行动作,下降沿执行动作)
  5. #define readKey(enable,cycleTime,x,no,onTrigger,onPop) do{\
  6.     static bool Trg = false;\
  7.     static bool Cont = false;\
  8.     static bool Pop = false;\
  9.     static unsigned long timdel = millis();\
  10.     switch(edge(enable)){\
  11.       case trg:\
  12.         Trg = false;\
  13.         Cont = false;\
  14.         Pop = false;\
  15.         timdel = millis();\
  16.         break;\
  17.       case high:\
  18.         if (millis() - timdel >= cycleTime) {\
  19.           bool ReadData = !digitalRead(x)^no;\
  20.           Trg = ReadData & (ReadData ^ Cont); \
  21.           Pop = Cont != ReadData & !Trg; \
  22.           Cont = ReadData; \
  23.           if (Trg) {\
  24.             onTrigger;\
  25.           }\
  26.           if (Pop) {\
  27.             onPop; \
  28.           }\
  29.           timdel = millis(); \
  30.         }\
  31.         break;\
  32.       default:\
  33.         break;\
  34.     }\
  35.   } while (0)
  36. #define keyReadInit(x) do{\
  37.     pinMode(x, INPUT_PULLUP);\
  38.   } while (0)
  39. #endif
复制代码



dsweiliang  版主

发表于 2016-6-20 08:19:05

学习学习
回复 支持 反对

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-6-20 17:39:28


学习学习
回复 支持 反对

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-6-20 17:39:28


学习学习
回复 支持 反对

使用道具 举报

凌风清羽  版主

发表于 2016-6-30 20:59:06

学习学习
回复 支持 反对

使用道具 举报

大连林海  初级技神
 楼主|

发表于 2016-6-30 22:43:38


哈哈  大师 留言回复看到了吗
回复 支持 反对

使用道具 举报

walkmanyy  见习技师

发表于 2018-1-22 12:29:21

LZ 我运行你的程序后提示Trg does not name a type是为什么呢edge.h文件下的
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail