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

1 Ответ

+4 голосов
 
Лучший ответ
Самое правильное - использовать амплитудный детектор. Так мы не будем привязаны ни к частоте детектируемого сигнала, ни к "скорострельности" микроконтроллера. Ежели исследуемая частота много меньше частоты квантования АЦП, то АЦП переводится в "свободный" режим работы и в прерывании по готовности результата оцифровки сравниваем текущее значение с предыдущим. Если текущее значение стало меньше предыдущего, то вот он и максимум. Здесь я не рассматриваю влияние различных шумов, т.к. это тема для отдельной небольшой статьи.
(2.7 тыс. баллов) 9 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 и хоббийной электроники в целом. Цель Бредборда — быть максимально полезным. Поэтому мы строго следим за соблюдением правил, боремся с холиворами и оффтопиком.
  1. Un_ka

    8 балл(ов)

  2. Eriak

    4 балл(ов)

  3. AlexGorr

    2 балл(ов)

...