Например TDA7294

Форум РадиоКот :: Просмотр темы - Алгоритм захвата команд ДУ
Форум РадиоКот
https://radiokot.ru/forum/

Алгоритм захвата команд ДУ
https://radiokot.ru/forum/viewtopic.php?f=2&t=95736
Страница 1 из 1

Автор:  Artos [ Вс окт 20, 2013 17:16:15 ]
Заголовок сообщения:  Алгоритм захвата команд ДУ

Добрый вечер уважаемые!
Есть у меня один метод захвата кодовых посылок ДУ, можно сказать классический. Но он не оптимальный если используется для универсального декодера.
Работает он на основе замера длительности импульса и длительности паузы. Замеряется тремя фиксированными интервалами как длительности так и паузы, в итоге для хранения команды , отведено 24 байта.
Недавно пришла в голову мысль попробовать алгоритм дискретных отсчетов :

_-_-_-_
| | | | |

Вертикальные линии - это чтение состояния вывода.
Как думаете, стоит попробовать такой метод?
С ув. Артем

Автор:  Alter Ego [ Вс окт 20, 2013 19:28:10 ]
Заголовок сообщения:  Re: Алгоритм захвата команд ДУ

Зачем? Вполне достаточно измерять итервал между фронтами. Если результат укладывается в определенный
диапазон - значит, принят "0", в другой диапазон - принята "1", не укладывается - принята помеха, переходим
к ожиданию стартового импульса.

Автор:  Artos [ Пн окт 21, 2013 00:05:15 ]
Заголовок сообщения:  Re: Алгоритм захвата команд ДУ

Я нашел идеальный метод кодирования/декодирования команд. Уже пишу для будущего "мини-умного дома" :)
Девайсина будет обучаться любым радио брелкам , которые совпадают по несущей частоте. Метод основан на подсчете длительности каждого импульса , длительность которых в виде байтового числа сохраняется в ОЗУ , после я пакую в еепром 24с08. Метод очень прожорливый , 1 команда занимает 100байт памяти. Но зато такой метод, теоретически , работает с любым пультом :)

Код:
 void decode_ir_data()
 {

    tim_system_rc=0x04;
   
  if(start) // если установлен старт бит - начинаем измерять импульсы
  {
    data_ir[a] = timer_ir;
    a++;   
     timer_ir=0;      // обнуляем счетчик   
     
    if(a>99)
    {
      start=0;         // сбрасываем старт бит
      a=0;             // сбрасываем счетчик данных массива
      tim_system_rc=0; // сбрасываем системный таймер
       tim_stop=1;
    } 
  }
 
 
  if(start==0) //  старт бит установлен? нет!
  {
     start=0x01;   // да!
     timer_ir=0;
  }   
     
  timer_vol=0;

 }


 void timer_stop()
 {
    start=0;
    tim_system_rc=0;
    tim_stop=1;
    timer_vol=1;
    a=0;
 }


код выполняется в обработчике прерывания ИНТ

Код:
                                for(d=0; d<100; d++)
                                 {
                                   
                                 
                                  if (data_ir_eep0[d] > 2)
                                  {
                                   if (((data_ir_eep0[d]+2) > data_ir[d]) && ((data_ir_eep0[d]-2) < data_ir[d])) // команда Вкл.Откл. питание
                                   {}
                                   else  cmd_ok=0;
                                  }
                                 
                                    timer_led_shou=0;
                                    data_ir[d]=0; // стираем буффер   
                                 }


Проверка принятой команды

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