Views: 1150
Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности.
Внешний вид последовательности имеет следующий вид (на выходе ИК приемника):
Характеристики такой передачи следующие.
Преамбула начала передачи данных – 13510 мс*
Бит нуля – 1131 мс*
Бит единицы – 2257 мс*
Преамбула авто повтора – 11270 мс*
Период между преамбулами авто повтора – 96270 мс*
*-все величины могут иметь допуск ± 5%
Количество передаваемых бит 32 (4 байта).
Декодирование такого типа передач заключается в измерении периода импульсов и при помощи простой логики определения к какому типу они относятся – преамбуле или битам данных. Вот для такой процедуры, очень удобно использовать стандартный модуль CCP в режиме захвате для определения длительности импульса.
А теперь с самого начала как настроить модуль для измерения как измерять и как декодировать. Для примера выберем микроконтроллер PIC16F1936. Мы видим, что все данные измеряются в миллисекундах, для этого нам необходим источник тактовых импульсов длительностью 1 миллисекунда.
Контроллер настроен для работы с внутренним генератором и тактовая составляет 32 МГц.
Для работы выберем модуль CCP4, вход его подключен к выводу порта RB0. Настройка, для работы по каждому отрицательному перепаду:
CCP4CON=0b00000100; // вход RB0 // ++++-- CCPxM<3:0>: режим работы - Capture mode: every falling edge
Модуль работает совместно с таймером, для этого настроим Т1:
T1CON=0b00110001; // настройка таймера T1CON // |||||| | // |||||| +-- TMR1ON таймер включить // |||||+---- T1SYNC синхронизация отключена // ||||+----- T1OSCEN генератор отключен // ||++------ T1CKPS настройка предделителя 11 = 1:8 Prescale value // ++-------- TMR1CS выбор тактовой частоты FOSC
Вся обработка будет происходить через прерывания, для этого настроим прерывания:
INTCON = 0b11000000; // включить прерывания глобальные, от периферии и на изменение состояния на входе
CCP4IE = 1; // разрешить прерывания от CCP4
TMR1IE = 1; // прерывание от таймера 1 разрешить
После этого модуль готов к работе, далее необходимо описать функцию (в прерываниях) которая позволить определять типа полученного байта и формировать данные.
Но для начала опишем логику приема сигнала, так как не удобно в WP сделать блок схему, поэтому опишем на пальцах.
- Когда нет ИК сигнала таймер Т1 считает импульсы и время от времени переполняется и вызывает прерывания. В программе прерывания выполняется сброс флага прерывания от Т1 и устанавливается флаг ожидания приема (это надо для выполнения условий помехозащищенности).
- CCP модуль ожидает прихода импульсов с ИК приемника. Как только приходит любой импульс (отрицательный перепад) на вход модуля значение таймера Т1 загружается в регистры CCPR4H и CCPR4L.
- После этого необходимо загрузить данные в регистр длительности и обнулить таймер Т1 для готовности отсчета длительности следующего байта.
- После этого проверяем полученную длительность:
- если длительность в области 13510 мс – это значит мы получили начала приема ИК кода
- если длительность в области 11270 мс – это код автоповтора, т.е. удерживается клавиша на пульте нажатой.
- если длительность в области 1131 мс – это получен бит 0.
- если длительность в области 2257 мс – это получен бит 1. Допуски для этих длительностей устанавливаем по своему опыту, но скажу одно чем ближе к полученному значению, тем выше помехозащищенность, но тем ниже чувствительность, так что тут, нужен компромисс.
- Если получено начало кода, необходимо сбросить флаг ожидания приема (идет прием данных), это запретит повторное начало. И необходимо инициализировать счетчик принимаемых бит, для нас это 32 (32 бита в команде ИК).
- Далее мы ожидаем импульсов длительностью 1131 мс или 2257 мс, если они приходят, то подсчитываем 32 бита и по получению последнего устанавливаем флаг ИК передача принята, для работы с автоповтором, устанавливает флаг разрешить прием автоповтор (это если он нужен).
Этого вполне достаточно, если нет внешних ИК помех. Дело в том, что часто лампы дневного света генерируют, очень большой спектр ИК помех и существует возможность ситуации, что ИК приемник (несмотря на свою избирательность) будет формировать на выходе импульсы. которые модулю CCP придется обрабатывать, а сформировать с него последовательность он не сможет. Тут тоже надо идти на компромисс, существует два метода:
- блокировать работу CCP модуля пока ИК – эфир не будет очищен, (т.е пока вы не найдете неисправную эконом лампу и её не замените).
- или пытаться несмотря на помехи “выдрать” из всего этого правильную последовательность.
Первый метод самый простой и не требует много ресурсов, логика работы сводиться к тому если CCP модуль получает данные не соответствующие данным ИК передатчика пульта, обработка данных блокируется и мы ждем переполнение таймера, для возобновления работы, (т.е. таймер переполниться когда не будет ИК помех). Но часто от помех избавиться не возможно, а необходимо все таки получить команду. Для этого применим следующий метод (правда он намного трудоемок, но дает отличные результаты), его работа заключается в том, что CCP модуль получает разрешения на прерывания, только в ожидаемые промежутки времени прихода данных. Во все остальное время прерывания от CCP модуля отключены.
Для начала приведем пример для обычного приема ИК команд
void interrupt my_isr(void) // прерывания
{
#define CLOBIT 32 // количество бит в передаче
if(CCP4IF)// ИК приемник
{
CCP4IF=0; // сброс вектора прерывания.
pwm_reg = CCPR4L; //
pwm_reg += CCPR4H << 8; //
TMR1L=0; //
TMR1H=0; //
if(pwm_reg>13400&&pwm_reg<13600&&NACH) // передача синхроимпульса должна сопровождаться переполнением таймера
{
chetchic=CLOBIT; //счетчик бит (3 байта 8*3=24)
NACH=0;
}
else
if (pwm_reg>11000&&pwm_reg<12000&&POV) // передача "бита автоповтора"
{ // POV - блокировка функции автоповтора если не было перед этим передачи команды
AUTO=1;
timerautopo=5;// инициализация таймера, блокировки автоповтора
}
else
if (pwm_reg>2100&&pwm_reg<2300&&chetchic>0) // передача "1"
{
bait01<<=1;
bait01 |= 1;
chetchic--; // подсчет принятых бит
if(!chetchic){PRIEM=1;POV=1;} // 32 установить флаг команда принята если переданы все 32 бита
}
else
if (pwm_reg>1000&&pwm_reg<1200&&chetchic>0)// передача "0"
{
bait01<<=1;
chetchic--;//подсчет принятых бит
if(!chetchic){PRIEM=1;POV=1;}// установить флаг команда принята если переданы все 32 бита
}
else // помеха
{
NACH=1;
chetchic=0;
}
}
if(TMR1IF)
{
TMR1IF=0; //
if(--timerautopo==0)POV=0; // таймер блокировки автоповтора если не было передачи команды
NACH=1;
chetchic=0;
}
}//
В процессе ожидания устанавливается флаг NACH – готовности ожидания команды. Все формируемые импульсы фотоприемником обрабатываются и проверяются на заданные длительности. Если импульс не соответствует длительности преамбулы приема данных программа находиться постоянно в поиске начала команды.
Как только получено начало, инициализируется счетчик приема количества байт chetchic=CLOBIT (счетчик бит 3 байта 8*3=24) и сбрасывается флаг ожидания начала NACH=0. Это переключает программу в работу только двух длительностей нуля или единиц. Если длительность полученного импульса не соответствует требуемых заданных данных, цикл приема прерывается и программа ждет повтора команды. Такая логика дает возможность предотвратить получение не верной команды.
Раскодирование пульта
Коды приведены в шестнадцатеричном значении, так проще понимать их структуру.
| Клавиша | Код | Клавиша | Код | Клавиша | Код |
| Exit | 0x00FFF906 | MUTE | 0x00FF29D6 | TV | 0x00FFBB44 |
| POWER | 0x00FF21DE | * | 0x00FF8B74 | Zoom | 0x00FFb946 |
| 1 | 0x00FFE11E | # | 0x00FF46B4 | CHL+ | 0x00FF6996 |
| 2 | 0x00FF619E | Back | 0x00FF01FE | CHL- | 0x00FF8976 |
| 3 | 0x00FFA15E | Clear | 0x00FF2bd4 | VOL+ | 0x00FFC936 |
| 4 | 0x00FFD12E | ↑ | 0x00FF817E | VOL- | 0x00FF31CE |
| 5 | 0x00FF51AE | ↓ | 0x00FF11EE | FAV | 0x00FFA956 |
| 6 | 0x00FF916E | → | 0x00FF41BE | MODE | 0x00FFD926 |
| 7 | 0x00FFF10E | ← | 0x00FF09F6 | MENU | 0x00FF7986 |
| 8 | 0x00FF718E | OK | 0x00FF9966 | EPG | 0x00FF39C6 |
| 9 | 0x00FFB14E | º RECORD |
0x00FFC13E | SUB | 0x00FFE916 |
| 0 | 0x00FF49B6 | → PLAY |
0x00FF7B84 | SWAP | 0x00FF59A6 |
| [] STOP |
0x00FF3BC4 | || PAUSE |
0x00FF19E6 | ←← REW |
0x00FFDB24 |
| →→ FWD |
0x00FF5BA4 | |← REPLAY |
0x00FF9B64 | →| SKIP |
0x00FF1BE4 |
Сводная таблица по кодам ИК пультов дистанционного управления некоторых производителей в формате MExcel, собраны данные о кодах, изображение последовательностей, данные длительностей.
CCP модуль для декодирования ИК-кодов пультов ДУ - сводная таблица по кодам.
1.95 MB
82 downloads
CCP модуль для декодирования ИК-кодов пультов...
Это может быть интересно
ch-4000 – универсальная печатная платаViews: 1138 На смену устаревшей плате ch-3000, пришла новая ch-4000. Плату уже можно приобрести в магазине Ворон. Схема. Плата позволяет создавать таймеры, часы реального времени, регуляторы температуры, регуляторы влажности, вольтметры, …
Инфракрасный датчик движения, PIR-sensorViews: 3311 Домашняя автоматика предполагает наличие датчиков движения, которые способны контролировать движения человека. Самым простым и доступным устройством позволяющие контролировать изменения ИК-излучения, это ПИР-сенсоры. На текущий момент доступны не дорогие модели D203B, D204B, D205B. Все …
Самый простой индикатор уровня звукового сигналаViews: 6686 Демонстрационный проект создания индикаторов уровня с использованием WS2812B. Изучив этот проект вы сможете самостоятельно изготавливать и конструировать свои индикаторы уровня звукового сигнала. Дополнительно читайте статью Бегущие огни на …
MPLAB® Harmony – или как это просто! Часть 2.Views: 2937 Часть вторая – Первая программа на PIC32. Музыкальная тема к статье, слушаем: Для начала изучения PIC32 надо иметь или демоплату или самому её изготовить имея микроконтроллер. Начнем из …
MPLAB® Code Configurator and EncoderViews: 1646 Еще раз про энкодер… Для некоторых приложений очень удобно и экономически выгодно, для настройки и управления использовать энкодер. Такие энкодеры имеют строенную тактовую кнопку которую можно применить для выбора …
JDY-62A Audio bluetooth moduleViews: 1888 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …
УКВ – радиоприем, часть 2Views: 6433 Пришло свободное время решил вторую часть проекта реализовать (правда есть мысль и третью с использование цветного OLED и функцией ch-светомузыки, но это только задумка… Для понимания функций интегрального …
CLUBBEST-50-LightViews: 464 CLUBBEST-50-LIGHT Зміст Короткий опис проекту. 1 Опис схемотехніки візуалізатора музики. 2 Аудіо вхід. 3 MCU. 4 Цифровий вихід. 5 Схема живлення MCU. 6 Складання пристрою. 7 Список …
Часы + Календарь + Термометр + …Views: 2822 Часы + Календарь + Термометр + Индикатор влажности + Секундомер + Дистанционное управление на ИК лучах (пульты на RC-5 протоколе) + Автоматическая регулировка яркости + Возможность вывода данных через USB, …
Стабилизатор тока для светодиодов SN3350Views: 2764 SN3350 ближайший аналог ZXLD1350 Как собрать готовый вариант, читайте во второй части – http://catcatcat.d-lan.dp.ua/stabilizator-toka-na-sn3350-chast-2/ 40V драйвер светодиодов с внутренним ключом SN3350 – импульсный понижающий преобразователь, разработанный для того, чтобы эффективно управлять одним или …

