+3 голосов
Как обнаружить одиночный полупериод синусоидального импульса и измерить его амплитуду с выдачей результата сразу после достижения максимального значения?
(8 баллов) 1 5
теги изменил

1 Ответ

+4 голосов
 
Лучший ответ
Самое правильное - использовать амплитудный детектор. Так мы не будем привязаны ни к частоте детектируемого сигнала, ни к "скорострельности" микроконтроллера. Ежели исследуемая частота много меньше частоты квантования АЦП, то АЦП переводится в "свободный" режим работы и в прерывании по готовности результата оцифровки сравниваем текущее значение с предыдущим. Если текущее значение стало меньше предыдущего, то вот он и максимум. Здесь я не рассматриваю влияние различных шумов, т.к. это тема для отдельной небольшой статьи.
(2.7 тыс. баллов) 10 29 55
выбран
Cпасибо! Второй вариант предпочтительней, т.к. импульс получается из постоянного напряжения на выходе датчика, понижающегося под действием возмущения. Напоминает отрицательную полуволну синусоиды при всегда положительном значении. Длительность 4-300 мс. Нужно его поймать и измерить амплитуду.
Сравнение предыдущего с последующим понятно, но не понятно, как это реализовать в коде без массива по времени (АЦП переводится в "свободный" режим работы, если я правильно понял), т.к. сразу после определения минимального значения необходимо выдать на дискретный выход высокий уровень с длительностью, зависящей от  измеренного значения.
"Свободный" режим - скорее всего режим непрерывного измерения.  
Ну а по отслеживанию вам объяснили.  Никакой массив создавать не надо.   Я так понял вам надо поймать минимум.  Полученное измерение сравниваете с предыдущим. Если текущее значение меньше предыдущего, заменяете предыдущее значение текущим и продолжаете измерения.  Если текущее значение больше предыдущего - значит в прошлой измерении вы были в минимуме.  Выдавайте свой сигнал.
Спасибо, алгоритм понятен. Не знаю как организовать непрерывное измерение.  Т.е. пока напряжение не снизилось ниже определенного значения, как прервать выполнение дальнейшего кода и зациклить его снова на Analogread. Когда-то изучал Фортран, и там было go to,  а здесь как? Return?
Используйте оператор While. Как-то типа

while(analogRead(pin)>20)
{
 // оператор(ы)
}
Суть конструкции - пока analogRead возвращает значение больше 20 , выполняются операторы в фигурных скобках. Как только станет меньше или равно 20 - программа выйдет их этого цикла.
PS: 20 взято от балды, подставляете ваше значение.  pin - номер аналогового пина на котором читаете напряжение.
Спасибо!  Не могу понять логической последовательности. Чтобы сравнить, надо сначала хотя бы один раз измерить, чтобы сравнивать дальнейшие актуальные значения, нужно снова измерять и запоминать переменную, но уже в цикле? Ведь условие в цикле не является командой для чтения АЦП?

analogRead (PIN);
while (analogRead (PIN) > 800) {
analogRead (PIN);
x = analogRead (PIN); // х - доп переменная для запоминания и последующего сравнения
 }

if (analogRead (PIN) > x + 10) { //выдаем полученное минимальное значение х
}

if (analogRead (PIN) < x - 10) {
  x = analogRead (PIN); // запоминаем новое значение
Добро пожаловать на Бредборд! Сайт вопросов и ответов на тему Arduino, Raspberry Pi и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.

    За этот месяц ещё никого.

    ...