|
|
  |
Алгоритм измерния RMS напряжения |
|
|
|
May 6 2008, 16:40
|
Частый гость
 
Группа: Участник
Сообщений: 169
Регистрация: 31-08-05
Из: New York
Пользователь №: 8 118

|
На первый взгляд - это просто метод последовательных приближений. Как будто в АЦП, только с квадратом внутри.
--------------------
ASB
|
|
|
|
|
May 6 2008, 16:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(Kuzmi4 @ May 6 2008, 19:23)  Касательно "fast integer square root" - может кто-то доступно объяснить подоплёку отого чЮда ? Всмысле вроде метод нъютона - это где производные, а откуда там взялись эти махинации с битами ?? .....  Если махинации с битами - то это уже не Ньютона :-) Вот, нашёл в гуглогрупсах старое(там цитирования надо поразворачивать) О, тут не вся тема, зато чистым текстом http://files.kpv.nnov.ru/sqrt16b.txtА для компенсации постоянки отдельно вычислять среднее арифметическое и вычитать его из каждого отсчёта не нужно (заодно массив отсчётов пропадает, экономия ОЗУ). Делается это так: Накапиливается в двух накопителях - сумма квадратов и сумма отсчётов. В конце цикла измерения вычисляем средний квадрат без компенсации постоянки и среднее значение (постоянку). Из среднего квадрата вычитаем квадрат среднего. Всё, получили среднее квадрата отклонения от постоянки. Т.е. (тут нормально формулы не написать - нет ни тегов sup/sub, ни надчерка) sqr() - это возведение в квадрат average( sqr( x - average(x) ) ) = average( sqr(x) ) - sqr( average( x ) ) При необходимости из этого извлечь корень. О, нашёл в RU.EMBEDDED ещё более старую тему, но там есть С-шный 8-битниковый вариант, писался под 8051. И где-то в сети есть ассемблерный вариант для AVR, автор Александр Труш (тоже на грани тысячелетий в эхе/ньюсах где-то пробегало, я на паре сайтов видел вывешенное, но не помню где).
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
May 6 2008, 18:08
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(ReAl @ May 6 2008, 20:47)  А для компенсации постоянки отдельно вычислять среднее арифметическое и вычитать его из каждого отсчёта не нужно (заодно массив отсчётов пропадает, экономия ОЗУ). Делается это так: Накапиливается в двух накопителях - сумма квадратов и сумма отсчётов. В конце цикла измерения вычисляем средний квадрат без компенсации постоянки и среднее значение (постоянку). Из среднего квадрата вычитаем квадрат среднего. Всё, получили среднее квадрата отклонения от постоянки. Это совершенно правильно. Но только в том случае, если нас устраивает получение значения только 1 раз за период (20 мс при 50 Гц). Чтобы получать значение вдвое чаще - придётся завести ещё 2 накопителя и вычислять всё это со сдвигом в 10 мс. И т.д., по 2 накопителя на каждое дополнительное получение значения за период. Если нужно вычислять значения с максимально возможной частотой (с частотой осчётов АЦП), то эффективнее использовать FIFO отсчётов, FIFO квадратов отсчётов, накопитель отсчётов и накопитель квадратов отсчётов. При получении очередного отсчёта АЦП: 1. Прибавлять его к накопителю остчётов, квадрат его прибавлять к накопителю квадратов отсчётов. 2. Значения из хвостов соответствующих FIFO вычитать из соответствующих накопителей. 3. Заносить новые значения в головы соответствующих FIFO (при этом значения из хвостов FIFO затрутся). Ну а дальше как у вас - из накопителя квадратов отсчётов вычитаем квадрат накопителя отсчётов.
|
|
|
|
|
May 6 2008, 19:41
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(galjoen @ May 7 2008, 00:08)  При получении очередного отсчёта АЦП: 1. Прибавлять его к накопителю остчётов, квадрат его прибавлять к накопителю квадратов отсчётов. 2. Значения из хвостов соответствующих FIFO вычитать из соответствующих накопителей. 3. Заносить новые значения в головы соответствующих FIFO (при этом значения из хвостов FIFO затрутся). Ну а дальше как у вас - из накопителя квадратов отсчётов вычитаем квадрат накопителя отсчётов. Хочу заметить/предупредить, что такой способ вычисления скользящего среднего пригоден только для случая целочисленных значений. При использовании плавучки быстро накапливаются ошибки округления. Цитата(domowoj @ May 6 2008, 23:37)  Batman Подскажите где взять инфу про "пояс Роговского"??? Где, где... в ГуглЕ  Вот первая же ссылка http://www.phys.nsu.ru/electricity/Labwork4-3.html
|
|
|
|
|
May 7 2008, 04:46
|
Бывалый
    
Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615

|
Цитата(Batman @ May 6 2008, 16:49)  Датчик - петля Роговского. Вы в курсе, что петля Роговского дифференцирует сигнал ? Я эти проблемы уже решал, поэтому в курсе. Цитата(Batman @ May 6 2008, 16:49)  Точность нужна - 5 %. Но хотелось бы выжать больше по возможности. Не иначе как блок защиты к автоматческому выключателю делаете. Цитата(Batman @ May 6 2008, 16:49)  Пробую сейчас сумму квадратов - ресурсов жрет немеряно, а показания от АЦП - все время 171 при любом сигнале от датчика, 0 при нулевом.  ) Где-то накосячил. Но думаю этот способ получше, чем просто усреднять. Буду разбираться. Без теории тут никак не обойтись.  Цитата(Batman @ May 6 2008, 17:39)  Кстати при использовании функции sqrt() (WinAvr) код из 3 КБ раскабанел до 8 КБ. Еще пару корней - и побегу в магазин за жестким диском .  А если подумать, то корень не понадобится вообще.  Цитата(SSerge @ May 6 2008, 19:01)  Кстати, а зачем корень вычислять? Проще уставку возвести в квадрат и с этим значением и сравнивать насчитанное. Точно. Цитата(galjoen @ May 6 2008, 22:08)  При получении очередного отсчёта АЦП: 1. Прибавлять его к накопителю остчётов, квадрат его прибавлять к накопителю квадратов отсчётов. 2. Значения из хвостов соответствующих FIFO вычитать из соответствующих накопителей. 3. Заносить новые значения в головы соответствующих FIFO (при этом значения из хвостов FIFO затрутся). Ну а дальше как у вас - из накопителя квадратов отсчётов вычитаем квадрат накопителя отсчётов. Все правильно. Еще одна мысль. Можно RMS считать не за 20 мс, а на за 10 мс, как все нормальные люди делают.
|
|
|
|
|
May 7 2008, 06:12
|
Местный
  
Группа: Свой
Сообщений: 230
Регистрация: 7-04-08
Из: Украина, Запорожье
Пользователь №: 36 541

|
Цитата(SSerge @ May 6 2008, 18:01)  Кстати, а зачем корень вычислять? Проще уставку возвести в квадрат и с этим значением и сравнивать насчитанное. Я тако понял, что нужно еще выводить текущее значение тока. Так что одним сравнением не обойтись. Цитата(ReAl @ May 6 2008, 19:47)  А для компенсации постоянки отдельно вычислять среднее арифметическое и вычитать его из каждого отсчёта не нужно (заодно массив отсчётов пропадает, экономия ОЗУ). Делается это так: Накапиливается в двух накопителях - сумма квадратов и сумма отсчётов. В конце цикла измерения вычисляем средний квадрат без компенсации постоянки и среднее значение (постоянку). Из среднего квадрата вычитаем квадрат среднего. Всё, получили среднее квадрата отклонения от постоянки. Я бы предложил вести накопитель для среднего арифметического с обновлением через несколько полупериодов. И вычитать его из каждого измерения и возводить в квадрат. Насколько я понимаю, то тут постоянная составляющая будет достаточно "постоянна". Массивы тут по поределению не нужны.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|