Здравствуйте, пару лет назад наткнулся на статью на хабре, об экспериментах с опросом импульсного датчика (энкодера) https://habr.com/ru/post/340448/
У меня задача опрашивать несколько (до 3шт) энкодеров на большой скорости (до 8000имп/с). Пробовал на Меге, повторяемости не получил, думаю на больших скоростях, немного да и проскакивает, вот хотел попробовать с применяемым в статье BeagleBone Blue, но нигде не могу его найти, может кто подсказать есть ли более доступные аналогичные решения?
+5 голосов
Лучший ответ
Во первых: нужно правильно выбрать энкодер.
Во вторых: необходимомо проработать алгоритмы работы устройства. и убедиться , что выбранный МК способен обработать поступающие с такой частотой импульсы от 3-х энкодеров.
в третьих: по максимуму использовать аппаратные возможности МК для достижения наилучших результатов. Используйте прерывания в МК и иные возможности.
Или сделайте опрос энкодеров на отдельном МК , а результат отправляйте на другой МК , который будет управляеть индикацией и другими узлами схемы.
ответилsmart_pic
(93 баллов)
● 1 ● 2 ● 4
выбран dartWaiter
1. Энкодеры промышленные.
+5 голосов
Браво! Ведь FPGA (ПЛИС) — это как раз тот тип железа, для которого очень быстрый DSP — родная стихия.
Интересный модуль, спасибо за наводку!
+2 голосов
Использовал Мегу с 6 прерываниями, возможно действительно проблема в одновременных срабатываниях. Вариант с несколькими нано конечно гораздо дешевле но хотелось бы какой то модуль с нормальными разъемами, типа как на BeagleBone Blue.
+1 голос
Вместо BeagleBone можно использовать любой одноплатник. Но лучше использовать МК с таймерами, которые аппаратно поддерживают квадратурный код (именно такой код выдают инкрементальные энкодеры). Такие есть, например, в МК STM32.
ответил parovoZZ (2.7 тыс. баллов) ● 7 ● 29 ● 55+1 голос
#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>
спросил
Изменено 12 лет назад
Просмотрено 5к раз
\$\начало группы\$
Я ищу простое решение, чтобы сохранить позицию робота. Он имеет два двигателя постоянного тока и один колесный энкодер для каждого. Кодер инкрементного типа.
Мне нужно иметь возможность получить текущее количество приращений от атмеги.
Я нашел микросхему типа LM628/629, которая отлично справится со своей задачей, даже слишком, потому что стоит ~50$.
Знаете ли вы специальную микросхему, которая имеет только функции счета (в обоих направлениях) для колесного энкодера, или можно сделать простую микросхему с помощью Attiny?
\$\конечная группа\$
\$\начало группы\$
«Знаете ли вы специальную микросхему, которая имеет только функции счета (в обоих направлениях)» ?
Возможно, вы удивитесь, узнав, что для декодирования поворотного энкодера достаточно нескольких простых, дешевых, универсальных логических микросхем — для этого не требуется какой-то специальный чип, специально предназначенный для поворотных декодеров. Страница генератора кодового колеса имеет несколько относительно простых схем, которые декодируют 2 вращающихся квадратурных выхода в выходы «направление» и «счет».
Эти выходы могут быть подключены к входам «направление» и «часы» любого прямого/обратного счетчика, такого как, например, CD4029., CD4516, CD40193, 74HC193 и т.д.«можно ли сделать простой с аттини» ?
Да, вы можете сделать простой квадратурный энкодер с помощью ATtiny. Несколько советов по подключению квадратурного энкодера к чипу Atmel и его декодированию в программном обеспечении можно найти по адресу:
Если у вас относительно мало импульсов в секунду, вы можете запустить 2 сигнала от каждого энкодера непосредственно в ваш основной ATmega и использовать описанные выше методы, чтобы сделать все это программно, без какого-либо внешнего аппаратного преобразования.
\$\конечная группа\$
\$\начало группы\$
Колесные энкодеры очень просты в использовании для систем счисления пути. Если у вас есть только колесо с прорезями и два детектора, это будет квадратурный энкодер; вы называете один из сигналов вашими часами, а другой — вашим направлением. Получите оба сигнала в свой микроконтроллер и либо настройте его так, чтобы он подсчитывал тактовые импульсы (т.е. алгоритм подсчета событий). Всякий раз, когда вы получаете тактовый импульс, проверьте линию направления. Это всегда будет «1» для одного направления и «0» для другого.
Более причудливые (более дорогие) энкодеры обычно представляют собой энкодеры с кодом Грея и менее подходят для точного счисления, хотя они обеспечивают более точное счисление координат из-за их более высокой точности. Вы можете передать вывод одного из них в свой микроконтроллер и иметь прерывание или таймер, который считывает положение колес и определяет, как далеко и в каком направлении движется робот. Это более сложное решение.
Имейте в виду, что системы счисления пути do дрейфуют со временем, и если у вас нет средств для сброса системы счисления пути, представление вашего робота о том, где он находится в космосе, будет становиться все более и более неточным.
\$\конечная группа\$
\$\начало группы\$
Один из подходов может заключаться в использовании программируемого логического устройства в качестве счетчика пульсаций с кодом Грея с достаточным количеством ступеней, чтобы вы могли просто опрашивать значение с удобной скоростью и не терять счет. Обратите внимание, что одно из преимуществ счетчика пульсаций с кодом Грея по сравнению с некоторыми другими подходами состоит в том, что нет опасности того, что зашумленные входы вызовут сбои в работе счетчика, при условии, что ни один вход не изменится, когда другой вход нестабилен.
\$\конечная группа\$
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Электронная почта
Требуется, но никогда не отображается
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
.Задавать вопрос
спросил
Изменено 4 года, 9 месяцев назад
Просмотрено 138 раз
Я сэмплирую энкодер, и этот сэмпл имеет значение между интервалом [30, 230]; Я должен использовать это значение, чтобы определить две переменные выходного счетчика (один счетчик увеличения и один счетчик уменьшения).
Проблема в том, что иногда при прокрутке, а это значит, что энкодер переходит с 230 на 30 или наоборот, выборка слишком медленная и я теряю направление движения (против или по часовой стрелке) и это приводит к неправильное поведение.
Пример:
Если энкодер находится на значении 220, и я перемещаю его очень быстро по часовой стрелке, мое следующее значение, например, 100, и это означает, что значение прошло через 30 (прокрутка): направление должно быть по часовой стрелке . Но программа считает, что я переместил энкодер с 230 на 100, и выдает мне движение против часовой стрелки .
Напоминаю, что я не могу увеличить скорость выборки, она постоянна.
Это в реальном времени.
9
Если вы не можете гарантировать, что энкодер не переместится более чем на половину диапазона за один период опроса, проблема не может быть решена. Если вы предполагаете, что он не будет двигаться так далеко, тогда это разрешимо — вы просто предполагаете, что движение между двумя событиями опроса было кратчайшее из двух возможных направлений.