|
|
  |
измерение среднеквадратичного напряжения сети |
|
|
|
Jun 24 2010, 11:07
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Alex11 @ Jun 24 2010, 08:03)  defunct, не вводите человека в заблуждение. То что Вы предлагаете, можно делать лишь при условии, что на входе строгий синус, что для сети не очень верно Никого я в заблуждение не ввожу, написал же что способ годится только для правильного синуса. Способ проверял на практике с обычными сетями там где синус "чуть-чуть не совсем правильный" - результаты полученные способом приведенным выше поражают полным совпадением с показаниями любого китайского тестера включая знаки после запятой. Что наводит на мысль - китайцы не парятся с квадратами. Собсно поэтому и написал: "Вы удивитесь насколько точно оно будет работать, и ведь без никаких квадратов и корней!  " Цитата и при необходимой точности хуже нескольких процентов. нелинейность АЦП меги, думаю внесет бОльшую погрешность.
|
|
|
|
|
Jun 25 2010, 08:26
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(defunct @ Jun 24 2010, 03:19)  4. в квадрат ничего не нужно возводить и так все числа положительные, т.к. отрицательные отсекли в п.1. (соответственно потом и корень не надо будет брать). В квадрат нужно возводить обязательно, так как иначе будет другой коэффициент - для синуса 0.637 вместо 0.707, а поскольку идеального синуса в сети никогда нет, то и результат будет неправильный. Цитата(defunct @ Jun 24 2010, 03:19)  6. Числа получаемые в результате деления в п.5 пропустите через КИХ/БИХ фильтр по вкусу. (напр скользящее среднее по 8-ми точкам с отбросом мин и макс значений). Повбывав бы! У вас и так суммируются куча значений за период, куда еще фильтровать? Может лучше земли около АЦП правильно развести? Цитата(defunct @ Jun 24 2010, 03:19)  Вы удивитесь насколько точно оно будет работать, Точно оно работать не будет, твоя дубовая фильтрация лишь скрывает дрожание, но если цифры стоят стабильно, то это еще не значит, что они правильные! Цитата(defunct @ Jun 24 2010, 03:19)  Правда способ будет работать только для правильного синуса. То-то и оно! Цитата(defunct @ Jun 24 2010, 15:07)  результаты полученные способом приведенным выше поражают полным совпадением с показаниями любого китайского тестера включая знаки после запятой. Что наводит на мысль - китайцы не парятся с квадратами. Из чего нормальный человек сделает вывод: нельзя покупать китайские тестеры. Ты же вместо этого берешь с них пример. Цитата(axalay @ Jun 21 2010, 23:05)  Чтобы просматривать обе полуволны пропустил через диодный мост. А падение напряжения на диодах тебя не волнует? У тебя мост до делителя или после? Цитата(axalay @ Jun 21 2010, 23:05)  Знаю, что можно завести сразу обе на разные входы АЦП чтобы не было погрешностей вносимых мостом А не лучше приподнять измеряемое напряжение на половину опроного и вести вычисления в знаковых переменных?
|
|
|
|
|
Jun 25 2010, 12:59
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(777777 @ Jun 25 2010, 11:26)  так как иначе будет другой коэффициент - для синуса 0.637 вместо 0.707, а поскольку идеального синуса в сети никогда нет, то и результат будет неправильный. И что? 0.707 = k*0.637 это k - определяется при калиброке. Цитата У вас и так суммируются куча значений за период, куда еще фильтровать? Может лучше земли около АЦП правильно развести? Причем тут земли? Скользящее среднее это правило хорошего тона, т.к. сигнал может как пропасть на любом отсчете так и появиться. Если не хотим сюрпризов надо граничные величины отбрасывать, а остальные усреднять. Нельзя доспустить чтобы в результате присутствовали интегральные величины расчитание на интервале меньше Pi. Цитата Точно оно работать не будет, твоя дубовая фильтрация лишь скрывает дрожание, но если цифры стоят стабильно, то это еще не значит, что они правильные! У меня оно работает точно. Измеряет напряжение 3х фаз, их токи, считает cos(fi), затем считает активную и реактивную мощность на m8. С квадратами я бы в 8Kb не влез. Точность по напряжению +/- полпроцента меня абсолютно устраивает. Для чего фильтрация см. выше. Уж совсем не для того чтобы квадрат в корень превращать и замазывать ошибки кривой земли... Цитата То-то и оно! Так не скрываю ж е-мае. Не в Гондурасе живем, в сети обычно правильный синус. Цитата Из чего нормальный человек сделает вывод: нельзя покупать китайские тестеры. Ты же вместо этого берешь с них пример. Прагматичный человек рассматривает все варианты. В т.ч. и цену китайских тестеров. Если приемлемый результат можно получить более простым /дешевым способом значит надо взять его на заметку и пользовать его там где он годится.
|
|
|
|
|
Jun 25 2010, 15:31
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(defunct @ Jun 25 2010, 16:59)  Причем тут земли? Скользящее среднее это правило хорошего тона Это дурнейший тон, который только можно придумать. Такой подход называется "кружок 'умелые руки' при районном доме пионеров". Даже там, где действительно нужна фильтрация (а она нужна только в особых обоснованных случаях), применяется цифровой фильтр, специально рассчитанный для конкретной задачи. Для этого оценивается полосы частот сигнала и шума и их амплитуды, вычисляется требуемое подавление шума и по разности частот и амплитуд вычисляется крутизна фильтра которая определяет его порядок. Только тогда, на основании полученных данных синтезируется фильтр и рассчитываются его коэффициенты. А "скользящее среднее" пионеры делают для того, чтобы скрыть свое разгильдяйство при разводке земли, из-за чего шум становится сравнимым с полезным сигналом. Хороший же тон - это когда ты делаешь отсчеты каждую миллисекунду, и они отличаются не более чем на плюс-минус одну единицу АЦП. (А для 10-разрядного АЦП они должны быть равны, я вообще не представляю как надо изуродовать схему, чтобы там дрожал хоть один разряд.) В случае переменного тока требуется несколько отсчетов за период, но именно благодаря этому фильтрация не требуется - интегрирование по сути и будет той фильтрацией. Цитата(defunct @ Jun 25 2010, 16:59)  , т.к. сигнал может как пропасть на любом отсчете так и появиться. Куда он может пропастть? Если он пропал, значит напряжение исчезло и этот факт надо измерить, а не отбрасывать. Цитата(defunct @ Jun 25 2010, 16:59)  У меня оно работает точно. Измеряет напряжение 3х фаз, их токи, считает cos(fi), затем считает активную и реактивную мощность на m8. С квадратами я бы в 8Kb не влез. Уж не с плавающей ли точкой ты выполняешь вычисления?  Вообще-то для целочисленного квадратного корня существуют простые алгоритсы, например Ньютона.
|
|
|
|
|
Jun 25 2010, 16:22
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(777777 @ Jun 25 2010, 18:31)  Даже там, где действительно нужна фильтрация (а она нужна только в особых обоснованных случаях), применяется цифровой фильтр, специально рассчитанный для конкретной задачи. Для этого оценивается полосы частот сигнала и шума и их амплитуды, вычисляется требуемое подавление шума и по разности частот и амплитуд вычисляется крутизна фильтра которая определяет его порядок. Только тогда, на основании полученных данных синтезируется фильтр и рассчитываются его коэффициенты. Чукча писатель? Объясняю на пальцах, алгоритм построен на интегрировании сигнала на интервале от 0 до Pi. Включаем прибор, сигнал на вход не подан, АЦП возвращает 0 мы ничего не суммируем на выходе напряжение 0В. В произвольный момент времени T подают внешний сигнал со случайной фазой, по приведенному выше алгоритму прибор отдетектирует начало периода, но это будет неверно, т.к. фаза сигнала случайна. Скажем, если фаза равна Pi/4, то результат будет завышен почти в два раза - поэтому такое измерение просто необходимо отбросить. Процесс в результате которого избирательно отбрасываются некоторые результаты измерений называется фильтрацией. Цитата А "скользящее среднее" пионеры делают для того, чтобы скрыть свое разгильдяйство при разводке земли, из-за чего шум становится сравнимым с полезным сигналом. Да что вы со своей землей, все в порядке с землей. Фильтруем числа с выхода интегратора, а не семплы с АЦП. Цитата Хороший же тон - это когда ты делаешь отсчеты каждую миллисекунду, и они отличаются не более чем на плюс-минус одну единицу АЦП. Независимо от сигнала на входе? Да... интересное определение хорошего тона... Цитата Куда он может пропастть? Если он пропал, значит напряжение исчезло и этот факт надо измерить, а не отбрасывать. Куда-куда, - свет отключили банально рубильником. Не бывало с Вами такого? Или вы предполагаете, что и прибор вырубится вместе со светом? Цитата Уж не с плавающей ли точкой Результат считается и выдается наружу в плавучке. Это ТЗ. по ходу только суммирование целочисленное, деление уже в плавучке.
|
|
|
|
|
Jun 25 2010, 16:34
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jun 25 2010, 17:59)  С квадратами я бы в 8Kb не влез.  1 команда - умножение (возведение в квадрат). ~50 команд (100 байт) - цикл Ньютона для вычисления корня. Как раз эти операции идут во время сумирования и сразу после, когда вся инфа целочисленная.
Сообщение отредактировал GetSmart - Jun 25 2010, 16:38
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 26 2010, 02:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
В общем это, чтобы прекратить бессмысленные споры вот C-модель способа (реализовано не все, - вчастности фильтрации нет, т.к. стартуем с Fi=0): CODE #include "math.h"
#define TRUE 1 #define FALSE 0 #define COUNT(some_array) ( sizeof(some_array)/sizeof(some_array[0]) ) #define M_PI 3.14159265358979323846
/******************************************************* * Method related * *******************************************************/ typedef struct tagV_CHANNEL { float Sum; float K; float Vdet; float LastSample; int nSamples; int Active;
} V_CHANNEL, *PV_CHANNEL;
V_CHANNEL chanA;
void vChanPrepare(PV_CHANNEL pChan) { pChan->LastSample = -1; pChan->nSamples = 0; pChan->Active = FALSE; pChan->Vdet = 0; pChan->Sum = 0; }
void vChanUpdate( PV_CHANNEL pChan, float CurrentSample ) { // try to detect start of the positive sample to activate integrator if (CurrentSample > 0 && pChan->LastSample <= 0) pChan->Active = TRUE;
if (pChan->Active) { pChan->nSamples += 1; pChan->Sum += CurrentSample;
// detect start of the negative sample if (CurrentSample <= 0 && pChan->LastSample > 0) { pChan->Active = FALSE; pChan->Vdet = pChan->Sum / pChan->nSamples / pChan->K; pChan->Sum = 0; pChan->nSamples = 0; }
}
pChan->LastSample = CurrentSample;
}
/******************************************************* * Signal simulation * *******************************************************/ float Vref[ 240 ];
void BuildReferenceSignal( float Vrms ) { for( int i = 0; i < COUNT( Vref ); i++) { Vref [ i ] = (Vrms / 0.707) * sin( 2 * M_PI * i / (COUNT( Vref) / 3) ); } }
/******************************************************* * ADC sampling simulation * *******************************************************/ void RunAlg(void) { vChanPrepare( &chanA );
// feed reference data in. for( int i = 0; i < COUNT( Vref); i++) vChanUpdate( &chanA, Vref[ i ] ); }
/******************************************************* * Does calibrating * * and then estimating error of the * * RMS calculation method w/o squares * *******************************************************/ int main(void) { float err;
printf("Building reference signal Vrms=220V\r\n"); BuildReferenceSignal( 220.0 ); printf("Calibrating...."); chanA.K = 1;
RunAlg();
chanA.K = chanA.Vdet / 220.0; printf("OK, K = Ves / Vref, K=%0.3f, Ves=%0.3f, Vref=%0.3f\r\n", chanA.K, chanA.Vdet, 220.0);
// now when K is calibrated, lets estimate method error on signals with diff rms (from 40V to 380V) for( float i = 40; i < 380; i += 2.5) { BuildReferenceSignal( (float)i );
RunAlg(); err = abs( chanA.Vdet - i) * 100 / i; // error in percent printf("Vref=%0.6fV, Vdet=%0.6fV, error - %0.6f%%\r\n", (float)i, chanA.Vdet, err ); }
printf("\r\nenjoy the simplicity, no squares no square root calculation, 0% RMS error ...\r\n");
return 0; }
А в атаче результат работы модели, если кому интересно. На чистом синусе - погрешность метода - 0%, при калибровке одной точкой. Ну а на "грязном" - можно проверить в модели, хватает ли точности метода под конкретную задачу.
Прикрепленные файлы
result.txt ( 7.85 килобайт )
Кол-во скачиваний: 87
|
|
|
|
|
Jun 26 2010, 02:55
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(defunct @ Jun 26 2010, 02:12)  А все остальное когда считать? (ток, фазу..) Даже так очень впритык всё получилось. Еще и АЦП оверсемлить пришлось... 6 каналов 4Khz каждый.  Ток, фазу,... Считать по очереди. Ещё можно поверить, что скорострельности не хватило, но не кода. Возведение в квадрат, суммирование и извлечение корня можно делать в 24 битах. После корня данные опять 16 битные. Всё равно на асме ведь прога.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jun 26 2010, 05:15
|
Местный
  
Группа: Свой
Сообщений: 388
Регистрация: 27-02-06
Из: Москва
Пользователь №: 14 759

|
Цитата(ARV @ Jun 25 2010, 12:50)  можно не привязываться к началу периода сети: важно лишь гарантировать, что в периоде будет заранее определенное число семплов. например, делаем семплы с частотой 10К, тогда в периоде сети уместится 200 семплов - вот эти 200 семплов и снимаем с любого момента времени. так как напряжение в сети есть периодическая функция, то результат интегрирования будет всегда один и тот же: период ведь есть расстояние между точками с одинаковой фазой...
проблема может всплыть в случае, если частота в сети отлична от 50 Гц... Количество семплов будет периодически на +1 или -1 уходить и потом возвращаться по любому Нешуточный спор однако.... Мне быстродействия хватает на период 64 очсчета (замеряю обе полуволны) с возведением в квадрат и суммированием отчетов и последующими делением на количество отсчетов и изьятием квадратного корня. Мега88 на частоте 7 с хвостиком. Пишу на Си.
|
|
|
|
|
Jun 28 2010, 05:23
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(defunct @ Jun 25 2010, 20:22)  Цитата Хороший же тон - это когда ты делаешь отсчеты каждую миллисекунду, и они отличаются не более чем на плюс-минус одну единицу АЦП. Независимо от сигнала на входе? Да... интересное определение хорошего тона... Прикидываешься, да? Делаешь вид, что не понимаешь? Ладно, объясняю: вот пример работы 16-разрядного АЦП AD7980
Это не самый удачный пример, потому что плату не удалось развести по всем правилам из-за ее особенностей: она узкая (28 мм) и длинная, вследствие чего красный сигнал шумит больше чем на +-2 единицы, но сиреневый с желтым практически идеальны. Причем это - 16 разрядный АЦП с опорным 5 В, то есть единица младшего разряда здесь 5/65536=76.3 микровольт! Если же разработчик не может сделать нешумящим 10-разрядный АЦП, с единицей в 1 милливольт и вынужденный поэтому фильтровать примитивными пионерскими методами, то ему надо за это сразу отрывать руки.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|