LINUX.ORG.RU
решено ФорумTalks

энкодер плохо работает

 , , , ,


0

1

Вот что интересно. Раньше использовал atmega328 и у меня энкодер работал без всякого debouncing. Работало тупо: смотрел на состояние второго пина при falling edge на первом (энкодер коротит pullUp пины на землю). Ну, всё как у всех.

А вот stm32F411re с тем же энкодером тупо не работает. Значения скачут очень рандомно (т.е. повернул ручку на одно деление, а в программе счётчик увеличивается сразу на 2-30). Причём, в лучшем случае удаётся читать показания при вращении в одну сторону, но не другую.

С чем может быть связано такое различие? Я вот подумал что питание и наводки вряд ли могут оказать какое-то влияение. Может, разница в частоте сказывается? Атмега на 8Mhz работала, а эта плата на 100MHz.

★★★★★

Последнее исправление: true_admin (всего исправлений: 1)
Ответ на: комментарий от prischeyadro

Так, разобрался. Всё работает, спасибо большое.

Выявленные новые проблемы:

а) одна из новых ног МК была не пригодна для внешних прерываний (либо я плохо прочитал мануал).

б) оказалось что выводы нового энкодера не совпадают со старым. Вот уж не ожидал подставы. Китайцы соединили крайние ноги вместе, но зачем?? (http://www.ebay.co.uk/itm/181598483028?_trksid=p2059210.m2749.l2649&ssPag...

К сожалению, провозился долго т.к. долго не мог въехать как твой алгоритм работает и не понимал как отлаживать. Потом дошло что состояния меняются либо 0-1-2-3-0, либо 0-3-2-1-0 (по крайней мере в текущем коде, я его немного разворотил пока отлаживал). Очень помог вывод состояния на экран на ряду со счётчиком. В конце руками закорачивал пины и понял что энкодер у меня работает совсем не так как я думаю.

Zubok, тебе тоже большое спасибо. Перечитывая свои посты я понимаю что я тупил :(.

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

а) одна из новых ног МК была не пригодна для внешних прерываний (либо я плохо прочитал мануал).

Скорее это либо, но с оговоркой (оговорка после цитаты). Стр. 193 даташита.

7.3.8 External interrupt/wakeup lines

All ports have external interrupt capability. To use external interrupt lines, the port must be configured in input mode, refer to Section 10.2: External interrupt/event controller (EXTI) and Section 10.2.3: Wakeup event management.

Оговорка. mbed как низлежащая платформа вполне может запретить использовать какие-то ноги для external interrupt, так как, может, использует их для каких-то определенных вещей. Но тогда это должно быть явно описано в документации mbed, на какие ноги это распространяется. Диаграмма на стр. 258 даташита явно показывает 16 линий прерывания, на которые мультиплексируются порты от PA до PI. Твои D6 и D7 будут подключены на EXTI6 и EXTI7 соответственно.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от true_admin

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

А откуда ты знаешь, что там даташит вообще от твоего? На твоем модель написана? А то их знаешь сколько безымянных.

Zubok ★★★★★
()
Ответ на: комментарий от true_admin

Китайцы соединили крайние ноги вместе, но зачем??

Какие именно? A и B по чертежу? Или D и E? А то как-то я не очень понимаю, что же получится, если две ноги соединены. Что-то непонятное говоришь.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

А откуда ты знаешь, что там даташит вообще от твоего?

Название модели не фигурирует ни в «даташите» ни на энкодере. Я ошибся на счёт того что А и C замкнуты (не распарсил чёртёж на ночь глядя). Там просто средний вывод (тот что на землю кидают) оказался крайним справа.

По поводу ног, я похоже, разобрался: «IMPORTANT: You can not use two pins on one line simultaneously». Я использовал ноги A3 и A5. Так вот, на самом деле их нормальные названия PB_0 и PC_0 и они используют interrupt line0. По крайней мере я так понимаю инфу на http://stm32f4-discovery.com/2014/08/stm32f4-external-interrupts-tutorial/ .

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Название модели не фигурирует ни в «даташите» ни на энкодере. Я ошибся на счёт того что А и C замкнуты (не распарсил чёртёж на ночь глядя). Там просто средний вывод (тот что на землю кидают) оказался крайним справа.

Даташит переписан тем, кто выставил их на продажу. Фирма, из которого взят даташит, вот: http://www.ljv.cn/en/ProductClass-29-1.html . Производитель и даташиты на картинке их. Только понять, в какой тыкать у китайцев трудно. В каждом энкодере в отдельном файле справочные данные и отдельно - чертеж с рапиновкой. См. боковое меню, ищи свой. Один экодер может иметь разные исполнения shaft и размеры - смотри чертежи. Но вроде там одна и та же распиновка. На самом энкодере никаких знаков опознавательных? Ты его на ebay и купил?

Так вот, на самом деле их нормальные названия PB_0 и PC_0 и они используют interrupt line0.

Все верно. Они на EXTI0 заведены, а мультиплексор может выбрать только одну. Также в даташите диаграмма этот момент показывает на стр. 258.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от true_admin

http://www.ljv.cn/en/Product-319.html

Совпадает. И на ebay A - B - C. Но вроде все правильно. Канал A, Канал B и общий. C на землю и кидают. Вроде все правильно написано. Это ты не разобрался с нумерацией просто.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 3)
Ответ на: комментарий от Zubok

В даташите даже временные диаграммы даны A - C и B - C. Очевидно же, что C - общий.

Zubok ★★★★★
()
Ответ на: комментарий от true_admin

И еще по ходу пьесы. Ток, проходящий через ножки каналов, по даташиту должен быть не выше 5мА. Если ты случайно сделаешь программную ошибку и сконфигурируешь входы как выходы и подашь HIGH на них, то через энкодер ты их просадишь на землю (а энкодер - это просто контакт) и у тебя ток большой попрет через контакты энкодера, а это разогрев. Да и можно порты пожечь - ток не ограничен ничем. Разумно ограничить ток, подключив A и B через резисторы, а подтягивать к питанию не внутренним pull-up, а внешним, то есть до резисторов (иначе делитель напряжения образуется). Еще можно конденсаторы на землю от A и B. R = 10кОм будет ок.

                       Encoder

Vcc   --[   R   ]--+             +--[   R   ]--   Vcc
                   |  A   C   B  |
MCU_A --[   R   ]--+--o   o   o--+--[   R   ]--   MCU_B
                          |
                         ___
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 4)
Ответ на: комментарий от Zubok

Ну а если нет риска, что сконфигурируешь не так, то внутренний pull-up без навеса вполне годится. Там достаточно большое внутри сопротивление, меньше миллиампера через энкодер потечет.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Да, софтварные ошибки меня больше всего пугают. Особенно когда перевешиваешь энкод с одной ноги на другую не дай бог повернуть ручку когда прошивка ещё старая или же когда прошивка новая, а энкодер ещё не перевесил. Но мне главное чтобы порт целиком не сгорел, а ног пока хватает :).

Чорт, я вместо reference manual читал datasheet :(.

Спасибо большое за твоё время, я много понял в этой жизни :)

true_admin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

Да, софтварные ошибки меня больше всего пугают. Особенно когда перевешиваешь энкод с одной ноги на другую не дай бог повернуть ручку когда прошивка ещё старая или же когда прошивка новая, а энкодер ещё не перевесил. Но мне главное чтобы порт целиком не сгорел, а ног пока хватает :).

Ну, дело не только в защите. Внутренние pull-up не очень нормированы и довольно высоки. Если ты захочешь повесить конденсатор на вход для подавления дребезга, то характеристика low-pass фильтра не поймешь какая. Подсоединил к одному контроллеру - одно, к другому-другое. Поэтому есть смысл отказаться от внутренних pull-up и сделать схемку с известными сопротивлениями, как выше, но только еще небольшие кондерчики повесить для подавления дребезга. Тогда можно прикинуть частоту отсечки такого фильтра.

http://www.bourns.com/data/global/pdfs/Bourns_enc_sgnl_cond_technote.pdf

https://ccrma.stanford.edu/wiki/More_Sensors

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

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.