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

 
 
 

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

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

10

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

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

Схема


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


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


Берём таблицу истинности (приведенную там же ):
Программный валкодер
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)
Местоположение в тайне.
О себе автор ничего не сообщил.
 

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

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

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


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


Контроллер системы водоснабжения «бак - насос» с ультразвуковым датчиком уровня.

Вперёд, товарищи! На дачу! В. Ленин И. Гаврилов Конечно, у меня уже есть уровнемер и большого...

Датагорский проект 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
Ваша статья очень помогла мне. Спасибо!

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

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