Насколько точна синхронизация pulseIn ()?


8

Я использую pulseIn()функцию для обработки кодирования двоичных данных на основе ШИМ. Это хорошо работает для различения импульсов, которые значительно различаются по длине, например, 500 мкс против 1500 мкс. Это делает его более чем достаточным для обработки типичных ИК-пультов.

Тем не менее, я хочу создать свою собственную ИК-систему, которая может использовать более 2 импульсов, чтобы передача данных происходила быстрее. В идеале я хотел бы использовать 8 различных длин импульсов для восьмеричного кодирования (например, 200us, 400us, 600us и т. Д.).

Я заметил довольно значительные различия в значениях, возвращаемых pulseIn()хотя (+/- 10%). Я ожидаю, что, по крайней мере, некоторые из них представлены модулями ИК-передатчика и приемника, но у меня нет достаточно хорошего оборудования, чтобы это проверить.

Предполагая, что я могу смягчить эту внешнюю ошибку, pulseIn()вероятно, будет достаточно точным, чтобы различать такие похожие импульсы?

Ответы:


11

Функция pulsein () с большими потерями, поскольку она представляет собой жесткий цикл и возвращает число * предполагаемых тактовых циклов, необходимых для цикла

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

Наиболее точный метод для определения времени ввода PIN-кода - использовать функцию ВВОДА ВВОДА. Посмотрите на этот пример . Это позволяет захватывать вход на 1x ЦП для максимального разрешения, и каждый край входного вывода захватывает значение тактового сигнала таймера для чтения из сгенерированной службы прерываний. Это также позволяет прерыванию переполнения таймера поддерживать большое абсолютное время для захвата. Так как 1х прокатит довольно быстро. Захваты сохраняют время в массив для чтения основным циклом.


Где для сигналов по ИК типичной библиотекой является библиотека shirriff / Arduino-IRremote . Там, где есть несколько демонстрационных примеров, которые будут считывать и отправлять ИК-сигнал из демодулированного сигнала. Чтобы можно было создать эскиз собственного дизайна. Этот код первоначально создает прерывание таймера, которое опрашивает входной контакт со скоростью, определяемой

#define USECPERTICK 50  // microseconds per clock interrupt tick

в файле IRremote.h. Для моих целей я изменил это до 25 нас. Где я нахожу это, все еще могут периодически отсутствовать потоки импульсов.

Обратите внимание, что демодуляция лучше всего достигается в ИК-приемнике, который, в свою очередь, выводит этот интересующий сигнал. Где добавить немного фона. Использование типичной модуляции 38 кГц соответствует минимальному разрешению 26,3 мкс на такт импульса. Библиотека Шерифа показывает, что большинство бодов или битов порядка 10+ импульсов. Которые, кажется, соответствуют вашим желаемым временам.

microtherion / Arduino-IRremote форк работы Шириффа улучшает прием, заменяя опрос прерывания таймера на выводе с использованием PinChangeInterrupts. Который я слил в свой собственный форк mpflaga / Arduino-IRremote , который добавляет несколько других функций.

Таким образом, вы можете использовать любую из вышеперечисленных библиотек. Или создайте свое собственное приложение, которое использует любой из следующих способов для захвата краев.

  1. опросы по событию таймера (например, 50 мс)
  2. захватывает micros () на PinChangeInterrupt
  3. использует прерывания захвата ввода, чтобы получить точное время

1
Блестящий ответ. Arduino-IRremote - это библиотека очень высокого качества. Легко читается и имеет очень хорошо продуманный дизайн, что означает, что он очень надежный.
Cybergibbons

2

Вот некоторые тестовые данные pulseInтеста. Один Arduino послал, как предполагалось, импульсы 14us, а другой выплюнул эти данные:

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,24, 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24, 18,18,18,18,18,18,18,24,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,18,18, 18,18,18,18,18,18,18,19,18,18,18,11,18

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.