Одновременная работа кодера и считывание с аналогового порта

Мне нужно считывать данные с аналогового порта, и в то же время мне нужно иметь возможность управлять кодером, но сейчас я не могу этого сделать. Когда происходит постоянное считывание с аналогового порта, кодер не работает.

    [![// Для энкодера:
#define CLK 2
#define DT 6
#define SW 5

#include <GyverEncoder.h>
Encoder enc(CLK, DT, SW);
byte k = 0;
int v;
// For encoder:


#define Motor_Pin_PWM 3 // Мы подключаем двигатель к ШИМ - выходу arduino
#define Temp 0 // Аналоговый вход A0 для измерения температуры с датчика (напряжение с датчика сопротивления)
byte val = 0;//0-255 Глобальная переменная

void setup() {
  Serial.begin(9600);
  pinMode(Motor_Pin_PWM, OUTPUT); // For motor
  pinMode(Temp, INPUT); // Для датчика температуры
  
  enc.setType(TYPE2); // Для кодировщика
}

void loop() {

float voltage = (float)(analogRead(Temp) * 5.0) / 1024; // Преобразование значений АЦП в напряжение.
//Serial.println("Voltage: ");
//Serial.println(voltage);

  
 // Для кодировщика:
 enc.tick();
  if (enc.isTurn()) 
  {
    if (enc.isRight()) k++;
    if (enc.isLeft()) k--;
    Serial.println(k);
  }
  // Для кодировщика:


  if (voltage <= 2)
  {
    val = 0;
  }

  if (voltage > 2.2)
  {
    val = 255;
  }
  
val = val + 10*k;
//Serial.println(val);
Serial.println(k);
analogWrite(Motor_Pin_PWM, val); //Скорость вращения двигателя
}][1]][1]

, 👍-1

Обсуждение

Непонятно, что вы подразумеваете под "не работает". Хотя, если вы хотите проверить кодер в фоновом режиме, вы можете использовать код для этого с прерываниями. В поисках библиотеки я быстро нашел [эту библиотеку](https://github.com/Erriez/ErriezRotaryEncoderFullStep), хотя могли бы быть и получше (долго не искал)., @chrisl

программа не реагирует на кодировщик. Хотя если отключить чтение с аналогового порта, то кодер работает стабильно, @Антон

'analogRead() ожидает, пока АЦП завершит преобразование. Использование библиотеки на основе прерываний означает, что всякий раз, когда поступает импульс от кодировщика, Arduino напрямую покидает текущий запущенный основной код, подсчитывает импульс кодировщика и затем возвращается к основному коду. Таким образом, он может считывать импульсы, пока " analogRead() ожидает АЦП., @chrisl


2 ответа


-1

Вероятно, функция analogRead() замедляет чтение кодера. Функция analogRead() работает медленно и требует около 100 мкс для вызова. Кодировщик имеет решающее значение для времени при чтении. Это, вероятно, не контролируется прерыванием, иначе не было бы вызова enc.tick(). Что вы можете попробовать. Дайте кодировщику больше времени для чтения.

if (millis() - 100 >= t0) {
    t0 = millis();
    float voltage = (float)(analogRead(Temp) * 5.0) / 1024;
}

t0 должен быть объявлен как uint32_t раньше. Таким образом, analogRead() вызывается только каждые 100 мс. Это должно дать кодировщику достаточно времени для считывания сигналов.

,

0

Все сработало, спасибо за ответы. На самом деле я увеличил скорость чтения последовательного порта, и этого оказалось достаточно.

,