Как захватить импуль определённой длины?
Устройство - датчик, посылающий через 433 мгц дату в форме импульсов.
Посылается от трёх и выше пакетов.
Каждый пакет содержит 25 импульсов.
Протокол 24-х битный с энкодером на чипе 1527.
Первый бит всегда в логической единице.
Остальные 24: адрес устройства (или адрес команды) - 20 бит, состояние даты - 4 бита.
Проблема в следующем
Приёмник типа RxB12 имеет чип типа SYN470n, в этом чипе стоит автоматический усилитель AGC, который
при отсутствии сигнала входит в режим максимального усиления и в результате на входе микропроцессора
находится уровень чуть больше ´серого´, короче ближе к логической единице.
Я поставил триггер Шмидта для ´чистки´ сигнала. Что-то убирается, но на вход микропроцессора проходит
большое количество ´шума´. Необходимо отметить что SYN470n при отсутствии сигнала выдаёт (имея компаратор) множество случайных нулей и единиц.
Программа
Существует несколько библиотек для работы с этим протоколом.
Я проверил одну - работает хорошо.
Тем не менее пишу программу свою.
Написал по принципу одного автора (статья - Decoding the Oregon Scientific Remote Weather Temperature Sensor).
В статье автор работает с протоколом Манчестера, но принцип один и тотже.
Основа в следующем:
Если на вход Д2 микропроцессора постапает логическая единица - запускаем таймер.
Если на вход Д2 микропроцессора постапает логический ноль - останавливаем таймер и делаем измерение в
микросекундах. После чего сравниваем с известными из протокола данными.
В моём случае:
Логическая единица
_
| 0000000000000000 |
| 0000000000000000 |
| 000000000000000 |
| 000000000000000 | 0000
(К сожалению на этом форуме верняя диаграмма искажается, поэтому я ввёл нули. )
Короче из четырёх частей бита, первая часть длинная.
Скорость микропроцессора небольшая - 16 млн в сек.
Скорость опроса входа Д2 - около 16 тыс в сек.
Длина одного импульса приблиз. 350мс х 4 = 1400 ( в теории). В жизни около 1700.
Логическая единица состоит из четырёх тактов (привязан к опорному генератору передатчика).
Если измерять ´вверху´ то длина будет 12-13 миллисекунд.
Если измерять ´внизу´ то длина будет 400-450 микросекунд.
Логический ноль
_ _ _
| |
| |
| |
- | - - - -| - - - -|- - - -|
Логический ноль состоит из четырёх тактов (привязан к опорному генератору передатчика).
Если измерять ´вверху´ то длина будет 400-450 микросекунд .
Если измерять ´внизу´ то длина будет 12-13 миллисекунд.
В принципе достаточно только измерить длины между состояниями Д2=0 и Д2=1.
Если длина измерения будет 400-450 микросекунд то мы имеем логический ноль.
Если длина измерения будет 12000 - 13000 микросекунд то мы имеем логическую единицу.
Вариант симуляции работает хорошо. Программа читает как нули так и единицы и всё сохраняет.
Вариант в ´железе´ работает с перебоями.
Преамбула
Протокол обеспечивает синхронизацию сигнала через преамбулу.
Преамбула - это нулевой уровень сигнала на протяжении 12700 - 13000 микросекунд.
Микропроцессор производит захват преамбулы, но потом идёт сбой.
Таймер
В теории таймер должен читать длину импульса как это делает осциллограф.
В реальности таймер имеет свои внутренние проблемы и выдаёт как правило не те цифры,
что показывает осциллограф.
Я ввёл подпрограмму калибровки.
После калибровки автоматически добавляется погрешность таймера к измеряемому результату.
Проблемы в ´захвате´ импульса
Если сравнивать принятый на вход Д2 микропроцессора импуль и после его измерения сравнивать
с не просто конкретным значением, но с минимальным-максимальным значением, то возникают проблемы.
Если мин-максимум делать узким, то микропроцессор не читает.
Если мин-максиму сделать широким, то читается много помех.
Как пропускать импульсы ( в данной ситуации часть бита) не пропуская помехи?
