arduino宏的应用实例7--读编码器模块

2016-06-182.2万
AI 快速预览详细 收起
本文介绍了如何使用Arduino宏读取旋转编码器模块。通过非阻塞方式实现计数增减,适用于需要精确控制和反馈的项目,如机器人、自动化设备等。提供了完整的代码示例和详细的步骤说明。具体实现中,通过readKey宏和readEncoder宏,实现了编码器按键使能和编码器计数值的增减。
用于读取旋转编码器模块
arduino宏的应用实例7--读编码器模块图1
arduino宏的应用实例7--读编码器模块图2
  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
复制代码



创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(3)
walkmanyy
walkmanyy
LZ 我运行你的程序后提示Trg does not name a type是为什么呢edge.h文件下的
凌风清羽
凌风清羽
学习学习
qq815076543322
qq815076543322
作者
回复凌风清羽
哈哈 大师 留言回复看到了吗
dsweiliang
dsweiliang
学习学习
qq815076543322
qq815076543322
作者
回复dsweiliang
学习学习
qq815076543322
qq815076543322
作者
回复dsweiliang
学习学习
- 没有更多了 -