Например TDA7294

Форум РадиоКот :: Просмотр темы - Программная обработка Энкодера на AVR
Форум РадиоКот
https://radiokot.ru/forum/

Программная обработка Энкодера на AVR
https://radiokot.ru/forum/viewtopic.php?f=57&t=77569
Страница 1 из 5

Автор:  Artos [ Вт сен 04, 2012 11:58:11 ]
Заголовок сообщения:  Программная обработка Энкодера на AVR

Добрый день уважаемые форумчане!

Стала предо мной задача обработки двух энкодеров, обработки фотоприемника для ДУ, постоянное обновление данных регистров 74HC595 5шт. включенных последовательно, и переодический (по таймеру) выброс данных в еепром типа 24Схх

SPI и I2C программный.

Планирую применить ATmega16 . Но у нее всего 2 прерывания INT0 and INT1. Не хватает еще одного прерывания для второго энкодера...
Как можно решить эту проблему? Чтоб система работала надежно без сбоев?

Посетила идея настроить таймер на прерывание по переполнению и в нем опрашивать входы энкодеров. Но не будет ли искажений сигналов при передаче данных по SPI и I2С ?

С ув. Артем

Автор:  ploop [ Вт сен 04, 2012 12:29:17 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Цитата:
Посетила идея настроить таймер на прерывание по переполнению и в нем опрашивать входы энкодеров.

Да, именно так.
Цитата:
о не будет ли искажений сигналов при передаче данных по SPI и I2С ?

Нет, они же работают аппаратно.

Автор:  Artos [ Вт сен 04, 2012 12:30:54 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Artos писал(а):

SPI и I2C программный.
.........

Но не будет ли искажений сигналов при передаче данных по SPI и I2С ?

С ув. Артем


Нет, интерфейсы программные...

Автор:  ploop [ Вт сен 04, 2012 12:34:46 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

А, вон оно что.
Тогда сложнее. Я бы советовал сделать опрос энкодеров в основном цикле, когда не работают прерывания. Частота там большая не нужна, говорят 500Гц достаточно. Да и если пропустить опрос - не страшно, всё равно не заметишь.
Сам, правда, не пробовал, энкодеры только приехали, на днях поковыряю, как с ними лучше обращаться.

Автор:  pyzhman [ Вт сен 04, 2012 12:51:01 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Artos писал(а):
Нет, интерфейсы программные...

Причина неиспользования аппаратных?

Автор:  Artos [ Вт сен 04, 2012 12:57:41 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Для легкой переносимости на другую платформу + не понятно как инициализировать аппаратные SPI и I2C и использовать.

Работаю в CVAVR

Думаю что в момент попадания в прерывание по таймеру можно прижимать SCL к земле. А при выходе освобождать.


А еще лучше "синхронизировать" работу дэвайса .

ловим энкодеры по таймеру .

если поймали > обрабатываем данные запрещаем прерывания и вываливаем на индикацию HC595

если нет > возвращаемся на начало.

По таймеру если было зафиксировано срабатывание энкодеров > сохраняем в еепром 24Схх
Вчера пробовал скорость работы программного I2C с памятью 24С08. В принципе скорость меня устраивает.

Еще: Что если применить 93Схх ? тогда не надо I2C городить?

Автор:  Artos [ Вт сен 04, 2012 13:06:48 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

А как обрабатывать дребезг контактов при использовании таймера?
Просто запрещать прерывания на "N" время если было зафиксировано срабатывание энкодера что и послужит антидребезгом?

Автор:  BOB51 [ Вт сен 04, 2012 13:29:33 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

а поставь аппаратный антидребезг на "рассыпухе" :)

Автор:  Artos [ Вт сен 04, 2012 13:33:51 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

На конденсаторе чтоль? :)

Автор:  BOB51 [ Вт сен 04, 2012 13:37:30 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

на триггерах
r-s, d и прочее 8)

Автор:  Artos [ Вт сен 04, 2012 13:45:12 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Зачем увеличивать габариты ПП и сложность схемы если есть МК ?
При сдаче в производство главная цель стоит "Максимально минимальные" габариты ПП . Поэтому отпадает такая идея :)

Автор:  ploop [ Вт сен 04, 2012 13:47:44 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Да дребезг программно нормально отсекается. Если сами не придумаете, вот алгоритм Леонида Ивановича, раскомментирован до нельзя...
Спойлер
Код:
//----------

//Модуль поддержки энкодера

//Энкодер подключается к портам ENC_F1 (фаза 1) и ENC_F2 (фаза 2).
//Для подавления дребезга используется анализ двух последовательных
//состояний. Это позволяет обойтись без временных задержек.
//Функция Encoder_Init() должна вызываться один раз в начале программы.
//Функция Encoder_Exe() должна вызываться в основном цикле.
//При повороте энкодера на шаг вправо или влево вызываются функции
//To_Do_Step_Up() и To_Do_Step_Dn() соответственно.

//----------

#include "Main.h"
#include "Encoder.h"

//---------- Константы: ----------

#define ENC_F1   (1 << PC0) //фаза энкодера F2
#define ENC_F2   (1 << PC1) //фаза энкодера F1

#define Pin_ENC_F1 (PINC & ENC_F1)
#define Pin_ENC_F2 (PINC & ENC_F2)

enum { State0, StateA, StateB, StateAB }; //состояния энкодера

//---------- Переменные: ----------

static char EncPrev;      //предыдущее состояние энкодера
static char EncPrevPrev;  //пред-предыдущее состояние энкодера

//---------- Инициализация энкодера: ----------

void Encoder_Init(void)
{
  DDRC  &= ~(ENC_F1 | ENC_F2); //настройка портов на ввод
  PORTC |= ENC_F1 | ENC_F2;    //включение подтягивающих резисторов
  EncPrev = State0;       //инициализация предыдущего состояния
  EncPrevPrev = State0;   //инициализация пред-предыдущего состояния
}

//---------- Обработка энкодера: ----------

void Encoder_Exe(void)
{
  char EncCur = 0;
  if(!Pin_ENC_F1) EncCur  = StateA; //опрос фазы 1 энкодера
  if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера
  if(EncCur != EncPrev)             //если состояние изменилось,
  {
    if(EncPrev == StateAB &&        //если предыдущее состояние StateAB
       EncCur != EncPrevPrev )      //и текущее и пред-предыдущее не равны,
    {
      if(EncCur == StateB)          //если текущее состояние StateB,
        To_Do_Step_Up();            //шаг вверх
      else                          //иначе
        To_Do_Step_Dn();            //шаг вниз
    }
    EncPrevPrev = EncPrev;          //сохранение пред-предыдущего состояния
    EncPrev = EncCur;               //сохранение предыдущего состояния
  }
}

//----------

Автор:  Artos [ Вт сен 04, 2012 14:03:52 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Интересный код! Спасибо Вам! Надо попробовать его.

Но как то сложно все реализовано... Куча переменных, зачем?
Я год назад проводил тесты с энкодером.
И написал кусок кода (сейчас попробую по памяти написать)

Код:

if (enc==0 && flags_enc==0)
{
   if (enc1==1 && flags_enc1==0)
   {
             comand_left(); // команда влево

        flags_enc = flags_enc1 = 1;
    }

}

if (enc1==0 && flags_enc_==0)
{
   if (enc==1 && flags_enc1_==0)
   {
             comand_right (); // команда вправо

        flags_enc_ = flags_enc1_ = 1;
    }

}

if ((enc1==0 && enc==0) || (enc1 && enc))
{
   flags_enc_ = flags_enc1_ =  flags_enc = flags_enc1 = 0;  // собственно сбрасываем флаги
}

delay_func(); // отсечка дребезга


Код реально работал в основном цикле программы. в качестве проверки выводил в порт меги8 "бегущий лог.1" подключив светодиоды к порту я видел как "бежит" светящийся светодиодик :)

Ну еще enc и enc1 не забыть продэфайнить в начале.

И еще можно будет убрать три переменных а использовать всего лишь 4 бита из одного байта. Тогда код вообще будет оптимальным.
Так мне кажется лучше смотрится :)

Автор:  КРАМ [ Вт сен 04, 2012 14:09:56 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Уже приводил эту ссылку по энкодеру(с защитой от дребезга):
http://www.microchip.su/showpost.php?p= ... stcount=32

Автор:  ploop [ Вт сен 04, 2012 14:14:49 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

О, я не видел! Интересно сделано.
Спасибо, утащил в закладки.

Автор:  Artos [ Вт сен 04, 2012 14:19:46 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Если это в мой адрес, то:

Не за что :)
Помню день сидел и думал как максимально просто написать процедуру обработки энкодера :)

Автор:  ploop [ Вт сен 04, 2012 14:21:31 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Я КРАМу, если что :wink:
Ваш тоже утащил, но не разбирал. Скоро все проверю :)

Автор:  s_black [ Вт сен 04, 2012 14:21:50 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

Здесь ещё гляньте

Автор:  Artos [ Вт сен 04, 2012 14:30:36 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

А никто не пробовал проводить испытания.

На какой частоте может работать порт в AVR контроллера?
буду брать 4мгц тактовую.
Нужно быстро рулить сдвиговым регистром но не постоянно, в момент изменения данных.
(статическая индикация три разряда) + вывод двоичного кода в 2х8бит в еще два регистра.
И того получается 5шт. сдвиговых регистров включенных в цепочку.

На какой частоте реально можно затактировать программный SPI?

Автор:  ploop [ Вт сен 04, 2012 14:34:58 ]
Заголовок сообщения:  Re: Программная обработка Энкодера на AVR

А какая разница?
У меня 595е цепочкой 14 штук, тактовая - 20МГц, никаких задержек, выплёвываю данные когда надо и всё. В любом случае логика на порядок быстрее вашего МК отработает.
То есть обычный цикл, никаких таймеров и прочего. Это ведь синхронный интерфейс получается.

Страница 1 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/