Мадиас
Пн 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
Я думаю, что должен быть еще один { ... } На этой строке: <<#######
...
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.
Но мне нравится метод внешнего аналога.
КСТАТИ.
Я попробовал вам код, и он работал нормально, но я обнаружил, что мне нужно использовать аппаратный таймер для другой цели, поэтому я обнаружил, что он не работает слишком плохо, если вы просто включите внутренний резистор подтягивания и используете конденсатор 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)
Извините за плохой английский. Я из России)
Я использовал ваш «эскиз» с моим вращающимся энкодером, который назвал «Ротари-энкодер: 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.
Но даже тогда я мог бы сделать это свободным шагом, поэтому один подход к тому, чтобы скрыть это, состоит в том, чтобы увеличить количество, которое вы изменяете переменную позиции, если вы обнаружите, что энкодер вращается быстро.
Пока вы используете оборудование, дебайт, E.G Внутренний резистор подтягивания и небольшой конденсатор от выхода кодера до GND, это работало хорошо.
Но если вы быстро вращаетесь, это все равно пропускает шаги из -за времени дебатации.
Я настроил значение конденсатора для моего конкретного энкодера, так как он, казалось, нуждался только в 50NF с внутренним подтяжкой 22K.
Но даже тогда я мог бы сделать это свободным шагом, поэтому один подход к тому, чтобы скрыть это, состоит в том, чтобы увеличить количество, которое вы изменяете переменную позиции, если вы обнаружите, что энкодер вращается быстро.
Пито
Чт 15 декабря 2016 г., 19:35
С 50 НФ и 22K вы получаете тау ~ 1-2 мсек, так что вы фактически ограничиваете «реальную частоту импульса» этим тау..
Типичный отскок микрос трансмитации берет <1 мс, поэтому значение RC кажется в порядке.
Я думаю, что обработка каждого импульса должна быть возможна с помощью 72 МГц руки при условии, что приоритет прерывания энкодера будет самым высоким..
Типичный отскок микрос трансмитации берет <1 мс, поэтому значение RC кажется в порядке.
Я думаю, что обработка каждого импульса должна быть возможна с помощью 72 МГц руки при условии, что приоритет прерывания энкодера будет самым высоким..
Rogerclark
Чт 15 декабря 2016 г. 22:05
Пито
Я попробовал несколько конденсаторов, начинающих намного выше, но у меня не было ничего меньше 50 нФ в своей коробке с запчастями (ну, у меня было около 22pf и т. Д., Но они были слишком низкими)
Я согласен, что, возможно, 10NF будет в порядке.
Я попробовал несколько конденсаторов, начинающих намного выше, но у меня не было ничего меньше 50 нФ в своей коробке с запчастями (ну, у меня было около 22pf и т. Д., Но они были слишком низкими)
Я согласен, что, возможно, 10NF будет в порядке.
max_sl
Пт 16 декабря 2016 г., 9:12
Спасибо за ответы.
Мое значение «скорость кодера» изменилось на 1. Потому что со значением «1000» он теряет очень много импульсов.
Я просто хочу получить прямое количество импульсов от STM32Duino, как в этой статье (http: // blablacode.ru/mikrokontrollery/531) Это не на английском языке, а код универсален. Я хочу получить результат, как это:
u16 cnt = tim3->CNT;
Задержка (100);
Но нет доступных описаний функций перевода STM32 в STM32Duino (в Интернете)
П.С.
Переход «миллисы» на «микрос» не может дать эффект для моего устройства.
Мое значение «скорость кодера» изменилось на 1. Потому что со значением «1000» он теряет очень много импульсов.
Я просто хочу получить прямое количество импульсов от STM32Duino, как в этой статье (http: // blablacode.ru/mikrokontrollery/531) Это не на английском языке, а код универсален. Я хочу получить результат, как это:
u16 cnt = tim3->CNT;
Задержка (100);
Но нет доступных описаний функций перевода STM32 в STM32Duino (в Интернете)
П.С.
Переход «миллисы» на «микрос» не может дать эффект для моего устройства.
Пито
Пт 16 декабря 2016 г. 9:52 утра
Во время просмотра гниля Enc Debouncing, это кажется наиболее обсуждаемым решением:
- Ротари Энкодер дебютирует.JPG (22.62 киб) просмотрено 717 раз
max_sl
Пт 16 декабря 2016 г., 10:27 утра
Хорошо.
Я работаю с Arduino и STM32 в течение примерно 3 месяца, так что не могли бы вы объяснить эти строки:
Я работаю с 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();
}