Энкодер Arduino прерывает повреждение последовательных данных - PullRequest
1 голос
/ 28 марта 2012

У меня есть Arduino Mega, подключенная к 6-осевой роботизированной руке.Все 6 прерываний подключены к энкодерам (один контакт энкодера на прерывании, другой на ванильном цифровом входе).Прерывания обрабатываются с помощью этого кода:

void readEncoder1(){
//encoders is a 2d array, where the first d is the axis, and the two pin numbers
//first pin is on an interrupt (CHANGE), and second is a standard digital in
  if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) {
   positions[0]++;
  } else {
   positions[0]--;
  }
 if(servoEnable){
  updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly
 }
}

Это разработано, чтобы держать руку заблокированной в определенном положении - если arduino обнаруживает, что положение двигателя выключено по определенному порогу, оно обновляетМощность идет на двигатель, чтобы держать руку на месте.

Проблема в том, что, если две или три (или более) оси находятся под нагрузкой (требуется постоянное обновление, чтобы оставаться на месте) или они движутся, Arduino перестанет получать неповрежденные команды на последовательном входе, несколько символов будут удалены.Прерывания, очевидно, выполняются довольно быстро, и по какой-то причине это приводит к повреждению команд.Есть ли способ обойти это?Архитектурно, я делаю это правильно?Мой основной инстинкт - вызывать updatePositions () в главном цикле выполнения, скажем, с интервалом в 100 мс, это значительно уменьшит издержки прерывания?Я думаю, что мой вопрос сводится к тому, как я могу получить надежные последовательные команды в Arduino, даже если все 6 кодировщиков пульсируют?

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

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

Выполнение этого в программном обеспечении с маломощным процессором - это, конечно, сложно.Он развалится, когда ISR займет больше времени, чем интервал между импульсами.Вы потеряете импульсы и, следовательно, положение.Особенно плохо, потому что нет способа обнаружить это состояние ошибки.И эта потеря происходит, когда робот движется быстро, наихудший случай потери контроля.

Вы абсолютно не можете позволить обновить серво-цикл в обработчике прерываний, поэтому сначала избавьтесь от него.Держите ISR до минимума, считайте только позицию и ничего больше.Серво петля должна быть отдельной, управляемой прерыванием по таймеру или тиковым сигналом.Вы не можете должным образом управлять роботом с серво-обновлением 100 мс, если он не слишком медленный, для получения плавного ускорения и стабильной обратной связи требуется не более нескольких миллисекунд.

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

1 голос
/ 28 марта 2012

Первое правило встраиваемых систем:

Делайте как можно меньше прерываний.

В вашем случае просто обновите позиции в прерывании и запустите цикл управления положением / скоростью в фоновом режиме или с более низким приоритетом.

В сторону: я полагаю, вы знаете, что вы «теряете» импульсы датчика, поскольку у вас нет прерывания на одном из каналов?

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

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

...