Форум программистов, компьютерный форум, киберфорум
Наши страницы
Arduino
Войти
Регистрация
Восстановить пароль
 
Evgen80
0 / 0 / 0
Регистрация: 13.06.2016
Сообщений: 7
1

Обработка синусоидального сигнала ардуино

15.05.2019, 16:55. Просмотров 146. Ответов 3
Метки нет (Все метки)

Здравствуйте.

Стоит такая задача:

1) Есть синусоидальный сигнал, частота которого может меняться (медленно, минуты) в пределах 10% и амплитуда может меняться (гораздо быстрее частоты, за десятые, может сотые доли секунды) в два-три раза.

2) Необходимо организовать счётчик импульсов - для расчёта текущей частоты, далее, необходимо замерять время каждой вершины синусоиды и амплитуду каждого импульса, то есть фиксировать время и амплитуду каждой синусоидальной макушки (положительная часть, отрицательную не надо).

3) сразу после фиксации вершины синуса программа выполняет некоторый код, генерирующий управляющие сигналы, а именно, проверяет условия на текущую амплитуду (пачка if-ов), синхронно с вершиной синуса генерит меандр с длительностью импульса, зависящей от длительности между соседними вершинами исследуемого синусоидального сигнала.

На данный момент задача решена по рабоче-крестьянски: Каждый главный цикл программы МК опрашивает аналоговый вход АЦП analogRead(), и в зависимости от полученного значения, решает (опять блок if-ов), попали мы на вершину синуса или нет. Если нет, то следующий цикл, если попали, то фиксирует текущее время, амплитуду и запускает часть программы по генерации меандра.

Вся эта весчь тратит примерно 200 - 250 мксекунд на один цикл (получаем, что если на один период синусоиды надо потратить минимум 50 точек измерений и времени 50 * 200 = 10 000, то есть 0.01 сек), то есть максимально с приемлемой точностью определить частоту (точность необходима не ниже 0.01%, отсюда и минимальное число в 50 точек на период, все числа взяты на глаз, для качественной оценки) возможно на частотах сигнала не более 100 Гц (реально наверное около 80 Гц).

Хорошо было бы расширить возможности до порядка 10 кГц. Думаю, что для этого надо не мониторить постоянно сигнал с помощью analogRead(), а организовать прерывание.
Пока что дошёл до идеи, как сделать прерывание на начало синусоиды - пропустить синус через компаратор МК-ра, который как раз выдаст меандр, у которого фронты будут по нулевым точкам синуса. Потом этот меандр слушать прерыванием - правда, тут не знаю, как быть с пинами - выход компаратора один пин, а прерывание может быть на этот пин повесить нельзя, хотя может эти пины и совпадают, пока не углублялся в тему (хотя может можно просто с одного пина на другой перемычку кинуть и настроить OUTPUT и INPUT, если пины не совпадают).

Потом по каждому прерыванию включать счётчик и частота готова. Но для фиксации амплитуды вершины синуса надо запустить analogRead() с задержкой на четверть периода, для этого надо после срабатывания первого прерывания по нарастанию фронта меандра с компаратора запустить второе прерывание по таймеру, которое просигналит как раз через четверть периода. Период - величина, измеряемая в реальном времени и постоянно меняется.
Далее, после измерения амплитуды вершины синуса, необходимо включить свой, управляющий, меандр длительностью 0.15 - 0.3 периода (величина подбирается опытным путём, и подобранная один раз потом на протяжении программы не меняется, хотя можно менять, это не суть), то есть на каком-то цифровом пине подать HIGH и через определённое время подать LOW. Получается, что необходимо ещё одно, третье в общем и второе по таймеру, прерывание.

Вопрос - правильной ли дорогой я иду??? А можно ли как-то организовать прерывание не по нулю синуса, а по его вершине??? В таком случае на одно прерывание меньше.

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

Может ссылки на статьи.

Спасибо.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2019, 16:55
Ответы с готовыми решениями:

Регулятор частоты синусоидального сигнала на МК PIC16
Доброго времени суток, форумчане! Задача такова: требуется сделать регулятор частоты...

Программа, определяющая длительность периода синусоидального сигнала PIC16?
нужно написать программу, определяющая длительность периода синусоидального сигнала для...

Обработка сигнала
Всем привет! На ногу МК приходит ШИМ сигнал с устройства. В зависимости от условий на самом...

Обработка аналогового сигнала
Доброго времени суток! Решил сделать автомобильный тахометр, который не требует подключения ни к...

Обработка сигнала с датчика вибрации
Как принять обработать и отправить сигнал с датчика вибрации на ATmega8?

3
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,618
Завершенные тесты: 1
15.05.2019, 18:59 2
предлагаю:
во первых уйти от ардуино
во вторых задействовать БПФ ибо
Цитата Сообщение от Evgen80 Посмотреть сообщение
и амплитуда может меняться (гораздо быстрее частоты, за десятые, может сотые доли секунды) в два-три раза.
очень похоже на АМ(Амплитудную Модуляцию)
0
Evgen80
0 / 0 / 0
Регистрация: 13.06.2016
Сообщений: 7
15.05.2019, 21:10  [ТС] 3
нет там амплитудной модуляции и БПФ мне вообще ни к чему. Как раз ардуина призвана отслеживать амплитуду и в некоторые моменты времени приводить её в необходимое значение посредством выработки управляющих сигналов.

Сам вызов analogRead() занимает мало машинного времени, не помню сколько, но не более 10 мксек. Основная потеря времени происходит на проверке порядка двух десятков блоков if и манипуляциях с переменными внутри этих блоков. Применение прерываний избавит от монотонного опроса порта АЦП с проверкой этих условий каждый раз. Проверки будут происходить только по прерыванию, а это минимум в 10 раз будет быстрее, то есть 1 кГц получится достичь. Реально наверное и все 5 кГц.

Задача исходная описана конкретно, не надо придумывать БПФ и прочее и додумывать то, чего нет.
0
ValeryS
Модератор
7719 / 5731 / 742
Регистрация: 14.02.2011
Сообщений: 19,618
Завершенные тесты: 1
16.05.2019, 00:37 4
Цитата Сообщение от Evgen80 Посмотреть сообщение
нет там амплитудной модуляции
ну нет, так нет
Цитата Сообщение от Evgen80 Посмотреть сообщение
то есть 1 кГц получится достичь. Реально наверное и все 5 кГц.
удачи
0
16.05.2019, 00:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2019, 00:37

Обработка квадратурного сигнала на AVR
Подпрограмма обработки квадратурного сигнала по прерываниям.doc Подпрограмма обработки...

Обработка PPM сигнала из RC приемника в Attiny45
Я новичок в программировании, потому прошу простить за нубство. Короче нужно научить Attiny45...

Atmega8A: обработка сигнала с автомобильного ДПКВ
Здравствуйте! Появилась необходимость работать с датчиком положения коленвала, используя МК...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru