Одновременная работа кодера и считывание с аналогового порта
Мне нужно считывать данные с аналогового порта, и в то же время мне нужно иметь возможность управлять кодером, но сейчас я не могу этого сделать. Когда происходит постоянное считывание с аналогового порта, кодер не работает.
[![// Для энкодера:
#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
Обсуждение2 ответа
Вероятно, функция analogRead() замедляет чтение кодера. Функция analogRead() работает медленно и требует около 100 мкс для вызова. Кодировщик имеет решающее значение для времени при чтении. Это, вероятно, не контролируется прерыванием, иначе не было бы вызова enc.tick(). Что вы можете попробовать. Дайте кодировщику больше времени для чтения.
if (millis() - 100 >= t0) {
t0 = millis();
float voltage = (float)(analogRead(Temp) * 5.0) / 1024;
}
t0 должен быть объявлен как uint32_t раньше. Таким образом, analogRead() вызывается только каждые 100 мс. Это должно дать кодировщику достаточно времени для считывания сигналов.
Все сработало, спасибо за ответы. На самом деле я увеличил скорость чтения последовательного порта, и этого оказалось достаточно.
- Отправка значения с одного Arduino на другой
- Использование аналогового входа для чтения кнопки
- Как работать с аналоговыми контактами в цикле?
- Считывание нескольких поворотных энкодеров
- Использование поворотных энкодеров с прерываниями смены контактов
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Распиновка аналога Arduino Pro Micro
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
Непонятно, что вы подразумеваете под "не работает". Хотя, если вы хотите проверить кодер в фоновом режиме, вы можете использовать код для этого с прерываниями. В поисках библиотеки я быстро нашел [эту библиотеку](https://github.com/Erriez/ErriezRotaryEncoderFullStep), хотя могли бы быть и получше (долго не искал)., @chrisl
программа не реагирует на кодировщик. Хотя если отключить чтение с аналогового порта, то кодер работает стабильно, @Антон
'analogRead()
ожидает, пока АЦП завершит преобразование. Использование библиотеки на основе прерываний означает, что всякий раз, когда поступает импульс от кодировщика, Arduino напрямую покидает текущий запущенный основной код, подсчитывает импульс кодировщика и затем возвращается к основному коду. Таким образом, он может считывать импульсы, пока " analogRead()
ожидает АЦП., @chrisl