Здравствуйте.
В Ардуино имеется встроенная функция чтения длительности PWM импульсов
pulsIn(PIN,HIGH). Однако pulsIn() блокирует код в цикле loop(), на время ожидания начала и завершения импульса, тратя драгоценное время обработки. Если входных данных больше одного, они также могут быть потеряны. Предложено несколько алгоритмов решения этой проблемы с использованием прерываний. Например Read PWM, Decode RC Receiver Input, and Apply Fail-Safe | Arduino Project Hub, Arduino-PWM-Reader/PWM.hpp at master · xkam1x/Arduino-PWM-Reader · GitHub.
Но все эти алгоритмы написаны для архитектуры AVR, и оказались несовместимы с Arduino Due на ARM архитектуре.
Ошибка выглядит как функция was not declared in this scope. Этот же код, при переключении IDE на плату Uno, ошибок не показывает.
Помогите пожалуйста разобраться - как модифицировать код работы с прерываниями, чтобы надежно и быстро считывать длительность импульсов PWM с помощью Arduino Due?
Читаешь документацию на due и пишешь код с нуля. Модифицировать тут нечего.
Присоединяюсь к ркиту - нет смысла копировать АВР код, пишите сразу на дуе. Общего между ними мало.
Вам нужна работа с таймерами DUE. Сами Вы её не напишете (если бы был шанс, то не было бы этого поста). Так что берите готовую библиотеку DueTimer и будет Вам счастье. Она всё, что нужно умеет.
Увы, задача на Due единичная, так что глубоко лесть в его регистры смысла не вижу. Пока мне помог код на прерывании digitalPinToInterrupt(), предложенный на странице Arduino Pulsein Interrupts | Уроки технологии
Для того Вам и предлагали готовую библиотеку. Не знаю, чем она Вам не угодила.
пулемёт не той системы
Специально для тех, кто “не видит смысла”, есть раздел “Ищу исполнителя”.
Предложенная ЕвгенийП библиотека не предназначена для измерения длительностей сигналов.
У меня нет DUE, но тема мне интересная, поэтому я посмотрел, что есть из библиотек. Есть библиотека, по описанию подходящая для измерения длительностей сигналов GitHub - antodom/tc_lib: This is a library to take advantage of different functionalities available on Timer Counter (TC) modules in Arduino Due's Atmel ATSAM3X8E microcontrollers
Т.к. у меня интерес скорее теоретический, не смог найти однозначного ответа (правда и не долго искал) на вопрос: можно ли одним каналом измерить параметры одного периода PWM сигнала с гарантированным запретом последующей перезаписи регистров захвата. Т.е. чтобы после первого захвата, дальнейшее обновление регистров захвата запрещалось аппаратно, а не программно по прерыванию.
Пример входного сигналя
¯¯¯_____1/¯¯¯¯¯¯\2______3/¯¯¯¯¯¯¯¯¯\4_____5/¯\6…
Например
В точке 1 срабатывает тригер и сбрасывает TC
В точке 2 записывается регистр А
В точке 3 записывается регистр В и аппаратно останавливается счетчик.
Но может быть при остановленном счетчике, регистры А и В все равно будут в дальнейшем обновляться по фронтам входного сигнала?
В даташите прямо не сказано, что захват не происходит при остановленном счетчике. Но вроде логично, чтобы не происходил. Иначе зачем есть возможность останавливать счетчик по захвату регистра В.
Если кто знает ответ на этот вопрос - поделитесь пожалуйста.
Пока мне помог код на прерывании digitalPinToInterrupt(), предложенный на странице Arduino Pulsein Interrupts | Уроки технологии