[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4643196#p4643196"]Мне кажется что измерять напряжение до и после шунта - не очень правильное решение т.к. точность его будет низкой[/uquote]
Во всех электрических счетчиках, которые мне попадались, измеряется падение напряжение на шуте. А трансформатор ставится только в случае необходимости измерения больших токов. До 50А включительно трансформаторов я не встречал. А мне больше 16A точно не нужно.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4643196#p4643196"]
ПростоНуб, перечитал 1й пост, попробуй фильтровать для одной величины например 5, а для другой 6 значений и фильтр взять не медианный, а усреднение или медианно усреднительный (откидываем по одному крайнему, а остальное усредняем)[/uquote]
Боюсь, тогда надо существенно поднимать частоту SPS. Я всё же пытался разными способами фильтровать. И медианный фильтр с окном 5 дал наиболее приемлемый вариант.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4643196#p4643196"]и ещё, мк успевает это всё обработать? как часто происходит пересчёт? после каждого измерения или значительно реже?[/uquote]
На 160 МГц тактовой частоты поток в 20 КГц по DMA обрабатывать проблем не составляет.
Пересчет происходит по запросу клиента из браузера или при автообновлении показаний раз в секунду через запрос JSON у веб-сервера на МК.
Там же видно, что функция однократно считает напряжение и ток за 12 полупериодов (6 периодов), после чего останавливает АЦП с DMA и возвращает результат.
Добавлено after 13 minutes 43 seconds:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4643201#p4643201"]
ПростоНуб, а откуда берутся "отрицательные замеры"? по идее в + полуволну +*+=+ а в - полуволну -*-=+, поэтому их разделять не нужно[/uquote]
В коде просто суммирую значения с АЦП, относительно экспериментально найденного нуля.
Код: Выделить всё
ch[i].zero_deviation += ch[i].zero_raw as i32 - median_value as i32;
Затем просто делю на количество измерений:
Код: Выделить всё
(chan.zero_deviation as f32 / chan.count as f32).round()
Понятно, что это абстрактные попугаи. Но позволяют видеть, что со временем этот экспериментально найденный ноль вдруг уходит в пределах +-100 единиц. А потом со временем возвращается обратно. Как будто плавает что-то. Причем явной зависимости от напряжения или тока я не заметил.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4643201#p4643201"]попробуй миллиВольты павшие на шунте разглядеть на фоне сотен Вольт в сети, да ещё при неодновременности измерения...[/uquote]
А это и не нужно. Например, на вышеупомянутом ADE7755 милливольты для измерения тока с шунта измеряются на одном АЦП, а милливольты с делителя напряжения на резисторах - на другом.
В моем случае, для частоты 50 Гц неодновременность в 100 микросекунд роли не играет. Я до 200 КГц поднимал частоту (по 100К SPS) на канал. Разницы в точности не обнаружил, зато буфер DMA пришлось существенно увеличить. Из-за чего HTTP сервер больше двух соединений уже принимать не смог. Оперативки не хватало.
Добавлено after 6 minutes 27 seconds:
[uquote="viiv",url="/forum/viewtopic.php?p=4643222#p4643222"]1) Сначала бы добиться, что Ваши "алгоритмы работают". Сделайте adc-эмулятор (подсуньте Вашей программе "идеальные данные") и посмотрите что на "идеальных данных" выдает Ваша программа. Можно "подсунуть" данные для разных нагрузок (не чисто активных), далее можно добавить "неидеальности" (шумы, ...)...[/uquote]
Во-первых, у меня только активная нагрузка. Во-вторых, этот этап уже пройден. Изрядно поигрался в Maxima, прежде чем уже писать код.
[uquote="viiv",url="/forum/viewtopic.php?p=4643222#p4643222"]2) Далее (если надо) разбираться, что не так с "железом". Требуется ли "программная коррекция"....[/uquote]
Коррекция явно требуется. Думаю над вариантом использования не статических экспериментально найденных нулей, а вычислять их динамически. Вот только еще не придумал, как это делать математически. С учетом того, что запоминать все считанные значения оперативки не хватит. А с суммой квадратов уже ничего не сделать.