POWER MONITOR на Arduino
Модератор: immortal
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: POWER MONITOR на Arduino
Я настроил Power Monitor и он корректно работал в диапазоне 40 Вт — 25кВт. Но когда я сделал сетевой осциллограф в АМС, то увидел такую картину.
Я так понял, что алгоритм просто убрал смещение и более-менее коректно работал на суженном динамическом диапазоне (синие стрелки).
Я так понял, что алгоритм просто убрал смещение и более-менее коректно работал на суженном динамическом диапазоне (синие стрелки).
- Вложения
-
- ПМ
- pm.jpg (19.01 КБ) 10580 просмотров
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: POWER MONITOR на Arduino
Вообще-эти строчки-цифровой фильтр высоких частот.На сайте ОЕМ расписана вся математика.
Разработчику это надо выучить наизусть.
http://openenergymonitor.org/emon/build ... et-removal
Разработчику это надо выучить наизусть.
http://openenergymonitor.org/emon/build ... et-removal
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: POWER MONITOR на Arduino
При использовании 100 амперного ТТ и 10-и битного АЦП 100/512=0.19 ампера*220=42,96 ватта.
Это младшая единица измерения.Дальше 84....
С дуей полегче. допустим 20 ампер/2048=0.0097*220=2.1 ватта. Это уже веселее.
Вот поэтому даже в дешёвых китайских счетчиках применяют 16-и разрядные АЦП и максимум 16 ампер.....
Это младшая единица измерения.Дальше 84....
С дуей полегче. допустим 20 ампер/2048=0.0097*220=2.1 ватта. Это уже веселее.
Вот поэтому даже в дешёвых китайских счетчиках применяют 16-и разрядные АЦП и максимум 16 ампер.....
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: POWER MONITOR на Arduino
Ну хорошо, давайте разберёмся. Строчки
достались нам в наследство от BATONS и они достаточно корректно работают. На сайте я вижу другой код.
Значит ли это, что код BATONS недостаточно корректен и его нужно заменить на новый?
И второй вопрос. Вы пишите, что очень важно точно выставить 2.5 вольта, а у меня (см. рисунок выше) не то что 2.5 вольта не выставлено (512), а весь синус колеблется между 650 и 850. Учитывая, что даже при таком безобразии всё меряется более-менее корректно (в диапазоне 40 Вт — 25 кВт) не совсем понятно вот это
где же здесь убирание 2.5 вольта?
Код: Выделить всё
prevFilteredUI[U] = filteredUI[U];
filteredUI[U] = 0.996 * (prevFilteredUI[U] + sampleUI[U] — prevSampleUI[U]);
Код: Выделить всё
long shiftedFCL = shifted_filter + (long)((sample-last_sample)<<8);
shifted_filter = shiftedFCL — (shiftedFCL>>8);
long filtered_value = (shifted_filter+128)>>8;
И второй вопрос. Вы пишите, что очень важно точно выставить 2.5 вольта, а у меня (см. рисунок выше) не то что 2.5 вольта не выставлено (512), а весь синус колеблется между 650 и 850. Учитывая, что даже при таком безобразии всё меряется более-менее корректно (в диапазоне 40 Вт — 25 кВт) не совсем понятно вот это
программно мы убрали не 2.5 , а любое смещение. Если бы код убирал 2.5, то у меня корректно не то что в диапазоне 40 Вт — 25 кВт не мерилось, а вообще бы ничего не работало с таким смещением. И вот код, который работает в АМСа програмно мы убрали 2.5.....дальше математика скетча честно отработает
Код: Выделить всё
prevFilteredUI[U] = filteredUI[U];
filteredUI[U] = 0.996 * (prevFilteredUI[U] + sampleUI[U] — prevSampleUI[U]);
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: POWER MONITOR на Arduino
Вообще-то с PowMon-ом все намного запущенее)). Уважаемый BATONS написал правильный код,но решает задачу в "лоб".
Ребята с сайта описали алгоритм специально для ардуины ,но всё это запаковали в библиотеку.И теперь скетч просто выводит
значения токов и напряжения так-же как с библиотекой DHT и датчиками.
Я не уверен нужно-ли это описывать здесь на форуме или лучше в личку.
Кусок приведенного кода это маленькая часть большого цифрового фильтра (которые я учил лет 30 назад) назначение
которого из лавины синусоидальных значений получить прямую линию,померить её и сказать-у нас 221 вольт(или столько-то
ампер).А чтобы она была более-менее прямой "колбасить" надо(синусоиду) 8196 раз!(тогда проще с математикой).
Вот тут объясняется что произойдет ,если мы сместим 0 хотя-бы на 1 единицу.
http://openenergymonitor.org/emon/build ... ent-values
А если на 10? В двух словах-если верхняя часть синусоиды будет 400,а нижняя 600-получится большая погрешность.
Тут человек построил РМ на 12 линий,но мощи Меги не хватило))
http://boredomprojects.net/index.php/pr ... gy-monitor
P.S. Для себя я пришел к выводам:
1. Скетч BATONS отличный!
2.Весь РМ надо вынести на отдельную машину (пусть АМС занимается сетевыми функциями и получает
данные от РМ по сетке-АМС-у намного полегчает). Как зто реализовать я пока не знаю-но научусь!
Ребята с сайта описали алгоритм специально для ардуины ,но всё это запаковали в библиотеку.И теперь скетч просто выводит
значения токов и напряжения так-же как с библиотекой DHT и датчиками.
Я не уверен нужно-ли это описывать здесь на форуме или лучше в личку.
Кусок приведенного кода это маленькая часть большого цифрового фильтра (которые я учил лет 30 назад) назначение
которого из лавины синусоидальных значений получить прямую линию,померить её и сказать-у нас 221 вольт(или столько-то
ампер).А чтобы она была более-менее прямой "колбасить" надо(синусоиду) 8196 раз!(тогда проще с математикой).
Вот тут объясняется что произойдет ,если мы сместим 0 хотя-бы на 1 единицу.
http://openenergymonitor.org/emon/build ... ent-values
А если на 10? В двух словах-если верхняя часть синусоиды будет 400,а нижняя 600-получится большая погрешность.
Тут человек построил РМ на 12 линий,но мощи Меги не хватило))
http://boredomprojects.net/index.php/pr ... gy-monitor
P.S. Для себя я пришел к выводам:
1. Скетч BATONS отличный!
2.Весь РМ надо вынести на отдельную машину (пусть АМС занимается сетевыми функциями и получает
данные от РМ по сетке-АМС-у намного полегчает). Как зто реализовать я пока не знаю-но научусь!
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: POWER MONITOR на Arduino
А что насчёт моего вопроса из предыдущего поста? Фильтр
убирает 2.5В или любое смещение?
Код: Выделить всё
prevFilteredUI[U] = filteredUI[U];
filteredUI[U] = 0.996 * (prevFilteredUI[U] + sampleUI[U] — prevSampleUI[U]);
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: POWER MONITOR на Arduino
The Atmega ADC (Arduino) has an input voltage range of 0 to Vcc and so when sampling an AC waveform the waveform needs to be biased at Vcc / 2. This translates to a digital offset value of approximately 512. The waveform sample digital value will be between 0 and 1023, centered around 512.
To do the maths for real power, rms voltage and current calculations, we need remove this offset. This can be done with a digital filter. There are two approaches: the high pass filter, which allows the high frequency component through removing the bias, or the low pass filter, which first finds the bias, then subtracts the bias from the signal. Let's start with the high pass filter.
Digital high pass filter
The floating point implementation looks like this:
filtered_value = 0.996 × (last_filtered_value + sample - last_sample)
Why 0.996? It is not a magic number, all that is required is a number reasonably close to unity in order to provide an adequately long time constant so there is some phase and amplitude distortion at the 50 Hz fundamental frequency being measured. 0.996 yields a filter time constant of 250 sample periods.
Это выдержка с сайта ОЕМ . Пока не научился правильно вставлять сообщения))) что в автоматическом переводе-
Почему 0,996? Это не магическое число, все, что требуется, это число достаточно близко к единице, чтобы обеспечить достаточно долгого времени постоянную поэтому есть некоторые фазы и амплитуды искажений на 50 Гц основной частоты измеряется. 0,996 дает постоянную времени фильтра 250 периодов выборки.
И дальше расписывается весь алгоритм. Вообще надо спросить у BATONS как он написал код.Я встречал-но не найду где.
http://openenergymonitor.org/emon/build ... et-removal
To do the maths for real power, rms voltage and current calculations, we need remove this offset. This can be done with a digital filter. There are two approaches: the high pass filter, which allows the high frequency component through removing the bias, or the low pass filter, which first finds the bias, then subtracts the bias from the signal. Let's start with the high pass filter.
Digital high pass filter
The floating point implementation looks like this:
filtered_value = 0.996 × (last_filtered_value + sample - last_sample)
Why 0.996? It is not a magic number, all that is required is a number reasonably close to unity in order to provide an adequately long time constant so there is some phase and amplitude distortion at the 50 Hz fundamental frequency being measured. 0.996 yields a filter time constant of 250 sample periods.
Это выдержка с сайта ОЕМ . Пока не научился правильно вставлять сообщения))) что в автоматическом переводе-
Почему 0,996? Это не магическое число, все, что требуется, это число достаточно близко к единице, чтобы обеспечить достаточно долгого времени постоянную поэтому есть некоторые фазы и амплитуды искажений на 50 Гц основной частоты измеряется. 0,996 дает постоянную времени фильтра 250 периодов выборки.
И дальше расписывается весь алгоритм. Вообще надо спросить у BATONS как он написал код.Я встречал-но не найду где.
http://openenergymonitor.org/emon/build ... et-removal
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: POWER MONITOR на Arduino
В данном случае нет необходимости беспокоить BATONS, и без него очевидно, что убирается любое смещение.Вообще надо спросить у BATONS
Почему я об этом так настойчиво спрашивал? Потому, что если убирается любое смещение, то прецизионно выставлять 2.5 вольта не обязательно — фильтр всё равно приведёт к средней точке. Другое дело, что сузится динамический диапазон и ухудшится точность, это да.
-
- Сообщения: 81
- Зарегистрирован: Пт окт 02, 2015 7:47 pm
- Благодарил (а): 7 раз
- Поблагодарили: 4 раза
Re: POWER MONITOR на Arduino
кстати да,я положил функции расчета напряжения и тока на ардуино про мини и передаю уже по i2c на мегу...ибо опрос двух аналоговых портов с такой частотой добавил к моему скетчу почти +3сек на круг...это очень много...так я его и разгрузил...
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: POWER MONITOR на Arduino
Можно и отдельный контроллер для ПМ. В АМС количество циклов уменьшено до 400 — задержка на 14 каналов — 0.8 секунды, кажется. Не очень правильно, конечно, но для бытовых нужд нормально.кстати да,я положил функции расчета напряжения и тока на ардуино про мини и передаю уже по i2c на мегу...ибо опрос двух аналоговых портов с такой частотой добавил к моему скетчу почти +3сек на круг...это очень много...так я его и разгрузил...