8-900-374-94-44
[email protected]
Slide Image
Меню

Алгоритм опроса энкодера: Работа с энкодером

Быстрый и точный опрос энкодеров

Здравствуйте, пару лет назад наткнулся на статью на хабре, об экспериментах с опросом импульсного датчика (энкодера) https://habr.com/ru/post/340448/   

У меня задача опрашивать несколько (до 3шт) энкодеров на большой скорости (до 8000имп/с). Пробовал на Меге, повторяемости не получил, думаю на больших скоростях, немного да и проскакивает, вот хотел попробовать с применяемым в статье BeagleBone Blue, но нигде не могу его найти, может кто подсказать есть ли более доступные аналогичные решения?

  • быстродействие
  • сигналы
  • прерывания
спросил Svorog (8 баллов) ● 1 ● 1 ● 3
теги изменил nkrkv

+5 голосов

 

Лучший ответ

Во первых: нужно правильно выбрать энкодер.

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

Во вторых: необходимомо проработать алгоритмы работы устройства. и убедиться , что выбранный МК способен обработать поступающие с такой частотой импульсы от 3-х энкодеров.

в третьих: по максимуму использовать аппаратные возможности МК для достижения наилучших результатов. Используйте прерывания в МК и иные возможности.

Или сделайте опрос энкодеров на отдельном МК , а результат отправляйте на другой МК , который будет управляеть индикацией и другими узлами схемы.

ответилsmart_pic (93 баллов) ● 1 ● 2 ● 4
выбран dartWaiter

1. Энкодеры промышленные.

2. Рассчитать тут по сложнее получается, потому что сначала один энкодер потом еще добавляешь вроде справляется, потом вешаешь еще пару функций и уже начинаются проскальзывания.
3. Прерывания используются.
4. Да наверное придется разносить на разные платы.

+5 голосов

Браво! Ведь FPGA (ПЛИС) — это как раз тот тип железа, для которого очень быстрый DSP — родная стихия.

Интересный модуль, спасибо за наводку!

+2 голосов

  • Софтварный способ: В статье упоминается софтварный способ опроса энкодера. Он работал при 64000 импульсах в секунду. Можно попробовать использовать его, но на платах с более высокой тактовой частотой, например arduino due (в ней также можно использовать хардварные прерывания на любом пине). 
  • Хардварный способ: На ардуино мега 6 пинов с прерываниями. Для ваших 3 энкодеров этого как раз хватает.  Возможно, у вас не получилось из-за одновременного срабатывания 2 прерываний.
  • Простой способ: Дешевле и проще купить 3 ардуино нано и скопировать код из статьи. Один МК контролирует один энкодер и отправляет данные на главную ардуину.
ответил gokase (917 баллов) ● 23 ● 74 ● 103

Использовал Мегу с 6 прерываниями, возможно действительно проблема в одновременных срабатываниях. Вариант с несколькими нано конечно гораздо  дешевле но хотелось бы какой то модуль с нормальными разъемами, типа как на BeagleBone Blue.

+1 голос

Вместо BeagleBone можно использовать любой одноплатник. Но лучше использовать МК с таймерами, которые аппаратно поддерживают квадратурный код (именно такой код выдают инкрементальные энкодеры). Такие есть, например, в МК STM32.

ответил parovoZZ (2.7 тыс. баллов) ● 7 ● 29 ● 55

+1 голос

Подключение энкодера к микроконтроллеру | RadioLaba.ru

             #include <p16f628a .INC>

             LIST        p=16F628A    

             __CONFIG    H’3F18′           ;конфигурация микроконтроллера

 

flag          equ         20h              ;перечисление регистров общего назначения

flag1         equ         21h              ;присвоение названий адресам регистров

shet          equ         22h              ;

shet1         equ         23h              ;

W_TEMP        equ         7Eh              ;

STATUS_TEMP   equ         7Fh              ;

 

 

#DEFINE       enc1        PORTB,4          ;присвоение названий линиям ввода-вывода

#DEFINE       enc2        PORTB,5          ;микроконтроллера

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h            ;начать выполнение программы с адреса 0000h

              goto        Start            ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма обработки прерываний

 

              org         0004h            ;начать выполнение подпрограммы с адреса 0004h

      

              movwf       W_TEMP           ;сохранение значений ключевых регистров

              swapf       STATUS,W         ;

              clrf        STATUS           ;

              movwf       STATUS_TEMP      ;

                  

              btfsc       enc1             ;опрос состояний выводов энкодера и сохранение

              bsf         flag,0           ;полученных значений в регистр flag

              btfss       enc1             ;сохранение значения вывода enc1 в 0-й бит

              bcf         flag,0           ;сохранение значения вывода enc2 в 1-й бит

              btfsc       enc2             ;

              bsf         flag,1           ;

              btfss       enc2             ;

              bcf         flag,1           ;

 

              btfss       flag,2           ;проверка предыдущего состояния выводов

              goto        vih              ;энкодера (2-й и 3-й биты регистра flag)

              btfss       flag,3           ;если оба значения не равны 1 переходим

              goto        vih              ;на метку vih, для выхода из обработчика

              btfss       flag1,0          ;проверка флага (0-й бит регистра flag1)

              goto        i2               ;инкремента/декремента регистра shet

              incf        shet1,F          ;если флаг не установлен-переходим (метка i2)

              movlw       . 3               ;на проверку факта поворота ручки энкодера

              xorwf       shet1,W          ;при установленном флаге инкрементируем

              btfss       STATUS,Z         ;регистр shet1, проверяем на равенство

              goto        vih              ;числу 3, если не равно-переходим на метку

              bcf         flag1,0          ;vih, для выхода из обработчика

              clrf        shet1            ;если shet1 равен 3-очищаем регистр и

                                           ;сбрасываем флаг инкремента/декремента

                                           ;регистра shet

            

i2            btfsc       flag,0           ;определение направления вращения ручки

              goto        i1               ;энкодера, если enc1=1 переходим на метку i1

              btfss       flag,1           ;если enc1=0 и enc2=1 произошел поворот

              goto        vih              ;в положительную сторону (условно)

                                           ;соответственно далее по ходу кода производим  

                                           ;инкремент регистра shet

                                           ;состояние enc1=0 и enc2=0 игнорируется-

                                           ;переходом на метку выхода vih

              

              incf        shet,F           ;инкемент регистра shet, максимальное значение

              movlw       . 0               ;ограничивается на уровне 255

              xorwf       shet,W           ;

              btfss       STATUS,Z         ;

              goto        vih2             ;

              movlw       .255             ;

              movwf       shet             ;

              goto        vih2             ;переход на метку vih2

              

i1            btfsc       flag,1           ;определение направления вращения ручки

              goto        vih              ;энкодера, если enc1=1 и enc2=0 произошел

                                           ;поворот в отрицательную сторону (условно)

                                           ;соответственно далее по ходу кода производим

                                           ;декремент регистра shet

                                           ;состояние enc1=1 и enc2=1 игнорируется-

                                           ;переходом на метку выхода vih

 

              decf        shet,F           ;декремент регистра shet, минимальное значение

              movlw       . 255             ;ограничивается на уровне 0

              xorwf       shet,W           ;

              btfss       STATUS,Z         ;

              goto        vih2             ;

              clrf        shet             ;

 

vih2          bsf         flag1,0          ;установка флага инкремента/декремента регистра shet

              bsf         flag1,1          ;установка флага регистрации поворота энкодера

                                           ;для дальнейшего опроса в основной программе

vih           rlf         flag,F           ;сдвиг содержимого регистра flag

              rlf         flag,F           ;влево на 2 бита

 

              bcf         INTCON,T0IF      ;сброс флага прерывания по переполнению TMR0

              movlw       .15              ;запись числа 15 в регистр таймера TMR0

              movwf       TMR0             ;равнозначно временной задержке примерно 1мс

                                                                                    

              swapf       STATUS_TEMP,W    ;восстановление содержимого ключевых регистров

              movwf       STATUS           ;

              swapf       W_TEMP,F         ;

              swapf       W_TEMP,W         ;

                                           ;

              retfie                       ;выход из подпрограммы прерывания

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                

            

Start         movlw       b’00000000′      ;запись нулей в выходные защелки порта B

              movwf       PORTB

 

              movlw       b’00000111′      ;выключение компараторов

              movwf       CMCON

 

              bsf         STATUS,RP0       ;настройка линий ввода\вывода порта B

              movlw       b’00110111′          

              movwf       TRISB

            

                                           ;запись двоичного числа 11010001 в регистр

              movlw       b’11010001′      ;OPTION_REG, тем самым устанавливаем внутренний

              movwf       OPTION_REG       ;источник тактового сигнала для TMR0

              bcf         STATUS,RP0       ;включаем предделитель перед TMR0

                                           ;устанавливаем коэффициент предделителя 1:4

 

              clrf        shet             ;очистка дополнительных регистров

              clrf        shet1            ;

              clrf        flag1            ;

  

              clrf        TMR0             ;очистка регистра таймера TMR0

              bcf         INTCON,T0IF      ;сброс флага прерывания по переполнению TMR0

              bsf         INTCON,T0IE      ;разрешение прерываний по переполнению TMR0

              bsf         INTCON,GIE       ;глобальное разрешение прерываний

      

a1            btfss       flag1,1          ;опрос флага регистрации поворота энкодера

              goto        a1               ;флаг регистрации равен нулю: переход на метку a1

              bcf         flag1,1          ;флаг равен единице: сброс флага регистрации

              movf        shet,W           ;вывод содержимого регистра shet на цифровое

              call        vivod            ;табло

              goto        a1

 

              . …………….            ;подпрограммы вывода содержимого    

              ……………..            ;регистра shet на семисегментные индикаторы

              ……………..            ;

 

              end                          ;конец всей программы

                                           ;</p16f628a>

робототехника — как посчитать сигнал энкодера 2-х колес?

спросил

Изменено 12 лет назад

Просмотрено 5к раз

\$\начало группы\$

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

Мне нужно иметь возможность получить текущее количество приращений от атмеги.

Я нашел микросхему типа LM628/629, которая отлично справится со своей задачей, даже слишком, потому что стоит ~50$.

Знаете ли вы специальную микросхему, которая имеет только функции счета (в обоих направлениях) для колесного энкодера, или можно сделать простую микросхему с помощью Attiny?

  • робототехника
  • колесо
  • энкодер
  • двигатель

\$\конечная группа\$

\$\начало группы\$

«Знаете ли вы специальную микросхему, которая имеет только функции счета (в обоих направлениях)» ?

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

Эти выходы могут быть подключены к входам «направление» и «часы» любого прямого/обратного счетчика, такого как, например, CD4029., CD4516, CD40193, 74HC193 и т.д.

«можно ли сделать простой с аттини» ?

Да, вы можете сделать простой квадратурный энкодер с помощью ATtiny. Несколько советов по подключению квадратурного энкодера к чипу Atmel и его декодированию в программном обеспечении можно найти по адресу:

  • Страница робототехники Алекса Брауна: Использование энкодеров
  • Arduino Playground wiki: Чтение поворотных энкодеров
  • Блог Keith’s Electronics Blog: Калькулятор светодиодов с поворотным квадратурным энкодером

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

\$\конечная группа\$

\$\начало группы\$

Колесные энкодеры очень просты в использовании для систем счисления пути. Если у вас есть только колесо с прорезями и два детектора, это будет квадратурный энкодер; вы называете один из сигналов вашими часами, а другой — вашим направлением. Получите оба сигнала в свой микроконтроллер и либо настройте его так, чтобы он подсчитывал тактовые импульсы (т.е. алгоритм подсчета событий). Всякий раз, когда вы получаете тактовый импульс, проверьте линию направления. Это всегда будет «1» для одного направления и «0» для другого.

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

Имейте в виду, что системы счисления пути do дрейфуют со временем, и если у вас нет средств для сброса системы счисления пути, представление вашего робота о том, где он находится в космосе, будет становиться все более и более неточным.

\$\конечная группа\$

5

\$\начало группы\$

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

\$\конечная группа\$

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie

.

c — Управляйте значениями энкодера, чтобы понять направление самого энкодера (против или по часовой стрелке)

Задавать вопрос

спросил

6 лет, 11 месяцев назад

Изменено 4 года, 9 месяцев назад

Просмотрено 138 раз

Я сэмплирую энкодер, и этот сэмпл имеет значение между интервалом [30, 230]; Я должен использовать это значение, чтобы определить две переменные выходного счетчика (один счетчик увеличения и один счетчик уменьшения).

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

Пример:

Если энкодер находится на значении 220, и я перемещаю его очень быстро по часовой стрелке, мое следующее значение, например, 100, и это означает, что значение прошло через 30 (прокрутка): направление должно быть по часовой стрелке . Но программа считает, что я переместил энкодер с 230 на 100, и выдает мне движение против часовой стрелки .

Напоминаю, что я не могу увеличить скорость выборки, она постоянна.

Это в реальном времени.

  • c
  • встроенный
  • режим реального времени
  • выборка

9

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *