Всегда верное решение!
ГАММА-САНКТ-ПЕТЕРБУРГ
Поставки электронных компонентов и модулей на рынки
России, стран СНГ и Прибалтики
Russian English
(812) 493-51-15
197101, Санкт-Петербург, Певческий пер., 12
(ст.м. "Горьковская"), БЦ "LIGHTHOUSE"

посмотреть на карте

(812) 493-51-15

Аппаратное декодирование кодированных ШИМ сигналов микроконтроллерами Microchip

Предыдущие статьи часть 1,часть 2, часть 3 были посвящены Периферии Независимой от Ядра (Core Independent Peripheral, CIP) микроконтроллеров Microchip: конфигурируемым логическим ячейкам, портам ввода/вывода с функцией ограничения тока и АЦП с вычислителем, были показаны некоторые возможности такой периферии. Такая периферия, а в особенности возможность её конфигурирования на совместную работу и синтез аппаратных функций, призвана разгрузить программную часть, снизить энергопотребление. Ниже описаны примеры реализации декодеров «кастомных», нестандартных интерфейсов связи с помощью Периферии Независимой от Ядра.

Декодирование ШИМ сигнала датчика AM2302

Рассмотрим использование Периферии Независимой от Ядра совместно с датчиком температуры и влажности DHT22 (AM2302).

Датчик имеет однопроводный интерфейс, т.е. информация передается по одному проводу. В ответ на запрос (низкий уровень длительностью примерно 1ms), датчик отвечает стартовым битом, а затем последовательностью из 40 бит, где информация закодирована в длительности импульсов: лог. «0» – импульс 30мк сек, лог. «1» – 70мк сек (типовые значения).

Ответ от датчика содержит 5 байт: 2 байта данных о влажности, 2 байта – температуры и 1 контрольный байт.


Рис.1. Пояснения к принципу формирования сигнала датчика DHT22

При «традиционной» программной реализации общения с датчиком, алгоритм программы имеет примерно такой вид (см. рис.2)


Рис. 2. Алгоритм программного приема и декодирования

Ниже рассматривается вариант аппаратного декодирования протокола с минимальными программными издержками.

Идея заключается в использовании CIP для выделения синхроимпульсов из битового потока с последующим направлением исходного сигнала и синхроимпульсов на аппаратный модуль SPI. В этом случае программе микроконтроллера остается лишь забирать последовательно 5 байт данных из SPI.

Частью CIP являются таймера с возможностью запуска по событиям (изменению состояния входа или другой периферии). Т.е. изменение состояния входа может запускать таймер, см. сигнал TMR6 на рис.3. Когда таймер достигает заданного значения, его счет останавливается и таймер находится в состоянии TMR6 = PR6 (PR – регистр периода). Состояние таймера может быть входом для конфигурируемой логической ячейки (CLC, см. [1]).

Таким образом, с помощью таймера и Логических Ячеек мы можем сформировать сигнал, пригодный для подачи на тактовый вход SCK модуля SPI. Для выделения информации длительность такого клока должна иметь среднее значение между длительностью нуля и единицы. Тогда SPI может фиксировать бит по спаду клока (см. рис.3 сигнал SCK).

Сигнал от датчика будет иметь ложные импульсы, формируемые от запросного и стартового импульсов. Для того чтобы эти импульсы не мешали работе, нужно включать SPI только на время информационных импульсов, или отсечь ненужные импульсы. Эту задачу так же можем решить с помощью CIP.

Другой таймер выступает в роли счетчика импульсов с переключением по спаду: в регистр периода записываем число 2, таймер отсчитывает первые 2 импульса (см. сигнал TMR4 на рис.3) и останавливает счет (см. сигнал EN на рис.3), который через блок логических ячеек разрешает выдачу остальных импульсов на вход SPI.


Рис.3. Диаграммы, поясняющие прием сигнала датчика DHT22

Логическая функция формирования сигнала SCK реализуется на одной логической ячейке (CLC), схема приведена на рис.4.

Выход логической ячейки подключается ко входу SCK, а сигнал датчика DHT22 подключается к MOSI модуля SPI. Все соединения выполняются внутри микроконтроллера (рис.5). Для контроля и отладки сигналы можно вывести на порты микроконтроллера.


Рис.4. Конфигурация логической ячейки CLC в PIC микроконтроллере


Рис. 5. Полная структура конфигурации периферии

Если кажется, что 2-х таймеров на задачу декодирования протокола датчика является расточительством ресурсов, то счетчик до двух можно «собрать» на свободных логических ячейках CLC.

Итого, задача декодирования сводится к очень простому алгоритму: инициализируется микроконтроллер и его периферия, при необходимости измерений включается модуль SPI и формируется запрос на измерение (лог. «0» в течение ~1мсек).

Остается считать данные из буфера при возникновении прерывания от SPI.


Рис.6. Алгоритм работы с датчиком DHT22 при использовании ПНЯ


Рис.7. Сигналы с портов микроконтроллера. Сигнал SSP1IF – прерывания по приему байта модулем SPI

На рис.7 приведена диаграммы сигналов, где DHT (dat) – сигнал на сигнальной линии датчика – подаем на вход MOSI модуля SPI; TMR6 != RP6 – выделенный тактовый сигнал – подаем на SCK модуля SPI; SSP1IF – сигнал прерываний (готовности данных в буфере SPI) – по сути этот сигнал показывает загрузку ядра микроконтроллера – считывание данных результата.

Декодирование других ШИМ-подобных протоколов

Подобные «однопроводные» ШИМ протоколы используются в ИК пультах управления бытовой техникой. Часто при ИК передаче используется кодирование положением импульса, когда длительность постоянная, а пауза переменная. Этот вариант еще называют «Кодирование методом переменной паузы». По сути это то же самое ШИМ кодирование, но с инвертированным сигналом. При наличии логических ячеек сделать инверсию – не проблема, к тому же ИК-приемники и так инвертируют полученный сигнал. На рис. 8 показаны сигналы после приемника, принятые с двух разных пультов.


Рис.8. Варианты кодирования ИК пультов управления

Оба пульта имеют различные протоколы, но эти протоколы легко декодируются описанным выше способом, единственное, это необходимо обеспечить определение начала посылки для синхронизации включения SPI, так как ИК приемник может ловить помехи.


Рис. 9. Сигналы декодированные с помощью SPI

Не все ИК пульты имеют ШИМ кодирование. Часть протоколов, например RC5, имеют фазовое кодирование (манчестерский код, «0» передается как 10, а «1» как 01) [4]. Декодирование манчестерского кода с помощью периферии независимой от ядра мы уже рассматривали ранее в первой части [1].

Итоги

Вместо практически 100% загрузки ЦПУ микроконтроллера для задачи декодирования ШИМ-подобного протокола (см. рис.2), мы перенесли прием информационной посылки в аппаратную часть. Фронт входного сигнала запускает таймер, состояние таймера определяет выход блока логических ячеек, выход логической ячейки подается на SPI. Использование независимой от ядра периферии позволяет оптимизировать использование ресурсов, часть задач перенести на «железо», упростить код, снизить потребление.

Литература

1. Конфигурируемые Логические Ячейки в PIC контроллерах.
http://gamma.spb.ru/obuchenie/stati/microchip/278-50-ottenkov-periferii-nezavisimoj-ot-yadra

2. Порты ввода/вывода
http://gamma.spb.ru/obuchenie/stati/microchip/281-50-ottenkov-periferii-nezavisimoj-ot-yadra-chast-2

3. АЦП и АЦП с вычислителем микроконтроллеров Microchip
http://gamma.spb.ru/obuchenie/stati/microchip/283-50-ottenkov-periferii-nezavisimoj-ot-yadra-chast-3

4. http://sbprojects.com/knowledge/ir/rc5.php

Регистрация e-mail на получение новостей ::

Статьи для разработчиков

Новости производителей