Views: 1138
Множество изготовителей для своих пультов дистанционного управления на ИК лучах используют принцип широтно-импульсной модуляции. В таких кодах бит единицы представляется импульсом большой длительности, а ноль импульсом короткой длительности.
Внешний вид последовательности имеет следующий вид (на выходе ИК приемника):
Характеристики такой передачи следующие.
Преамбула начала передачи данных – 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 модуль для декодирования ИК-кодов пультов...
Это может быть интересно
ESP8266 процедура получение данных даты и времени от серверов точного времени.Views: 6156 Эта функция доступна уже в версии 1.6.1. Для многих приложений, необходимо часы реального времени, если в вашем проекте есть модуль WiFI ESP8266, то легко можно сделать следующим образом. …
CLUBBEST – reasoning on the visualization of music.Views: 307 ВІД ЗАХОДУ ДО СВІТАНКУ АБО ПОБАЧИТИ МУЗИКУ. Час доби, коли почуття людини загострюються, – це час від заходу до світанку. В цей час людина відкрита для …
Moving average – скользящее среднееViews: 2425 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
Altium Designer my setup system and project structure V23.3Views: 348 Оновлення бази даних та шаблонів від березня 2023 року. Updating the database and templates from March 2023. Altium Designer my Libraries, Project templates, System settings by Catcatcat. Дивись …
Проект с использованием MCC часть 02Views: 2435 Когда мы запустили конфигуратор, самое главное понять, что с этим делать и как проверить, то что мы делаем работает или нет. Для начала настроим регистры конфигурации микроконтроллера и настроем …
JDY-62A Audio bluetooth moduleViews: 1862 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …
Защита датчиков температуры DS18B20 от статического электричестваViews: 1963 Статья перепечатана с сайта http://svetomuzyka.narod.ru При удалении датчика на большие расстояния возникает опасность наведения импульсов высокого напряжения на кабель, который соединяет датчик с контролером. Если не принимать меры защиты, …
Униполярный шаговый двигательViews: 2437 В приводах различных устройств часто применяются шаговые двигатели, Шаговый двигатели различают двух типов униполярные – когда обмотки коммутируются током текущим только в одну сторону, например при …
Проект с использованием MCC часть 11Views: 988 Можно несколько облагородить программу вынести наши процедуры обработки нажатия кнопок в отдельные функции. Но вы должны понимать, что это хоть и не значительно, но будет тормозить общую скорость …
CAN – Controller Area NetworkViews: 1241 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …

