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

1 Ответ

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

    445 балл(ов)

  2. gokase

    292 балл(ов)

  3. parovoZZ

    276 балл(ов)

  4. Un_ka

    85 балл(ов)

  5. a1000

    79 балл(ов)

  6. vasp

    71 балл(ов)

Награды месяца
1-е место: Raspberry Pi 4 Model B (4 GB RAM)
2-е место: Raspberry Pi 4 Model B (2 GB RAM)
3-е место: Raspberry Pi 4 Model B (1 GB RAM)

...