Насколько точно я могу получить Arduino, используя поворотные датчики?

15

Шаговые двигатели часто дороги для большого двигателя. Однако с помощью мощного стандартного двигателя постоянного тока и поворотного энкодера вы можете «имитировать» шаговый двигатель. Насколько точны ротационные энкодеры с Arduino только с базовым циклом и не так много другого кода? Будет ли он «пропускать пульс» и не записывать достаточно вращения часто? Как я могу справиться с этим с гораздо большим количеством кода? Есть лучший способ это сделать? Помогут ли прерывания? Есть ли какая-то схема, которая поможет с этой проблемой?

Примечание. Вероятно, оно не будет превышать 4 оборотов в секунду ... (Это может быть много, но если вы используете механизм типа ходового винта, скорость которого составляет всего 24 дюйма в минуту, если имеется 10 оборотов на дюйм линейного движения. )

Анонимный пингвин
источник
Я использовал поворотные энкодеры, которые отказывались работать при быстром вращении. Я думаю, это зависит от цены.
Джиппи

Ответы:

10

Прерывания - это то, что вы бы использовали в этой ситуации.

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

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

Существует функция с именем, attachInterrupt()которая будет принимать три аргумента.

  1. Контакт прерывания
  2. Программа обработки прерываний
  3. Режим

Ниже приведен пример для подсчета прерывания

volatile int myCounter = 0;

void setup(){
    attachInterrupt(0, count, RISING);
}

void count(){
    myCounter++;
}

Режимы следующие:

НИЗКОЕ, ИЗМЕНЕНИЕ, ВЗЛЕТ, Падение

Более подробную информацию об использовании прерываний можно найти здесь .

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

Редактировать Вот пример кода из Arduino Sandbox для использования поворотного энкодера.

Мэтт Кларк
источник
1
Детектор краев, управляемый прерываниями, в Duemilanove легко обрабатывает 100 граней в секунду (6500 об / мин на двигателе).
Wayfaring Незнакомец
@WayfaringStranger Так что тогда на Uno проблем нет. Благодарность!
Анонимный пингвин
1
@AnnonomusPerson - Сколько работы вы готовы вкладывать? Если вы используете naked ( ISR_NAKED()), вы можете пропустить автоматическое сохранение контекста C и без проблем вывести частоту прерываний 100-500 кГц, но в этот момент вы пишете сборку на C.
Коннор Вольф
1
Если вы хотите получить полностью банановый документ об оптимизации абсолютного дерьма из ответа на прерывание, посмотрите здесь . Размещение кода непосредственно в таблице прерываний для дальнейшего уменьшения задержки прерывания!
Коннор Вольф
1
Кроме того, обратите внимание, что если вы собираетесь использовать прерывания с малой задержкой, то функция attachInterrupt arduino вводит дополнительные издержки при вызове функции по сравнению с ISR()непосредственным использованием прерывания .
Коннор Вольф
3

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

Чтение вращающихся энкодеров: http://playground.arduino.cc/Main/RotaryEncoders

Квадратурный кодер слишком быстр для Arduino (с решением): http://www.hessmer.org/blog/2011/01/30/quadrature-encoder-too-fast-for-arduino/

Библиотека Teensy Encoder: https://www.pjrc.com/teensy/td_libs_Encoder.html

Чтение поворотного энкодера на Arduino: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino/

gwideman
источник