Добрый день, форумчане! Прошу помощи в объединении двух кодов. Первый это полосовой фильтр сигнала настроенный на 50Гц, второй измерение среднеквадратического измерения переменного сигнала.
Полосовой фильтр:
Прошу строго не судить, недавно познакомился с ардуино. Библиотеку подключал по измерению среднеквадратического сигнала, но она медленнодействующая, что критично
Это не среднеквадратичное напряжение. Если скорость критична то надо брать процессор с аппаратным умножением. Плата блюпил на stm32f1 считает среднеквадратичное напряжение за период по 256 точкам за 800 мкс. Блакпил наstm32f4 почти в 3 раза быстрее. А к ардуине это всё имеет очень опосредованное отношение. Это вопросы цифровой обработки сигналов.
Ну да. Сферический конь в вакууме… К тому же цифровой фильтр со столь малой свёрткой сильно не почистит исходный сигнал. Одна надежда на узкополосный трансформатор.
если не трудно, подскажите эти ошибки первого кода. Второй код - не вычисление среднеквадратического значения я знаю, просто пытался встроить из него функцию voltage_READ() в первый код на выход фильтра, но у меня что то коряво это получается. В принципе для меня этого было бы достаточно. Есть хорошая библиотека #include <TrueRMS.h>, но у него замедление аж за 300мс уходит
По хорошему, там надо подробно разбираться в коде, т.к. реализация фильтра написана человеком, который в программировании не очень разбирается, а потому мог наделать ошибок, которые при поверхностном взгляде не видны. (А то, что Вы не привели исходные данные для расчета фильтра, только делает эту работу более трудоемкой)
Из того, что очевидно:
строка №37: а кто будет вычитать постоянную составляющую?
строки №35 и 38: как Вы думаете, каков период оцифровки? Так вот, он минимум на 6% отличается от того, на который Вы рассчитываете. Самый простой способ исправить, записать строку №38 в виде: timer += 2000;
объясните, что Вы вообще хотели сказать строкой №58? Если бы было Serial.print(adc);, я бы еще понял, а так…
Остальное надо подробно анализировать на наличие неочевидных ошибок и описок.
Вы всерьез надеетесь суметь отличить по осциллографу “идеальный синусоид” от сигнала с 5-10% гармоник?
для расчета фильтра берутся коэффициенты с матлаба и вставляются в код с 1 по 14 строки. В матлабе выбираешь характеристики фильтра и он вытаскивает коэффициенты. К стати при закладке в этот код почему то приходится расчеты в матлаб закладывать частоты в двое выше, не знаю чем это вызвано. Ноль исходного сигнала лежит в пределах 430 из-за использования мной делителя напряжения, а после фильтра постоянная составляющая исчезает и ноль находится на нуле. Попробовал исправить строку №38 с if (micros() - timer >= 2000) на if (timer += 2000) - теряется свойство полосового фильтра. №58 исправил на Serial.print(adc)