» » Программный валкодер

 
 
 
10

Программный валкодер

Разместил archinub 1 августа 2008. Просмотров: 23 770


Это не новость и не статья. Это просто развёрнутый комментарий к датагосркой статье "Что есть валкодер?"

Я попробую «на пальцах», без привязки к конкретной реализации, рассказать алгоритм программной обработки валкодера, т.е. когда всю аппаратную обвязку мы выбросили и диаграмму работы обрабатываем микроконтроллером (раз уж он всё равно есть — пусть работает).

Схема


От приведенной там схемы оставляем только:


Немного теории


Берём таблицу истинности (приведенную там же ):
Программный валкодер
T — шаг состояния;
VAL0 — состояние датчика №0
VAL1 — состояние датчика №1
Заметим, что эта таблица истинности описывает изменения состояний датчиков при движении диска на один зуб только в одну сторону, в реальности требуется ещё одна таблица, описывающая обратное движение. Но её можно не рисовать, просто прочесть уже имеющуюся справа-налево (от состояния 5 к состоянию 1), главное не запутаться.

Приводим таблицу истинности к линейному виду (делаем проекцию двухмерного объекта на линию), получаем:

T — шаг состояния;
VAL — номер датчика (№0 или №1)
data — состояния датчика, или собственно таблица истинности. Поскольку движение закольцовано, два нуля в начале и конце диаграммы смыкаются и одну пару из них отбрасываем. Нужный нам байт выделен жёлтым.
byte — пронумеруем биты в байте, просто что бы не запутаться.

Не забудем таблицу и для обратного движения:


Кстати, в этом месте уже можно догадаться, что будет дальше.

В программе нам потребуется переменная (один байт) для хранения текущего состояния датчиков и две константы для проверки исполнения таблицы истинности:
static char diagramma;
const char diag_plus = 0b00011110;
const char diag_minus = 0b00101101;

Реализовать алгоритм можно как обработку прерывания от таймера или в общем цикле программы (если он не слишком длинный).

Теперь собственно алгоритм:


1. При входе в подпрограмму обработки валкодера первым шагом сравниваем состояние датчика VAL0 с битом diagramma.0 и датчика VAL1 с битом diagramma.1 если хоть один не совпал, то тогда идём дальше, иначе выход из прерывания (или в основной цикл программы), здесь больше ничего не делаем. Таким образом нам не страшны зависания диска в промежуточных состояниях.

2. Сдвигаем байт diagramma на два разряда в сторону старшего разряда.

3. Присваиваем двум младшим разрядам diagramma текущие значения соответствующих датчиков.

4. Сравниваем поочерёдно diagramma с константами diag_plus и diag_minus с какой совпала, на обработку того события уходим, если ни с одной не совпала — значит выход (диаграмма ещё не завершена). Таким образом нам не страшны никакие колебания диска в промежуточных состояниях — мы считаем только полные циклы прохождения зубцов перед датчиком.

Вопрос быстродействия


Если для регуляторов громкости и тембра пропустить несколько зубцов диска не смертельно, то при реализации валкодером, например, счётчика ленты магнитофона, это уже критически важно и, чтобы не было пропусков в счете, потребуется считать ограничение по минимальной частоте вызова прерывания для обработки датчика (или максимальной длительности главного цикла программы, если делать без прерываний).
Но этот вопрос слишком зависит от конкретной реализации и здесь рассматривать не будем.
Кстати при реализации алгоритма на ассемблере он занимает считанные байты и вопрос быстродействия скорее всего не возникнет.

В общем всё заключается в том, что кому проще: распаять несколько деталей или дописать несколько строк.
Сергей (archinub)
Местоположение в тайне.
Профиль archinub
О себе автор ничего не сообщил.
 

Понравилось? Палец вверх!

  • всего лайков: 11

Поделись с друзьями!

Связанные материалы:


Схема на Датагоре. Новая статья Контроллер системы водоснабжения «бак - насос» с ультразвуковым датчиком уровня. Датагорский бакомер in action!... Вперёд, товарищи! На дачу! В. Ленин И. Гаврилов Конечно, у меня уже есть уровнемер и большого...
Схема на Датагоре. Новая статья Датагорский проект 10 "Water Tank Controller". Модификация блока управления для полива... Привет, друзья! Последний раз я имел дело с микроконтроллерами лет 20 назад, во время ПК типа...
Схема на Датагоре. Новая статья Кнопочный выключатель для УНЧ на JK-триггере CD4027... Обычно использовать маленький красивый выключатель для подачи питания на силовой трансформатор нет...
Схема на Датагоре. Новая статья Ремонт и переделка проигрывателя винила SONY- PS-242... Попал мне в руки вот такой агрегат. Настоящий японец. Состояние внешне красивое, но нерабочее....
Схема на Датагоре. Новая статья Несколько функций для програмной реализации протокола I2C на AVR... Добрый день, дорогие друзья! Решил поделиться с вами несколькими функция для работы по протоколу...
Схема на Датагоре. Новая статья Термометр + термостат на микроконтроллере PIC16F876 и датчиках DS18B20... История этого термометра началась в далёком 2011 году. Мне понадобилось в подвале частного дома, в...
Схема на Датагоре. Новая статья Немного про шину 1-Wire и цифровой термометр DS18b20... Фотка от www.150cc.ru Здравствуйте, друзья. Хочу предложить вашему вниманию несколько простых...
Схема на Датагоре. Новая статья Програмирование в AVR Studio 5 с самого начала. Часть 7... Поговорим о прерываниях. Слово прерывание говорит само за себя, происходит остановка какого —...
Схема на Датагоре. Новая статья SHT10 + Atmega8: Микроконтроллерный модуль управления вентилятором санузла, v2... Доброго дня, сограждане! Представляю вторую версию блока управления вентилятором для ванной,...
Схема на Датагоре. Новая статья Вариант подключения датчиков и темброблок для гитары Gibson Les Paul и подобных... Доброго времени суток, коллеги! Это моя первая статья, поэтому прошу строго не судить. Разумная...
Схема на Датагоре. Новая статья Датчик угла поворота. Сельсин-датчик и приёмник на микроконтроллере.... Схема сельсин-датчика и программа микроконтроллера практически полностью взяты из журнала Радио №4...
Схема на Датагоре. Новая статья Что есть валкодер...... Приветик! Ща я вам как расскажу, как устроен валкодер. Да проще некуда. В самом простом...
<
  • Прохожий
4 августа 2008 22:21

/ Gringo

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
Хмм, а эту схемку можно применить к DS1802 (цифровому отенциометру), заместо кнопочек, для регулировки громкости?

<
  • Гражданин
19 августа 2008 01:21

Александр / alx32

  • С нами с 26.06.2008
  • Ушёл в реал Пользователь offline
  • 35 комментариев
  • 8 публикаций
 
  • 0
К стати, микроконтроллеры ATmega позволяют генерировать прерывание по положительному или отрицательному фронту импульса, это свойство можно использовать для валкодера, в дальнейшем я расскажу как это можно сделать, пока думаю над статьёй, и проверяю на практике... bully

<
  • Кандидат
17 октября 2008 16:01

Андрей / andrdoy

  • С нами с 22.07.2008
  • Ушёл в реал Пользователь offline
  • 9 комментариев
  • 0 публикаций
 
  • 0
Все это очень хорошо и идея с алгоритмом понравилась
только это все для идеального валкодера

возьмите механический типа PEC12 (PEC16)
там еще и дребезг контактов присутствует а вот с ним бороться больше времени уходит
я намучился в свое время

валкодер на двигателе например, работал изумительно сразу (там дребезга не было)
подключил механику - такое началось winked

<
  • Кандидат
23 ноября 2008 18:00

Андрей / andrdoy

  • С нами с 22.07.2008
  • Ушёл в реал Пользователь offline
  • 9 комментариев
  • 0 публикаций
 
  • 0
проверил алгоритм на реальном устройстве

как ни странно даже с механическими валкодерами (PEC16 и т.п.)
работает СУПЕР!!!!!!
пропусков почти на 90% нет как при медленном так и при быстром вращении

опрашивал по таймеру с периодом 5 мс

автору респект - молодец!

<
  • Гражданин
24 ноября 2008 15:27

Сергей / archinub

  • С нами с 27.11.2011
  • Ушёл в реал Пользователь offline
  • 21 комментарий
  • 2 публикации
 
  • 0
andrdoy, пропусков почти на 90% нет как при медленном так и при быстром вращении, а с чем сравнивалось?
Вообще над этой штукой злобные надёжники весьма издевались и тоже удивились, что на дребезг оно не реагирует (при соблюдении максимальной частоты вращения).
В оригинале, когда я это разрабатывал в 1984 году, аппаратной частью были два геркона и магнит и дребезг был главной проблемой.

<
  • Кандидат
25 ноября 2008 11:12

Андрей / andrdoy

  • С нами с 22.07.2008
  • Ушёл в реал Пользователь offline
  • 9 комментариев
  • 0 публикаций
 
  • 0
сравнивалось со многими алгоритмами которые я встречал в сети
и написанными лично

валкодер на шаговике и на моем алгоритме работает отлично - но там и дребезга нет

а этот я просто пока тупо алгоритм словами перенес на Си и поробывал (не оптимизировал)
и на удевление работает действительно здорово
дребезг не мешает ему

<
  • Кандидат
2 декабря 2008 23:17

Андрей / andrdoy

  • С нами с 22.07.2008
  • Ушёл в реал Пользователь offline
  • 9 комментариев
  • 0 публикаций
 
  • 0
по просьбе archinub


Писал на WinAVR.
Кто оптимизирует - выложите здесь, Все скажут Вам спасибо (не всегда мы работаем за деньги).

А работает все действительно замечательно, автору еще раз большой поклон и уважение.

<
  • Гражданин
12 декабря 2008 22:33

Сергей / archinub

  • С нами с 27.11.2011
  • Ушёл в реал Пользователь offline
  • 21 комментарий
  • 2 публикации
 
  • 0
andrdoy,что-то я с этой программой не разобрался, слишком сложно.
Вот попробовал переписать, как изначально хотел:

<
  • Прохожий
6 июля 2009 23:48

/ bacek

  • С нами с --
  • 0 комментариев
  • 0 публикаций
 
  • 0
сделал вывод диаграммы валкодера на дисплей, в диагностических целях.
результаты повергли меня в шок. разъясните мне суть проблемы.
во-первых, состояние валкодера в режиме ожидания не 00, а 11.
во-вторых, в результате одного "клика" валкодера не хватает одного состояния!
вот мои диаграммы полного "клика" в одну и в другую сторону:
0b11010011 плюс
0b11000111 минус
в чем дело? =)
если представить в виде двумерной таблицы, то мой PEC16 "поёт" следующее:
-----------------
| 1 | 0 | 0 | 1 |
-----------------
| 1 | 1 | 0 | 1 |
ну и разумеется в обратную сторону.

вот мой код под cvavr. комментарии восстановили только сегодня, поэтому писал сам - всё строго по словесной инструкции из данной статьи:

Итог:
Валкодер работает, но коряво: много проскоков, а при быстром вращении проскакивает 95-98% кликов. То есть чтобы равномерно менять величину, приходится ловить оптимальную скорость.

<
  • Гражданин
26 марта 2014 01:14

Алексей / teXnik

  • С нами с 1.11.2009
  • Ушёл в реал Пользователь offline
  • 33 комментария
  • 5 публикаций
 
  • +1
Ваша статья очень помогла мне. Спасибо!

под спойлером мой вариант данного алгоритма - еще немного упрощен и убраны вспомогательные переменные

Информация
Вы не можете участвовать в комментировании. Вероятные причины:
— Администратор остановил комментирование этой статьи.
— Вы не авторизовались на сайте. Войдите с паролем.
— Вы не зарегистрированы у нас. Зарегистрируйтесь.
— Вы зарегистрированы, но имеете низкий уровень доступа. Получите полный доступ.