Обсуждаем контроллеры компании Atmel.
Ответить

Программная обработка Энкодера на AVR

Вт сен 04, 2012 11:58:11

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

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

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

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

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

С ув. Артем

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 12:29:17

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

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

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 12:30:54

Artos писал(а):
SPI и I2C программный.
.........

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

С ув. Артем


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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 12:34:46

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 12:51:01

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

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 12:57:41

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

Работаю в CVAVR

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


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

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

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

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

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

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:06:48

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:29:33

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:33:51

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:37:30

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:45:12

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 13:47:44

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

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

//Энкодер подключается к портам 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;               //сохранение предыдущего состояния
  }
}

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:03:52

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

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

Код:

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 бита из одного байта. Тогда код вообще будет оптимальным.
Так мне кажется лучше смотрится :)
Последний раз редактировалось Artos Вт сен 04, 2012 14:17:26, всего редактировалось 1 раз.

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:09:56

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:14:49

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:19:46

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

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:21:31

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:21:50

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:30:36

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

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

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

Re: Программная обработка Энкодера на AVR

Вт сен 04, 2012 14:34:58

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