Заголовок сообщения: Как правильно посчитать потребляемую мощность?
Добавлено: Ср окт 30, 2024 22:19:10
Собутыльник Кота
Карма: 38
Рейтинг сообщений: 292
Зарегистрирован: Пт сен 07, 2018 20:20:02 Сообщений: 2594 Откуда: деревня в Тульской губернии
Рейтинг сообщения:0 Медали: 1
Нужно контролировать потребляемую мощность на розетке под управлением ESP32. Сейчас использую для этой цели ESP32-C3 (RISC-V) Прототип выглядит так: https://youtu.be/cv17alONmCw К нулевому каналу ADC1 подключен модуль с трансформатором ZMPT101b и LM358. К первому каналу того же ADC - модуль с ACS712. Потоковым чтением через DMA считываю синусоиду с обоих каналов, фильтрую её медианным фильтром с фиксированным окном в пять значений, а далее считаю по отдельность RMS для напряжения и тока. СпойлерКод на Rust.
use anyhow::bail; use derivative::Derivative; use esp_idf_hal::peripheral::Peripheral; use esp_idf_svc::hal::adc::{ AdcContConfig, AdcContDriver, AdcMeasurement, Attenuated, EmptyAdcChannels, }; use std::convert::TryFrom;
use crate::median::*; use crate::Config; use crate::PERIPHERALS;
let mut is_zero_crossed = false; let mut zero_check_block_count: u16 = 1; let mut zero_cross_count: u16 = app_config.rms_half_periods + 1; let mut last_voltage: u16 = 0; let mut max_measurements: i32 = (app_config.sps_freq as i32 * app_config.rms_half_periods as i32 * 2) / app_config.min_measured_freq as i32 + 1;
let mut samples = [AdcMeasurement::default(); 16]; 'reading_loop: loop { if let Ok(num_read) = adc.read(&mut samples, 100) { for smp in samples.iter().take(num_read) { if max_measurements <= 0 { println!("Can't calculate frequency. May be power off?"); bail!("Can't calculate frequency. May be power off?"); } let i: usize = usize::try_from(smp.channel())?; if i >= ch.len() { println!("Invalid GPIO"); bail!("Invalid GPIO"); } else { if ch[i].median_idx > 4 { ch[i].median_idx = 0; if !ch[i].median_started { ch[i].median_started = true; } }
if ch[i].median_started { let median_value = median5(ch[i].median_buf); if i == VOLTAGE_CHANNEL { if zero_cross_count == 0 { break 'reading_loop; }
let v_rms = ((ch[0].squares_sum as f32 / ch[0].count as f32).sqrt() / app_config.reference_voltage_raw * app_config.reference_voltage) .round(); let c_rms = (((ch[1].squares_sum as f32 / ch[1].count as f32).sqrt() / app_config.reference_current_raw * app_config.reference_current * 10f32) .round() // pickups - 3f32) / 10f32;
let res = RmsMeashureResult { volatge_rms: if v_rms < 55f32 { 0f32 } else { v_rms }, current_rms: if v_rms < 55f32 || c_rms < 0.5f32 { // current deviation 0f32 } else { c_rms }, frequency: if v_rms < 55f32 { 0f32 } else { (app_config.sps_freq as f32 / ch[0].count as f32 / 4f32 * app_config.rms_half_periods as f32 * 10f32) .round() / 10f32 }, };
for (i, chan) in ch.iter().enumerate() { println!( "GPIO{}: freq = {}, RMS = {} (raw: {} deviation: {}) by count {}", i, (app_config.sps_freq as f32 * app_config.rms_half_periods as f32 / chan.count as f32 / 4f32 * 10f32) .round() / 10f32, ((chan.squares_sum as f32 / chan.count as f32).sqrt() / chan.reference_raw * chan.reference_rms * 10f32) .round() / 10f32, (chan.squares_sum as f32 / chan.count as f32).sqrt().round(), (chan.zero_deviation as f32 / chan.count as f32).round(), chan.count ); }
Ok(res) }
Проблема в том, что и точность никакая, да и средневзвешенная сумма положительных и отрицательных замеров странным образом улетает на +-200 попугаев. Кто-нибудь подобное делал?
далее считаю по отдельность RMS для напряжения и тока
... ну и? Перемножаем RMS напр. и тока, получаем х.з.ч., а не потребляемую активную мощность, бо без учёта сдвига фаз. Или оно только для электроплиток и утюгов, где потр. мощщность всегда активная? СпойлерЭх, не знал я четверть века назад, когда ещё работал, об Rust (да и сейчас не знаю ) . Пришлось на древней Меге104 на асме городить дивайсы. Может, потому они до сих пор работают? И считл этот энергетический мультиметр с десяток параметров, хотя камень был древний и частота всего 8МГц.
Насчёт улетающих куда-то попугаев ничего сказать не могу, к сожалению. У меня никто никуда не улетал - может по причине (см. выше). Ну дак пресловутый Хруст вроде заточен на создание безошибочных программ ?
Ну дак пресловутый Хруст вроде заточен на создание безошибочных программ ?
Нет, конечно. Он позволяет исключить большинство ошибок при работе с динамической памятью. Само собой, на восьмибитном МК это малоактуально, в отличии от ESP32 с FreeRTOS и веб-сервером.
Варианты или циклично (хотя-бы 100 раз в секунду) перемножать мгновенные значения тока и напряжения, постаравшись их как можно одновременнее получить, или делать замеры IUI, а ток усреднять потом (или наоборот - UIU, и усреднять напряжение) Результат умножения складывать в буфер, из которого (тоже регулярно) результат вынимать и преобразовывать из попугаев в Ватты
а можно микросхему от старого счетчика взять (которая с импульсным выходом)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
100 раз в секунду при частоте 50 Гц будет вообще ни о чем. Там в коде видно, что SPS установлен в 20 Кгц. То есть, я 10 тыс. раз в секунду замеряю напряжение и ток со сдвигом в 100 микросекунд.
а можно микросхему от старого счетчика взять (которая с импульсным выходом)
Тоже вариант. Но старого счетчика, нет. Да и хотелось все же в веб-интерфейсе выдавать напряжение и ток, а не только мощность. В деревне у меня в розетке с одинаковым успехом можно обнаружить как 160 вольт, так и 260. С реактивкой пока никаких проблем нет, так как это будет управление электронагревателем по WiFi. Задача не считать потребление, а мониторить напряжение, ток и потребляемую мощность.
Предлагаю ещё один вариант, проверенный. АЦП, к примеру, ADC121S101, запитанный через REF198 от ADUM6402, он же развязывает сигнальные линии от МК. В моём случае перед АЦП стоит опер, другой (оба опера в одном корпусе) буферит REF/2 для сдвига сигнала.
Тогда в цепь 220 последовательный шунт и мерить быстро U до и после.
И чем два трансформатора ZMPT101b с двумя LM358 лучше измерения тока датчиком Холла в ACS712 и напряжения одним трансформатором ZMPT101b с одним LM358?
Предлагаю ещё один вариант, проверенный. АЦП, к примеру, ADC121S101, запитанный через REF198 от ADUM6402, он же развязывает сигнальные линии от МК. В моём случае перед АЦП стоит опер, другой (оба опера в одном корпусе) буферит REF/2 для сдвига сигнала.
Чем он лучше, чем родной АЦП у ESP32-C3? Гляньте на схему. Там три питания: 1. МК - 3.3 В 2. ОУ и ACS712 - 5 В 3. Реле - 5 В
100 раз в секунду при частоте 50 Гц будет вообще ни о чем.
Да, опечатался... 100 раз за период...
Добавлено after 4 minutes 20 seconds: Если измеряешь с равными промежутками по очереди ток и напряжение, то тем более нужно находить среднее значение, чтобы моменты замеров совпадали хотябы виртуально
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
И чем два трансформатора ZMPT101b с двумя LM358 лучше измерения тока датчиком Холла в ACS712 и напряжения одним трансформатором ZMPT101b с одним LM358?
Первое это ардуино, оно не подходит на аналоговых измерений. Потом датчики хола, они сами по себе грубые 2% + сильная зависимость от магнитного поля вокруг. (Вы же не хотите экранировать датчик от магнитного поля?) Даже если Вы это сделаете то их чувствительность проигрывает любому измерительному трансформатору.
Транс лучшее бюджетное решение. Но там свои заморочки, например трансформатор сам по себе фильтр и искажает входной сигнал. Например Вы поставили старый мотор где на роторе искра ЭДС при разрыве обмотки. Тут Ваш транс не покажет ВЧ импульс а наоборот срежет его своей L поставляющей. Вы будете мерить усреднённое значение.
Только решение нашего Тутанхамона из Екатеринбурга позволит Вам честно смотреть сигнал, без искажений, без расчета CosФи. PS LM358 тоже говно, он дает смещение 2-7мВ по входу. Таких в схеме нужно минимум 2. Так что берите ОУ с смещением по напряжению не более 0.1мВ Что бы измерения 12бит АЦП не превратились в 10бит АЦП
Мне кажется что измерять напряжение до и после шунта - не очень правильное решение т.к. точность его будет низкой, лучше измерять падение напряжения непосредственно на шунте, отделив гальванически трансформатором ещё можно применить трансформатор тока, на счетчиках ведь их не стесняются ставить...
Добавлено after 3 minutes 45 seconds: ПростоНуб, перечитал 1й пост, попробуй фильтровать для одной величины например 5, а для другой 6 значений и фильтр взять не медианный, а усреднение или медианно усреднительный (откидываем по одному крайнему, а остальное усредняем)
Добавлено after 2 minutes 52 seconds: и ещё, мк успевает это всё обработать? как часто происходит пересчёт? после каждого измерения или значительно реже?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Если хотите точность и что бы было дешёво - купить БУ детали токовых клещей. Готовое решение, точное и с развязкой. Если правильно передадите сигнал, сможете сохранить их точность измерений
Мне кажется что измерять напряжение до и после шунта - не очень правильное решение т.к. точность его будет низкой, лучше измерять падение напряжения непосредственно на шунте
это тоже самое. Как раз падение на шунте мультиметром так и мерится. Разность напряжений до и после шунта. Или Вы хотите развязать схему и подвесить её на U1? Вот это хз чем обернётся. Не боитесь измерительный каскад на ~220В вешать? Изоляцию не жалко, но если тронете рукой, то пострадать можете до 2,5кВт
ПростоНуб, а откуда берутся "отрицательные замеры"? по идее в + полуволну +*+=+ а в - полуволну -*-=+, поэтому их разделять не нужно
Добавлено after 1 minute 51 second:
es131245 писал(а):
это тоже самое.
В теории - да, то-же самое, но попробуй миллиВольты павшие на шунте разглядеть на фоне сотен Вольт в сети, да ещё при неодновременности измерения...
Добавлено after 3 minutes 26 seconds: Если на ТТ делать - то ток идёт через ТТ - он дубовый и напряжения на нем малы, да ещё и шунтом закорочен, поэтому его индуктивность сигнал практически не исказит, а то, напряжение, что после ТТ уже и руками трогать не страшно
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Последний раз редактировалось Ivanoff-iv Чт окт 31, 2024 15:42:15, всего редактировалось 1 раз.
а откуда берутся "отрицательные замеры"? по идее в + полуволну +*+=+ а в - полуволну -*-=+, поэтому их разделять не нужно
Трансформаторы работают на переменном токе. Там ток идет в одну сторону, потом в обратную (-U). Поэтому и делается первый каскад смещения на +U/2. Получается ноль в середине, "0" это -U, а макс это +U
У st есть датащит AN4207, это называется ADC дифференциальный режим измерений
Про измерение двухполярных величин я знаю, мне не понятен термин "отрицательные замеры" и откуда он взялся... в смысле зачем замеры делить на положительные и отрицательные, если алгоритм расчёта аболютно одинаков?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Просто из вашего описания я понял, что стоит 2 трансформатора напряжения, один до, второй после шунта, потом идёт низмерение этих 2х напряжений (соответственно до и после), а затем из этих 2х величин вычисляется падение...
и, кстати, если на 0,1 Ом резисторе падает 1 Вольт, то он греется на 10 Вт - неплохая такая печечка...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Я вообще предлагал 1 шунт и без трансформаторов. Гальванические развязанные ОУ. И в расчете вы на нолик ошиблись. Там 1Вт, тк 0.1 один из самый большых шунтов по сопротивлению. Обычно там меньше
И чем два трансформатора ZMPT101b с двумя LM358 лучше измерения тока датчиком Холла в ACS712 и напряжения одним трансформатором ZMPT101b с одним LM358?
Даже если Вы это сделаете то их чувствительность проигрывает любому измерительному трансформатору.
Так напряжение я и измеряю через трансформатор. Но как через него измерять ток? В счетчиках ток измеряется, как разность потенциалов шунта. Так, само собой точнее, но меня вполне и 1.5% устраивают. Само собой, что можно это делать, для примера, на ADE7755, Тогда и трансформатор не нужен, хотя схема становится существенно сложней. Но мне не нужна точность 0.1%. Меня вполне устроит не 1.5, а даже 5%.
PS LM358 тоже говно, он дает смещение 2-7мВ по входу. Таких в схеме нужно минимум 2. Так что берите ОУ с смещением по напряжению не более 0.1мВ Что бы измерения 12бит АЦП не превратились в 10бит АЦП
Так их и есть два в схеме. Благо в корпусе их и есть два. А так как у ADC опорное напряжение ~1000 мВ, то эти милливольты, с учетом их деления на пять с выхода LM358, четырехратной (2 разряда) разницы ну уж никак дать не могут.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения