Оверсемплинг с частотой на порядок выше частоты измеряемого напряжения (тока), затем вычисления.
_________________ "Every profession is a conspiracy against the uninitiated" (B. Shaw) "A textbook can be defined as a book unsuitable for reading" (B. Shaw) Tautology is humor in "this" place (Vigo Carpathian)
На порядок выше фигня получится. Нужно хотя бы сотню сэмплов на период: тогда и почистить от шума получится, и даже True RMS измерить, если не синусоидальный сигнал.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Компания SUNCO выпускает такие компоненты, как Si- и SiCFET-транзисторы, дискретные IGBT и IGBT-модули, SiC-диоды, диодные мосты, диоды Шоттки, TVS-диоды, TVS-тиристоры и многое другое, являясь одним из крупнейших в мире производителей дискретных полупроводниковых компонентов с полным циклом производства и продаж. Продукция компании применяется ведущими мировыми производителями. В статье можно ознакомиться с ассортиментом продукции.
Опубликованы материалы вебинара, посвященного пленочным конденсаторам компании Hongfa, на котором была представлена текущая линейка и модельный ряд продукции этого направления, включая новые, недавно вышедшие серии.
На вебинаре были приведены актуальные примеры применения пленочных конденсаторов Hongfa в источниках питания, зарядных станциях для электротранспорта, преобразователях частоты, фотоэлектрических преобразователях и ветрогенераторах.
Да элементарно же: если делаем 100 измерений на каждый период и хотим 10 периодов обработать, нужно выделить буфер в оперативке на 2кБ. Дальше пинаем при помощи таймера DMA и собираем эту 1000 измерений, после чего обрабатываем. Если частота неизвестна, то принцип тот же самый, но сначала пытаемся замерить частоту. Здесь уже проще: можно и по десятку измерений на период сделать. Т.е. если рассчитываем на то, что частота не выше килогерца, проводим измерения с частотой в 10кГц, затем обрабатываем, выясняем точную частоту, запускаем заново уже с перенастроенным таймером.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Синхронизируйте АЦП по экстремуму (точка смены знака вектора). Можно синхронизироваться не сам АЦП (что трудно, требует отдельной схемы) а в массиве преобразования с запасом т.е. более нескольких периодов Ваших 100 Гц как это делают в цифровых скопах, правда там для достижения синхронизации в наносекунды используют FPGA на гигагерц, Вам этого не нужно и микроконтроллер справиться с синхронизацией 100 Гц сигнала. Найти точку смены знака вектора напряжения алгоритмически не трудно. После синхронизации выполняйте вычисления среднеквадратичного напряжения по паре тройке оцифрованных периодов Ваших 100 Гц.
_________________ "Every profession is a conspiracy against the uninitiated" (B. Shaw) "A textbook can be defined as a book unsuitable for reading" (B. Shaw) Tautology is humor in "this" place (Vigo Carpathian)
Последний раз редактировалось astrahard Сб мар 12, 2022 11:59:41, всего редактировалось 1 раз.
Нет, без таймера ничего не получится. Ты никак не сможешь обеспечить надежное постоянство интервалов! Что ж ты там с таймерами-то делаешь, что из 7-9 таймеров у тебя ни одного ни осталось?
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Вот его для пинания DMA и используй! Для кнопок вообще таймер не нужен: используй SysTick для отсчета миллисекунд, по значению системного времени и определяй антидребезговую паузу. Вот так.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Нет, без таймера ничего не получится. Ты никак не сможешь обеспечить надежное постоянство интервалов! Что ж ты там с таймерами-то делаешь, что из 7-9 таймеров у тебя ни одного ни осталось?
Ну да, хотя, самозапуск следующего преобразования АЦП может обойтись и без таймера. Таймером может выступить и ДМА шины APB. Тут главное (по опыту кода скопов на STM32) временно остановить ядро, чтобы не нарушать тайминги ДМА для шины APB. А, в случае медленного АЦП по таймеру мы рискуем получить джиттер момента начала преобразования АЦП. Вот такие тонкости влияющие на точность. Ну или ДМА АЦП для APB присвоить найвысший приоритет, что логичней. Темп преобразования АЦП определяет время заряда конденсатора УВХ (устройство выборки хранения) АЦП и, влияет на его входное АЦП сопротивление, что тоже нужно учесть. И последнее, оверсемплинг выше необходимого для восстановления 100 Гц может повысить разрядность АЦП, что повысит точность среднеквадратичного. Нюансов много, ка видите.... Есть еще нюансы не упомянутые....
_________________ "Every profession is a conspiracy against the uninitiated" (B. Shaw) "A textbook can be defined as a book unsuitable for reading" (B. Shaw) Tautology is humor in "this" place (Vigo Carpathian)
У меня в stm32f103 4 таймера.Один для кнопок.Другой для срабатывания ацп с задержкой.А третий для старта(пуска) эл .двигателя.
Что-то мне кажется, Вы топорно используете периферию. У меня есть проект управления кулерами (6 штук) с цифровыми термометрами (4 штуки), экраном, кнопками, подсветкой и меню. Не совсем меню, по сути, но работает за него. И вот там... используется ДВА таймера. TIM2 (ch1~ch4) на управление кулерами 1-4, TIM3(ch1-ch3) на управление кулерами 5-6 и подсветкой экрана. Кнопки опрашиваются в основном цикле. Стандартно, используя по 1 байту на каждую кнопку (счётчик для цифрового фильтра). Длительное нажатие и двойное нажатие - не реализовывались, т.к. не требуются. В том же цикле идёт игра со всеми One-Wire датчиками. Из периферии задействовано: SPI -> LCD TIM2 + TIM3 -> FAN PWM(6) + LCD_PWM(1) SysTick -> милисекундный таймер + пробуждение DMA + USART -> Консоль управления в сторону ПК для управления... со стороны ПК. Тафталогия, но работает. GPIO + EXTI -> для измерения скорости враащения кулеров. PVD -> Реакция на пропадание питания. Обычно не срабатывает. Если сработает - проблема на стороне преобразователя питания. I2C -> Внешняя EEPROM память для хранения настроек кулеров.
Нужно хотя бы сотню сэмплов на период: тогда и почистить от шума получится, и даже True RMS измерить, если не синусоидальный сигнал.
Ложим в прерывании ДМА, половинка и полный, 300к с лихуем отсчетов, и без синхронизации и таймеров, хоть синус хоть меандр хоть ШИМ, а далее хоть трумс хоть среднее хоть квадратное.
Эту тему проходили, даже код где-то есть, скучно, давайте что нибудь другое.
Это ж сколько оперативы нужно на 300 тысяч отсчетов? Где ты видел недорогой STM32 с мегабайтом ОЗУ? Ну и да: если тупо делать непрерывные измерения, невозможно гарантировать, что они имеют равноотстоящие отсчеты по времени. Да и промежутки между измерениями неизвестны с нужной точностью. Частоту не измеришь.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Пропуская то, что я привёл только фукнцию инициализации АЦП и канала DMA, а так же код, который запускает преобразование, не добавив массивы... это всё работает. В моём случае, оцифровывается 40мс сигнала с частотой выборок в 6400 сэмплов в секунду, получая 512 сэмплов в массиве:
Код:
#define Len 512 volatile short Samples[Len] __attribute ((aligned (4)));
После заполнения массива, срабатывает прерывание DMA:
... взводит переменную-флаг ADC_Samples_Ready, указывающую на то, что буфер заполнен. После чего в СЛЕДУЮЩИЙ проход по основному же циклу, процессор проверяет эту переменную (кстати, volatile, иначе компилятор посчитает, что переменную в основном цикле не меняют, значит код можно выбросить), видит что в ней вдруг (для компилятора - очень неожиданно, если переменная не volatile) появилось число отличное от 0, сбрасывает эту переменную, и даёт массив сэмплов в функцию обработки FFT. Всё это крутится на STM32F030F4P6, том маленьком чипе с 20 ножками. На 20МГц обработка спектра выполняется за 20-30мс. Забыл точное время, но не суть важно.
Собственно, от Вас требуется только модифицировать мой код. Настроить таймер в соответствии с тактовой частотой у Вас, предложить компилятору соответствующего размера массив, указать его размер для DMA. Выполнить инициализацию. Возможно по-своему.
Таймер запускает АЦП. АЦП преобразует несколько каналов. ПДП пересылает отсчёты в память. ПДП был настроен на кольцевой режим и генерацию прерываний по заполнению половины и полного буфера. Пока обсчитывали одну половину, заполнялась вторая. 9 каналов, 2000 отсчётов в секунду в каждом, частота входного сигнала 30-60 Гц. Измеряли период и частоту в опорном канале, в остальных среднее, среднее квадратическое, минимальное и максимальное значения.
Если взять минимальное ADC_SampleTime_239_5Cycles, 18мкс на отсчет АЦП, и для 9 каналов, то за 1 секунду можно положить 6172 отсчета для каждого канала. А частота входного сигнала - где то до ~3кГц. А период и частоту входного сигнала измерить с помощью таймера, который как раз и предназначен для этого.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения