Энкодер соединен с валом двигателя. Энкодер выдает более высокие значения, чем ожидалось.

Я новичок и у меня нет большого опыта работы с Arduino. пожалуйста, помогите мне. Я намерен построить робота, который будет двигаться по прямой даже по неровным поверхностям, подобным тем, которые мы видим на сельскохозяйственных полях (это всего лишь прототип, поэтому я хочу запустить его на обычных поверхностях для бездорожья). У робота 4 двигателя, по одному на каждое колесо. Я планирую использовать метод обратной связи энкодера, чтобы двигаться прямо. Прямо сейчас я подключил диск с прорезями к валу двигателя постоянного тока и пытаюсь получить показания от энкодера и отобразить их через определенный интервал (5 секунд) на последовательном мониторе. Подсчет, который я получаю, далек от истины. Диск имеет 30 слотов. Всего за 2–3 вращения я насчитал около 180.

Я использую Arduino R3. Выход энкодера:- Pin2 (внешнее прерывание) Контакты двигателя: - 8,9 Я прилагаю код ниже.

const int motorPin1  = 8;  // Контакт 14 L293
const int motorPin2  = 9;  // Контакт 10 L293
const int encoder_pin = 2;
volatile unsigned int count = 0;
 int time1 = 0;
 int time2 = 0;
void setup() {
  // поместите сюда свой код установки для однократного запуска:
  pinMode(motorPin1, OUTPUT);
    pinMode(motorPin2, OUTPUT);
    pinMode(encoder_pin,INPUT);
    digitalWrite(encoder_pin,HIGH);
    attachInterrupt(0,encoder,RISING);
    Serial.begin(9600);
     digitalWrite(motorPin1,HIGH);
    digitalWrite(motorPin2,LOW);
    time1 = millis();
}

void loop() {
  // поместите сюда свой основной код для многократного запуска:
    time2 = millis();
    if(abs((time2 - time1) > 5000))
    {
    digitalWrite(motorPin1,LOW);
    digitalWrite(motorPin2,LOW);
    Serial.println(count);
    }
}

 void encoder()
 {
  count++;

 }

конец кода

Диск, который я установил на вал, не вращается точно в вертикальной плоскости. Но у меня мигает энкодер, когда я вращаю вал рукой. Может ли быть причиной этого смещение?

, 👍0


2 ответа


Лучший ответ:

1

Думаю, это своего рода проблема устранения дребезга, вызванная шумом на выводе прерывания. Поведение также может ухудшиться из-за упомянутого вами несоответствия. Вы можете убедиться в этом, вращая вал вручную, хотя вы и «получаете мигания», я сомневаюсь, что они точны в подсчете.

В этом случае вы можете сделать две вещи:

  • добавьте к выводу прерывания емкость или RC-фильтр, чтобы сгладить пики напряжения, если они есть. Это уменьшит вероятность случайного срабатывания прерывания (и не решит проблему), но в качестве нижнего прохода оно также ограничивает максимальную скорость счета, которую вы можете обнаружить.
  • реализовать устранение дребезжания в программном обеспечении. Обычно это делается путем игнорирования входного сигнала в течение определенного периода времени («мертвое время») после возникновения прерывания. Поскольку вы ожидаете периодический сигнал и поведение по устранению дребезга может быть разным на разной скорости, было бы неплохо зафиксировать промежуток времени между двумя «миганиями» и сделать время простоя зависимым от этой расчетной скорости.

Ещё: способ проверки метки времени немного неправильный. Вместо этого вам следует сделать что-то вроде этого:

void setup() {
  unsigned long starttime=millis();
}

void loop() {
  if (millis()-starttime > 5000) {
    starttime=millis();
    // помещаем сюда код, который будет запускаться каждые 5000 мс
  }
}
,

0

Обычно поворотный энкодер имеет как минимум два датчика.

Инкрементные поворотные энкодеры обычно имеют только 2 датчика. Абсолютные или позиционные энкодеры имеют больше возможностей и позволяют определить абсолютную ориентацию датчика, считывая битовую комбинацию.

Чтобы прочитать инкрементный энкодер, вы пишете свой код, обращающий внимание только на попеременные изменения в датчиках. Это дает вам автоматическое устранение дребезга контактов. Предлагаю вам поискать код Arduino для декодирования поворотных энкодеров.

,