Multi Encoder Sketch с ускорением

Мадиас
Пн 27 апреля 2015 г. 15:51
Легкий в использовании эскиз для настройки нескольких кодеров с ускорением (более быстрое движения, увеличение данных) увеличение). IRQ, управляемый, HW Timer и прямой доступ к PIN (вместо DigitalRead).

mausi_mick
Сб 12 ноября 2016 г. 3:08
Я думаю, что код в файле Zip не в порядке,
Я думаю, что должен быть еще один { ... } На этой строке: <<#######


...

if ((gpio_read_bit (pin_map [encoderpinb [счетчик]].gpio_device, pin_map [encoderpinb [счетчик]].gpio_bit) ? Высокий: низкий) != B_set [счетчик])
{
B_set [счетчик] = !B_set [счетчик];
if (b_set [счетчик] && !A_set [счетчик])
// <########################################################################## {
if (millis () - encodertimer > 3)
Encoderpos [счетчик] -= 1;
еще
Encoderpos [счетчик] -= 5;
// <########################################################################################## вместе
encodertimer = millis ();
}


mausi_mick

Rogerclark
Сб 12 ноября 2016 г., 6:18
Код компилируется в порядке, поэтому эти кронштейны не являются необходимы.

Rogerclark
Сб 3 декабря 2016 г., 7:56 утра
Матиас

КСТАТИ.

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

Я знаю, что это не так хорошо, как два резистора и один метод дебюра, но это работало нормально для меня.

Единственный недостаток этого простого метода (используя прикрепление к входу A), заключается в том, что если вы поверните очень быстро, он теряет некоторые шаги, и вы не получите 5x ускорение. Но я мог бы добавить ускорение, получив миллисы в обработчике прерываний, и если бы это было меньше, чем какое -то небольшое значение, поскольку последнее прерывание, то я мог бы добавить или вычитать 5 вместо 1.

Но мне нравится метод внешнего аналога.

Пито
Пн, 5 декабря 2016 г., 9:40 утра
К вашему сведению - в прошлом я работал с http: // www.бурнс.COM/DOCS/DATA PRODUCT ... фон?sfvrsn = 0 Энкодеры (DDS) и есть типы с задержанными и без задержанных. Поэтому мне пришлось изменить SW на основе энкодера, который я получил.. Все еще несколько в моей нежелательной коробке, я попробую..

max_sl
Чт 15 декабря 2016 г. 14:51
Привет,
Я использовал ваш «эскиз» с моим вращающимся энкодером, который назвал «Ротари-энкодер: LPD3806-600BM-G5-24C», и он отлично работает с первого взгляда.
Но после нескольких поворотов он начинает пропускать импульсы (приложение. 10 импульсов за один ход) Когда я удаляю часть кода для второго энкодера, он начинает работать лучше и пропускает только 5 импульсов за один ход.
Когда я использовал квадратурный энкодер в Arduino, все было хорошо. Не могли бы вы объяснить, как я могу получить достоверное количество импульсов на STM32Duino?
(У меня есть STM32F103C8T6)
Извините за плохой английский. Я из России)

Пито
Чт 15 декабря 2016 г., 19:02
Ваш энкодер дает .. 600 импульсов/революция для одной фазы.. - При использовании его в качестве ручного ввода вы можете легко сделать 1-2REV в секунду в секунду. То есть импульсы 600-1200/сек. Один фаза (и, вероятно, больше в режиме квадратурного режима). Подпрограмма использует Millis () для измерений - чтобы перегрузка SW может быть простым.. Попробуйте использовать micros () вместо этого. Также вы можете попытаться уменьшить #define ENCODER_RATE 1000 // in microseconds;

Rogerclark
Чт 15 декабря 2016 г., 19:23
Я переписаю, чтобы просто использовать прерывание на одном из выводов энкодера и прочитать значение другого.

Пока вы используете оборудование, дебайт, E.G Внутренний резистор подтягивания и небольшой конденсатор от выхода кодера до GND, это работало хорошо.

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

Пито
Чт 15 декабря 2016 г., 19:35
С 50 НФ и 22K вы получаете тау ~ 1-2 мсек, так что вы фактически ограничиваете «реальную частоту импульса» этим тау..
Типичный отскок микрос трансмитации берет <1 мс, поэтому значение RC кажется в порядке.
Я думаю, что обработка каждого импульса должна быть возможна с помощью 72 МГц руки :) при условии, что приоритет прерывания энкодера будет самым высоким..

Rogerclark
Чт 15 декабря 2016 г. 22:05
Пито

Я попробовал несколько конденсаторов, начинающих намного выше, но у меня не было ничего меньше 50 нФ в своей коробке с запчастями (ну, у меня было около 22pf и т. Д., Но они были слишком низкими)

Я согласен, что, возможно, 10NF будет в порядке.

max_sl
Пт 16 декабря 2016 г., 9:12
Спасибо за ответы.
Мое значение «скорость кодера» изменилось на 1. Потому что со значением «1000» он теряет очень много импульсов.
Я просто хочу получить прямое количество импульсов от STM32Duino, как в этой статье (http: // blablacode.ru/mikrokontrollery/531) Это не на английском языке, а код универсален. Я хочу получить результат, как это:

u16 cnt = tim3->CNT;
Задержка (100);

Но нет доступных описаний функций перевода STM32 в STM32Duino (в Интернете) :(

П.С.
Переход «миллисы» на «микрос» не может дать эффект для моего устройства.

Пито
Пт 16 декабря 2016 г. 9:52 утра
Во время просмотра гниля Enc Debouncing, это кажется наиболее обсуждаемым решением:
Rotary Encoder debounce.jpg
Ротари Энкодер дебютирует.JPG (22.62 киб) просмотрено 717 раз

max_sl
Пт 16 декабря 2016 г., 10:27 утра
Хорошо.
Я работаю с Arduino и STM32 в течение примерно 3 месяца, так что не могли бы вы объяснить эти строки:
if ( (gpio_read_bit(PIN_MAP[encoderpinA].gpio_device, PIN_MAP[encoderpinA].gpio_bit) ? HIGH : LOW) != A_set ) { A_set = !A_set; if ( A_set && !B_set ) { //if (millis() - encodertimer > 3) encoderpos += 1; //else //encoderpos += 5; } encodertimer = micros(); }

Регулировка для RTC Drift