You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
4.7 KiB
146 lines
4.7 KiB
#include <cstdint>
|
|
#include <binary.h>
|
|
#include <esp32-hal-gpio.h>
|
|
#include <Arduino.h>
|
|
#include "enc.h"
|
|
|
|
const int PinA[ENCODER_COUNT]={14,12,26,33}; // контат AB
|
|
const int PinC[ENCODER_COUNT]={27,13,25,32}; // контат BC
|
|
|
|
uint8_t pinA[ENCODER_COUNT] = {0,0,0,0}; // состояние контата AB
|
|
uint8_t pinC[ENCODER_COUNT] = {0,0,0,0}; // состояние контата BC
|
|
|
|
uint8_t blockA[ENCODER_COUNT] = {false,false,false,false}; // блокировка прерывания на контакте AB
|
|
uint8_t blockC[ENCODER_COUNT] = {false,false,false,false}; // блокировка прерывания на контакте BC
|
|
|
|
uint8_t encoderResult[ENCODER_COUNT] = {0,0,0,0}; // Результирующая переменная
|
|
int16_t encoderCount[ENCODER_COUNT] = {0,0,0,0}; // Счетчик щелчков энкодера
|
|
int16_t oldencoderCount[ENCODER_COUNT] = {0,0,0,0}; // Счетчик старое значение
|
|
|
|
int16_t getEncoderCount(int enc) {
|
|
return encoderCount[enc];
|
|
}
|
|
|
|
int16_t getOldencoderCount(int enc) {
|
|
return oldencoderCount[enc];
|
|
}
|
|
|
|
void setOldencoderCount(int enc, int16_t val) {
|
|
oldencoderCount[enc] = val;
|
|
}
|
|
|
|
void encoderFilter (int enc) {
|
|
encoderResult[enc] = encoderResult[enc] & B00001111;
|
|
if (encoderResult[enc] == B1011) encoderCount[enc] ++; // по часовой стрелке
|
|
if (encoderResult[enc] == B0111) encoderCount[enc] --; // против часосовой стрелки
|
|
}
|
|
|
|
void pinACHANGE (int enc) { // Изменилось состояние контакта АB
|
|
if (blockA[enc] == true) return;
|
|
pinA[enc] = !digitalRead(PinA[enc]);
|
|
pinC[enc] = !digitalRead(PinC[enc]);
|
|
encoderResult[enc] <<= 1;
|
|
bitWrite(encoderResult[enc], 0, pinA[enc]);
|
|
encoderResult[enc] <<= 1;
|
|
bitWrite(encoderResult[enc], 0, pinC[enc]);
|
|
encoderFilter(enc);
|
|
if (!pinA[enc] && !pinC[enc]) blockA[enc] = false; else blockA[enc] = true;
|
|
blockC[enc] = false;
|
|
}
|
|
|
|
void pinCCHANGE (int enc) { // Изменилось состояние контакта BC
|
|
if (blockC[enc] == true) return;
|
|
pinA[enc] = !digitalRead(PinA[enc]);
|
|
pinC[enc] = !digitalRead(PinC[enc]);
|
|
encoderResult[enc] <<= 1;
|
|
bitWrite(encoderResult[enc], 0, pinA[enc]);
|
|
encoderResult[enc] <<= 1;
|
|
bitWrite(encoderResult[enc], 0, pinC[enc]);
|
|
encoderFilter(enc);
|
|
if (!pinA[enc] && !pinC[enc]) blockC[enc] = false; else blockC[enc] = true;
|
|
blockA[enc] = false;
|
|
}
|
|
|
|
#ifdef ENC1
|
|
void enc_1_A() {
|
|
pinACHANGE(ENC1);
|
|
}
|
|
|
|
void enc_1_C() {
|
|
pinCCHANGE(ENC1);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ENC2
|
|
void enc_2_A() {
|
|
pinACHANGE(ENC2);
|
|
}
|
|
|
|
void enc_2_C() {
|
|
pinCCHANGE(ENC2);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ENC3
|
|
void enc_3_A() {
|
|
pinACHANGE(ENC3);
|
|
}
|
|
|
|
void enc_3_C() {
|
|
pinCCHANGE(ENC3);
|
|
}
|
|
#endif
|
|
|
|
#ifdef ENC4
|
|
void enc_4_A() {
|
|
pinACHANGE(ENC4);
|
|
}
|
|
|
|
void enc_4_C() {
|
|
pinCCHANGE(ENC4);
|
|
}
|
|
#endif
|
|
|
|
void setupEncoder() {
|
|
//привязываем прерывания
|
|
//первый енкодер
|
|
#ifdef ENC1
|
|
pinMode (PinA[ENC1], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
pinMode (PinC[ENC1], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
attachInterrupt(digitalPinToInterrupt(PinA[ENC1]), enc_1_A, CHANGE);
|
|
attachInterrupt(digitalPinToInterrupt(PinC[ENC1]), enc_1_C, CHANGE);
|
|
#endif
|
|
|
|
//второй энкодер
|
|
#ifdef ENC2
|
|
pinMode (PinA[ENC2], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
pinMode (PinC[ENC2], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
attachInterrupt(digitalPinToInterrupt(PinA[ENC2]), enc_2_A, CHANGE);
|
|
attachInterrupt(digitalPinToInterrupt(PinC[ENC2]), enc_2_C, CHANGE);
|
|
#endif
|
|
|
|
//третий энкодер
|
|
#ifdef ENC3
|
|
pinMode (PinA[ENC3], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
pinMode (PinC[ENC3], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
attachInterrupt(digitalPinToInterrupt(PinA[ENC3]), enc_3_A, CHANGE);
|
|
attachInterrupt(digitalPinToInterrupt(PinC[ENC3]), enc_3_C, CHANGE);
|
|
#endif
|
|
|
|
//четвертый энкодер
|
|
#ifdef ENC4
|
|
pinMode (PinA[ENC4], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
pinMode (PinC[ENC4], INPUT_PULLUP); // Как вход и внутренняя подтяжка
|
|
attachInterrupt(digitalPinToInterrupt(PinA[ENC4]), enc_4_A, CHANGE);
|
|
attachInterrupt(digitalPinToInterrupt(PinC[ENC4]), enc_4_C, CHANGE);
|
|
#endif
|
|
}
|
|
|
|
/*void loop() {
|
|
|
|
if (oldencoderCount != encoderCount) {
|
|
Serial.println (encoderCount);
|
|
oldencoderCount = encoderCount;
|
|
}
|
|
|
|
}*/
|
|
|