Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Цифровой вольтметр-амперметр-ваттметр на AVR для бытовой сети
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4
hd44780
Вот делаю такую штуку - сабж.
Делается для себя, но хочется не только некий показометр (а-ля китайские барометры, которые показывают хрен знает что, мало зависящее от атмосферного давления), а прибор, на показания которого можно ориентироваться biggrin.gif .

Схему измерительной части прилагаю. Резистор R2 - многооборотный. На выходе ТТ предполагается еще поставить ОУ с переключаемым Ку как в AVR465 (для низкоточных нагрузок), но пока его там нету - сразу в ATMega8.
БП на LM7805, мегу и LCD рисовать не стал - все стандартно. Генератор внутренний, 8МГц.

Я принципиально не стал ставить шунт и делитель. С гальванической развязкой надежнее.
Измерительные узлы отдельно от МК и цифровой части проверены обычным мультиметром на различных нагрузках (от 25Вт паяльника до 10КВт кухонной печки) - они полностью адекватны и работают нормально.

Обработка данных такая:
1. АЦП на частоте 125 кГц цифрует сигнал. Обработчик прерывания Считает суммы отсчетов и их кол-во:
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
dword adc_data, temp;

// Read the AD conversion result
adc_data=ADCW&0xFFFE;

if(isU)
{ // U
temp=adc_data; //*adc_data;
sqr_summU+=temp;
countU++;
} // if
else
{ // I
temp=adc_data; //*adc_data;
sqr_summI+=temp;
countI++;
} // else
} // adc_isr

2. Главная программа меряет по очереди ток и напряжение:

.............
// Измерение напряжения
isU=1;
sqr_summU=0;
countU=0;
ADMUX&=0xFE; // ADC0 - канал напряжения
// Запуск АЦП
ADCSRA|=0x40; // ADCSC - Start ADC
startMs=ms;
// ожидание 21 мс (20мс - период 50 Гц)
while (abs (ms-startMs)<21);
// стоп АЦП
ADCSRA&=0xBF; // 10111111 = BF
.............

для тока также, только переменные другие. Переменная ms глобальная - TC1 по прерыванию считает миллисекунды.

3. Когда оба померяли, вычисляем

// Расчет напряжения
// Среднеквадратическое
// Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
f_sqr_summU = ((float)sqr_summU)/countU; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

// Uацп=ADC*Vref/1024=ADC*0.005
U = f_sqr_summU*0.005;

// Uвх=Urms*109.52
U*=109.52;

// Расчет тока
// Среднеквадратическое
// Urms=sqrt(sum(u(i)^2)/N); u(i) - мгновенные отсчеты (с АЦП), i=1..N
f_sqr_summI = ((float)sqr_summI)/countI; // ср. арифм.
// f_sqr_summ=sqrt(f_sqr_summ); // Urms (отсчеты АЦП)

// Uацп=ADC*Vref/1024=ADC*0.005
I = f_sqr_summI*0.005;

// Iн=500*Uацп/148,86 =Uацп*3.359
I*=3.359;

// S - Полная мощность
S_temp=((dword)I*U);
S=S_temp;

4. после этого вывод на дисплей.

Калибровки пока нету, но будет.

Заметил странности:
1. При среднеквадратических было завышение показаний почти в 2 раза - вместо 220-230в показывал 380-400. По току аналогично. Поставил среднеарифметическое - нормально стало....
Почему? Или я чего-то прозевал?
2. Показания "бегают" - часто меняются в небольших пределах. Я могу поставить в цикл задержку - типа мерять раз в секунду, но меня такой способ чего-то смущает..

Может кто что посоветует?

Спасибо.
Vasily_
А зачем это делать http://www.conrad.com/VOLTCRAFT-ENERGY-LOG...f75c01%2Fmd5%7D и это работает точно!
RabidRabbit
2. Результаты для тока и напряжения складывать в кольцевой буфер, выводить среднее арифметическое для значений в буфере. Чем длиннее буфер, тем (по-моему) меньше будет прыгать sm.gif
hd44780
Vasily_, ага. и платить 50 еврозеленых баксов rolleyes.gif . Плюс накладные расходы....
Моя конструкция в разы дешевле получится, даже если я туда граф. дисплей прилеплю и нарисую на нем большие цифры.
Да и интересно просто. Я ж разработчик, а не юзер с замашками тупых бухгалтеров с единственной мыслью в голове - "нажал кнопку и оно само все посчитает" blink.gif .
Я резко разбогатею, если начну паять эти ваттметры и продавать их по 50 евро biggrin.gif .

RabidRabbit, попробую, спасибо за идею.

И еще - как можно определить тот косинус угла между током и напряжением?
Для определения не только полной мощности (S=UI), но и активной (P=UI*cos(phi)).

Я знаю, что там как-то анализируется время выхода синусоид "из нуля",
Время я могу посчитать, а что потом делать - мне непонятно crying.gif .
dimka76
Цитата(hd44780 @ Mar 16 2011, 15:32) *
И еще - как можно определить тот косинус угла между током и напряжением?
Для определения не только полной мощности (S=UI), но и активной (P=UI*cos(phi)).


А его и не надо определять. Надо просто взять сумму произведений мгновенных значений тока на напряжение за период. Результатом и будет значение активной мощности.
defunct
Цитата(hd44780 @ Mar 16 2011, 14:32) *
И еще - как можно определить тот косинус угла между током и напряжением?
Для определения не только полной мощности (S=UI), но и активной (P=UI*cos(phi)).

Я определял с помощью детектора фазы.
Ловите переход напряжения через 0 запоминаете номер семпла, потом тока - тоже запоминаете номер семпла,
Потом нехитрыми формулами вычисляете дельту между семлами, конвертируете дельту в угол, и считаете cos.
hd44780
Цитата(dimka76 @ Mar 16 2011, 15:26) *
Надо просто взять сумму произведений мгновенных значений тока на напряжение за период. Результатом и будет значение активной мощности.


Спасибо. Где-то видел такое. Наверное, в AVR465. Только не понял, на фига оно ...
Попробую.

Цитата(defunct @ Mar 16 2011, 15:47) *
Ловите переход напряжения через 0 запоминаете номер семпла, потом тока - тоже запоминаете номер семпла,
Потом нехитрыми формулами вычисляете дельту между семлами, конвертируете дельту в угол, и считаете cos.


Дельта - разность? И как дельту в угол перевести?
Что такое "детектор фазы"?
kovigor
Цитата(hd44780 @ Mar 16 2011, 18:03) *
Спасибо. Где-то видел такое. Наверное, в AVR465. Только не понял, на фига оно ...


Это, кажись, прямо из учебника Бессонова по ТОЭ. Там про мощности в цепи переменного тока хорошо написано ...
hd44780
Цитата(kovigor @ Mar 16 2011, 18:12) *
Это, кажись, прямо из учебника Бессонова по ТОЭ. Там про мощности в цепи переменного тока хорошо написано ...


Книжку нашел (учебник 1996 г), почитаю.
defunct
Цитата(hd44780 @ Mar 16 2011, 16:03) *
Дельта - разность? И как дельту в угол перевести?

Ф = delta * 2 Pi * F / Fd,
где Ф - искомый угол, F - частота входного сигнала, Fd - частота дискретизации, delta - разность между номером семла перехода напряжения через 0 и номером семпла перехода тока через 0.

На практике у вас, например, есть частота дискретизации Fd = 4kHz с которой оцифровывается входной сигнал и частота входного сигнала - 50Гц.
За период входного сигнала, будет 4K / 50 = 80 семлов, 80 семплов это 2Pi, формула преобразования соотв:
Ф = delta * 2 Pi / 80.

Детектор фазы это есть - способ определения где был переход через 0. Можно программно, можно компаратором. Удобнее всего просто срезать диодом отрицательную полуволну входного сигнала, тогда условием перехода через 0 будет переход от семпла равного 0 к ненулевому.
hd44780
Цитата(defunct @ Mar 18 2011, 15:30) *
Ф = delta * 2 Pi * F / Fd,

....
Детектор фазы это есть - способ определения где был переход через 0. Можно программно, можно компаратором. Удобнее всего просто срезать диодом отрицательную полуволну входного сигнала, тогда условием перехода через 0 будет переход от семпла равного 0 к ненулевому.


Спасибо.
Диоды там уже есть biggrin.gif .

Надеюсь, на выходных проверю все это...
KaMa3eR
Цитата(hd44780 @ Mar 18 2011, 17:20) *
Спасибо.
Диоды там уже есть biggrin.gif .

Надеюсь, на выходных проверю все это...

как мне кажеться у диода есть маленькая неприятность обычные кремниевые диоды имеют прямое падение напряжения около 0,6—0,7 вольт, применение диодов Шоттки позволяет снизить это значение до 0,2—0,4 вольт, а если сделать активный выпрямитель и того не останется laughing.gif
hd44780
На ТТ у меня диод германиевый (старый советский Д220), в выпрямителе - кремниевые - 1N4007.

Насчет активного выпрямителя - была мысль, но схемы не нашел sad.gif . Одни абстрактные размышления на тему попадались. Из которых схему трудно сделать. Мне, по крайней мере.
Не подкинете ли схемку?

Хотя я решил мерить амплитуду и делить ее на корень из 2 - как в букваре.
Среднее арифметическое сильно "бегает" (писал выше), кольцевой буфер на 200 значений не спас, больше делать не могу - килобайта памяти в меге 8 не хватает sad.gif. Не вешать же туда SRAM на 64 КБ wacko.gif ...
Среднеквадратичное бегает меньше, но дает завышенные результаты - почти в 2 раза (при 230 на входе показывает 380-400 sm.gif ). Я, конечно, могу подогнать коэффициентом, но мне интересно - почему идет завышение? Может потому, что диод на входе пол-периода режет и надо сперва делить, потом поднимать уровень ОУ, а в микрокоде смещать обратно?

А вчера проектик нарыл - берет 1000 отсчетов, меряет по ним максимум и делит на коэффициент. Правда не знаю, как такой подход с т.з. теории.

К мощности пока не приступал. Дай Бог с напряжением и током управиться rolleyes.gif .
kovigor
Цитата(hd44780 @ Mar 20 2011, 16:34) *
Насчет активного выпрямителя - была мысль, но схемы не нашел sad.gif


Странно. Например, см. у М.Джонса в "Практической электронике". Да и у Хоровица и Хилла должно быть. Это же классическая схема - активный выпрямитель на ОУ ...
hd44780
Я неточно выразился. Я не пойму, куда мне его ставить?
Если б была 2-я вторичка на понижащем трансе, там понятно, а тут ....
nk@
Google рулитsm.gif
Вот почитайте, насчет выпрямителей. Коротко и понятно.
http://de.ifmo.ru/bk_netra/page.php?tutindex=36&index=13
Последняя схемка, кстати, используется в болгарских приводах постоянного тока. Классика sm.gif
azizcheg
Добрый день всем.
Хочу сделать подобное. На мк ATMEGA128 построить вольтметр/ваттметр. Выводить на 3 семисегментных элемента. Подскажите где посмотреть. Если кто делал, напишите, пожалуйста, на azizcheg@gmail.com.
hd44780
Я пока в процессе... Долбаное напряжение померить не могу ...
Постоянку миллион раз мерил - с датчиков давления/влажности, БП делал со встроенным вольтметром - с первого раза оживало.
А тут - уже неделю парюсь... Вроде все понятно, а ни фига не получается wacko.gif .

3-х фазный вольтметр переменного тока - http://www.embed.com.ua/raznoe/tryohfaznyi...remennogo-toka/
Как раз с 7 сегм индикатором. Правда Mega48. А зачем тебе 128 мега?
Ваттметр на Mega8 -
http://radiokot.ru/circuit/digital/measure/23/
http://www.radiokot.ru/forum/viewtopic.php?f=25&t=25937

Только ток шунтами мерить я очень не люблю. Конечно, дешевле ТТ во много раз, но и проблем полно сопутствующих.
ASZ
Цитата(hd44780 @ Mar 21 2011, 12:25) *
Я пока в процессе... Долбаное напряжение померить не могу ...
Постоянку миллион раз мерил - с датчиков давления/влажности, БП делал со встроенным вольтметром - с первого раза оживало.
А тут - уже неделю парюсь... Вроде все понятно, а ни фига не получается wacko.gif
...skipped...

Мне непонятно, зачем вообще диоды ставить и иметь головную боль из-за их нелинейности?
Погасить на делителе до приемлемой величины и сместить положительным напряжением до нуля посередине. И АЦПируйтесь наздоровье.
Кстаати, у германиевых диодов ВАХ от температуры сильно зависит.
hd44780
Цитата(ASZ @ Mar 21 2011, 11:15) *
Мне непонятно, зачем вообще диоды ставить и иметь головную боль из-за их нелинейности?
Погасить на делителе до приемлемой величины и сместить положительным напряжением до нуля посередине. И АЦПируйтесь наздоровье.
Кстаати, у германиевых диодов ВАХ от температуры сильно зависит.


Пока только для комнатной температуры. Пока алгоритмы не обкатаю. Потом сделаю активный делитель на ОУ со смещением.
Диод по напряжению - кремниевый, из диодного моста (схема в первом посте). Или такая схема плоха?
ASZ
Цитата(hd44780 @ Mar 21 2011, 13:48) *
Пока только для комнатной температуры. Пока алгоритмы не обкатаю. Потом сделаю активный делитель на ОУ со смещением.
Диод по напряжению - кремниевый, из диодного моста (схема в первом посте). Или такая схема плоха?

Посмотрите прямую ветвь ВАХ Ваших диодов. Диод открывается при напряжении >0,8В (? - склероз) и имеет очень большую нелинейность.
Таким образом, при малых напряжениях Вы получите сверхпогрешность.

А зачем вообще ставить ОУ? С трансформатора и так достаточно большое напряжение sm.gif
hd44780
Не понял sad.gif ...
Я ж получаю полож. полуволну с верхнего входа моста .... Зачем ее смещать?
Если б была 2-я вторичка, там были бы обе полуволны.
nk@
Цитата(ASZ @ Mar 21 2011, 12:11) *
А зачем вообще ставить ОУ? С трансформатора и так достаточно большое напряжение sm.gif


На ОУ собирается "прецизионный выпрямитель". Все уже давно придумано до (для) нас sm.gif
Можно, в принципе, засемплировать синусоиду, проинтегрировать и посчитать среднеквадратичное значение, но аналоговая техника справится с этим быстрее и точнее. Гораздо проще мерять постоянное напряжение. С ВЧ помехами, опять-же программно бороться будет не просто. Ну, это все конечно, если мы хотим иметь прибор, а не коробочку с лампочками, которая будет показывать значения в попугайчиках sm.gif

PS:Ну, уж если есть желание решить задачу исключительно программно, то это очень интересная и объемная тема для обсуждения.
e_one
Занимался подобной задачей. Для развязки от сети использовал схему из книги Полупроводниковая схемотехника У. Тице и К. Шенк, страница 469.
измерение делал 1 раз в миллисекунду. Синхронизировал начало измерений с переходом синуса через ноль. Измерял 1 полный период. по прерыванию от таймера запускал преобразование АЦП, потом USUM=(ADCW>>2)*(ADCW>>2)+USUM; и по следующем переходе через 0 подсчитывал RESULT=sqrt(USUM/N);
Задача точности остро не стояла. реально пришлось увеличить количество периодов измерения до 10. Погрешность измерений примерно +-1В.
Тестировал эту схему в диапазоне температур от 20 до 55 градусов и напряжений 150-230В. заметил, что оба оптрона должны иметь одну температуру - находится рядом, иначе точность теряется.

Но это было давно, сейчас вопрос возник и чтоб не создавать новую тему решил написать здесь.

Кто знает, какой минимальный уровень напряжение может быть на входе опорного напряжения АЦП меги16. В даташите молчат, может кто-то подскажет ответ?
RabidRabbit
Цитата(hd44780 @ Mar 20 2011, 15:34) *
Среднее арифметическое сильно "бегает" (писал выше), кольцевой буфер на 200 значений не спас, больше делать не могу - килобайта памяти в меге 8 не хватает sad.gif. Не вешать же туда SRAM на 64 КБ wacko.gif ...
Мнэээ, а float у Вас сколько битов? Не то если по 32 - то как два буфера (напряжение и ток) 200 * 2 * 4 влезло в 1 килобайт? С сишным компилятором и один, я думаю, не влезет... А если всё-таки влезло 200 значений, то какой же должен быть разброс, болтанка в 10 вольт при таком раскладе даст изменение в результате только на 5 сотых...
hd44780
Я на С в CvAvr пишу.

float у него 4 байта вроде - никакой памяти не хватит складывать их в буфер. 1 буфер = 4*200 = 800 байт - почти весь SRAM Mega8.
Не цеплять же мне ATMega32 ...

В буфер я клал 8-битовые значения с АЦП. 2 буфера - по 200 значений на напряжение и ток.
Мож где ошибся в дальнейших обсчетах... Хз...

Сейчас сделал среднее арифметическое отсчетов АЦП без буфера за 1000 замеров без таймера - тьфу-тьфу вроде получше стало...
С началом полуволны пока не синхронизируюсь. Но в будущем может и понадобится. Для определения угла сдвига фаз между напряжением и током. Ну это потом.
Сделал пока только для напряжения.
Токовый транс пока отключил. Все равно, алгоритмы замеров идентичные, отличия только в коэффициентах..
RabidRabbit
Цитата(hd44780 @ Mar 21 2011, 18:35) *
В буфер я клал 8-битовые значения с АЦП. 2 буфера - по 200 значений на напряжение и ток. Мож где ошибся в дальнейших обсчетах... Хз...
Я, конечно, не спец, но если задаться интервалом в 400 вольт, да поделить этот интервал на 256 (8-битовые отсчёты), то на один бит придётся около 1.5 вольта, как-то так... И чего вы таки хотите? Для более-менее приличных результатов, по-моему, можно что-то типа оверсэмплинга применить, например 64 восьмибитных замера сложить, результат поделить на 8 (получив "одиннадцатибитный" результат), далее всё же организовать кольцевой буфер на 16 "одиннадцатибитных" значений, и, добавив очередное, считать сумму значений из буфера и поделить на 16.
hd44780
С буфером получается вот что:

// Для сумм
//volatile dword summU;
volatile byte arrayU[200];

// Кол-во преобразований напряжения и тока
volatile word count_U=0;

................


// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
word adc_data=ADCW;

adc_data>>=2;
arrayU[count_U]=adc_data&0xFF;
count_U++;
if (count_U>=200)
count_U=0;
} // adc_isr

..........
// Обрабока
f_sqr_summU=0.0;
for (i=0;i<200;i++)
{
f_sqr_summU+=(float)arrayU[i];
} // for
sprintf (buffer, "A=%.2f ", f_sqr_summU);
hd44780_puts_xy ( 0, 0, buffer );

f_sqr_summU/=200;

// Uацп=ср*5/1024
f_sqr_summU=f_sqr_summU*5.0/1024;
sprintf (buffer, "B=%.2f ", f_sqr_summU);
hd44780_puts_xy ( 8, 0, buffer );

На дисплее:
A=19360 B=0.47

Т.е. сумма значений в буфере - 19360 (примерно, оно меняется все время)
U на входе АЦП = 0.47в, хотя на самом деле там 2.00-2.50в
nk@
А AD делает отличные RMS to DC конвертеры:
http://www.analog.com/static/imported-file...heets/AD636.pdf
http://www.analog.com/static/imported-file...heets/AD637.pdf
А дальше меряем постоянное напряжение - и всех делов sm.gif

PS: Прошу прощения, цена почти 20 бакинских. Дороговато sad.gif
hd44780
Еще и достать их не очень....
Правда из доки можно кой-чего интересного нарыть.
hd44780
К вопросу о тех кольцевых буферах.

С какой частотой должны идти выборки в эти буфера?
Сейчас у меня АЦП тактируется 125 кГц. Сколько там получится сэмплов в секунду я посчитать пока не удосужился (в доке как-то мутно про это написано sad.gif ), но, думается 100KSPS наберется. 1 сэмпл за 10 мкс.
Т.е. 200 байт буфера полностью обновятся за 2 мс. Т.е. весь буфер не вмещает даже полпериода 50 герцового сигнала.

Это нормально? Или надо понижать частоту выборки?

e_one, не знаю. Посмотрел я схему, не понял ее.
azizcheg
Цитата(hd44780 @ Mar 21 2011, 11:25) *
3-х фазный вольтметр переменного тока - http://www.embed.com.ua/raznoe/tryohfaznyi...remennogo-toka/
Как раз с 7 сегм индикатором. Правда Mega48. А зачем тебе 128 мега?
Ваттметр на Mega8 -
http://radiokot.ru/circuit/digital/measure/23/
http://www.radiokot.ru/forum/viewtopic.php?f=25&t=25937


128 мега потому, что они есть на фирме, а остальных нет вроде.
И вообще я думал и ваттметр и вольтметр объединить в одном устройстве. А вольты выводить или ватты - переключается каким-нибудь тумблером.
Возможна ли такая реализация?
hd44780
Цитата(azizcheg @ Mar 22 2011, 09:38) *
128 мега потому, что они есть на фирме, а остальных нет вроде.
И вообще я думал и ваттметр и вольтметр объединить в одном устройстве. А вольты выводить или ватты - переключается каким-нибудь тумблером.
Возможна ли такая реализация?


Возможна. В принципе, все равно, какая там мега. Главное, чтобы АЦП был. Но он у любой меги есть.
Идея простая - меряете всегда и все. А выводите на дисплей что-то одно.

Лично у меня пока проблемы с измерениями crying.gif . Напряжение вроде нормально показывает, но все время "бегает"...
azizcheg
Цитата(hd44780 @ Mar 22 2011, 11:02) *
Лично у меня пока проблемы с измерениями crying.gif . Напряжение вроде нормально показывает, но все время "бегает"...


Что значит бегает?
Как вообще, в принципе осуществляется измерение этого напряжения(тока)? Чуть дайте теории пожалуйста :-)
hd44780
Цитата(azizcheg @ Mar 22 2011, 10:13) *
Что значит бегает?
Как вообще, в принципе осуществляется измерение этого напряжения(тока)? Чуть дайте теории пожалуйста :-)


Схема в первом посте темы. Мега там не нарисована, только моя измерительная часть.
Программная часть у меня такая (наиболее удачный вариант на текущий момент).
АЦП работает на 125кГц.
Обработчик АЦП суммирует все получаемые отсчеты и считает их кол-во. Как насчитает 1000 штук - останов АЦП (по флагу, в главной программе).
Далее считает среднее арифметическое этих отсчетов. По нему вычисляется напряжение на входе АЦП (формула из ДШ на проц). И умножается на коэффициент делителя (в моем случае это коэф транса*коэф деления потенциометра). Это есть напряжение в сети.

"Бегает" - меняется в небольших пределах.
Я "на глаз" наблюдал диапазон примерно 210..230в. Мультиметр показывает где-то 230. Наверное, можно втупую брать максимум, но я не уверен.

Для тока алгоритм такой же, только последний коэффициент другой, он зависит от того, как вы ток меряете.
Если шунтом - просто закон ома. Если ТТ, то иначе...

Для мощности посложнее. Поэтому и хочется не коэффициентами подгонять, а понять, что там происходит.
RabidRabbit
Цитата(hd44780 @ Mar 22 2011, 10:11) *
К вопросу о тех кольцевых буферах. С какой частотой должны идти выборки в эти буфера?
Сейчас у меня АЦП тактируется 125 кГц. Сколько там получится сэмплов в секунду я посчитать пока не удосужился (в доке как-то мутно про это написано sad.gif ), но, думается 100KSPS наберется. 1 сэмпл за 10 мкс.
Т.е. 200 байт буфера полностью обновятся за 2 мс. Т.е. весь буфер не вмещает даже полпериода 50 герцового сигнала.
Это нормально? Или надо понижать частоту выборки?

Семён Семёныч! В кольцевые буферы я предлагал складывать уже вычисленные значения напряжения и тока wink.gif Я думаю, вполне хватит по 16 значений тока и напряжения. Чтобы не было неоднозначностей, набросаю код.
CODE

#define MY_BUFFER_SIZE 16

float get_voltage( const float mesuredVoltage )
{
static float voltage[MY_BUFFER_SIZE] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static int pos = 0;
int i;
float result = 0;

//
voltage[pos++] = mesuredVoltage;
//
if ( pos >= MY_BUFFER_SIZE )
pos = 0;
//
for ( i = 0; i < MY_BUFFER_SIZE; i++ )
{
//
result += voltage[i];
}
//
return result / MY_BUFFER_SIZE;
}

И такую же фигню для тока sm.gif
ASZ
Цитата(hd44780 @ Mar 21 2011, 13:34) *
Не понял sad.gif ...
Я ж получаю полож. полуволну с верхнего входа моста .... Зачем ее смещать?
Если б была 2-я вторичка, там были бы обе полуволны.

А зачем вообще выпрямлять? Делителем уменьшаете ПЕРЕМЕННОЕ напряжение трансформатора напряжения до 2/3 максимального входного АЦП и смещаете его до середины шкалы.
Разность Umax-Umin=Ua дает Вам амплитудное значение измеренного напряжения. Действующее значение для синусоиды U=0,707Ua.
Этим избавляетесь от всяких нелинейностей от диодов и значительно упрощаете схему (3 резистора!).
Это же касается и цепи тока.

Лично считаю, что усложнять схему ради упрощения программы - дурной тон.
RabidRabbit
Цитата(hd44780 @ Mar 22 2011, 11:34) *
АЦП работает на 125кГц.
Обработчик АЦП суммирует все получаемые отсчеты и считает их кол-во. Как насчитает 1000 штук - останов АЦП (по флагу, в главной программе).
Далее считает среднее арифметическое этих отсчетов. По нему вычисляется напряжение на входе АЦП (формула из ДШ на проц). И умножается на коэффициент делителя (в моем случае это коэф транса*коэф деления потенциометра). Это есть напряжение в сети.

Как-то это по-моему не очень правильно. На мой взгляд, лучше зарядить таймер на частоту 1000 Гц, в обработчике прерывания запускать одиночное преобразование, дожидаться его завершения и результат приплюсовывать к накопителю. 100 отсчётов АЦП в таком случае перекроют 5 периодов частоты 50 Гц, что снимает необходимость ловить переход через 0 (я надеюсь, у Вас мега от кварца тактируется). По сумме этих 100 отсчётов (ну или 200, лишь бы на 20 делилось) можно вычислить напряжение. Скакать не должно sm.gif
hd44780
RabidRabbit, спасибо. я так не пытался wink.gif .
Попробую. Если, конечно потянет считать float значения прямо в прерывании. Но можно и целочисленно сделать, в умноженных на 1000, например.

Цитата(RabidRabbit @ Mar 22 2011, 11:28) *
лучше зарядить таймер на частоту 1000 Гц, в обработчике прерывания запускать одиночное преобразование, дожидаться его завершения и результат приплюсовывать к накопителю. 100 отсчётов АЦП в таком случае перекроют 5 периодов частоты 50 Гц, что снимает необходимость ловить переход через 0 (я надеюсь, у Вас мега от кварца тактируется). По сумме этих 100 отсчётов (ну или 200, лишь бы на 20 делилось) можно вычислить напряжение. Скакать не должно sm.gif


Есть у меня такая мысль. Наверное сделаю.
Сейчас мега тактируется от внутренних 8MHz, просто ног не хватает sad.gif . На PB (там, где кварц) у меня ШД LCD сидит.
Можно поставить и 16-ю мегу ...

Цитата(ASZ @ Mar 22 2011, 11:12) *
А зачем вообще выпрямлять? Делителем уменьшаете ПЕРЕМЕННОЕ напряжение трансформатора напряжения до 2/3 максимального входного АЦП и смещаете его до середины шкалы.
Разность Umax-Umin=Ua дает Вам амплитудное значение измеренного напряжения. Действующее значение для синусоиды U=0,707Ua.


А можно потенциометр включить ко вторичке параллельно мосту, а напряжение на движке смещать?
RabidRabbit
Цитата(hd44780 @ Mar 22 2011, 12:45) *
Попробую. Если, конечно потянет считать float значения прямо в прерывании. Но можно и целочисленно сделать, в умноженных на 1000, например.
Вы правильно понимаете - не нужны float'ы в прерывании. В прерывании, например, можно суммировать целочисленные значения от АЦП (как есть, не надо их ни на что умножать, только в случае 8-битных значений для 100 замеров хватит 16-битной переменной, а для 10-битных значений уже надо 24-битную или 32-битную). Просуммировали 100 значений - скопировать в какую-нибудь глобальную переменную, увеличить другую глобальную переменную на 1, чтобы просигналить основной задаче о доступности нового результата, и снова суммировать сотню значений sm.gif Если я недоступно излагаю - спрашивайте в личке, например sm.gif
hd44780
Цитата(RabidRabbit @ Mar 22 2011, 12:03) *
Если я недоступно излагаю - спрашивайте в личке, например sm.gif


Да нет, все понятно. Спасибо. Напишу, проверю вечером. Я на работе, железо дома biggrin.gif .

У меня отсчеты 10-битные, суммирую в беззнаковый 32 бит.
ASZ
Цитата(hd44780 @ Mar 22 2011, 12:45) *
...skipped...
А можно потенциометр включить ко вторичке параллельно мосту, а напряжение на движке смещать?

Можно, если постоянное напряжение после моста НИКАК не связано с измерительной схемой.
hd44780
Цитата(ASZ @ Mar 22 2011, 14:53) *
Можно, если постоянное напряжение после моста НИКАК не связано с измерительной схемой.


Мост питает мегу и LCD. Обычный БП на LM7805.
hd44780
RabidRabbit, с буферами вроде получилось. Показывает 213-214 при где-то 230 в. Но это без калибровки, коэффициенты "на глаз".

Теперь, наверное, займусь смещением и среднеквадратическим.
MaslovVG
Позволю себе заметиь.
Первое для определения среднего не нужен буфер.
вычисляем по формуле
Аy= ((к-1)Ac+M)/k где Ac предидущее среднее, Ау новое среднее, М последнее измерение, к глубина усреднения(эквивалентна длине буфера)
при к равном степени двойки вычисления сводатся к двум сложениям идвум сдвигам.
Измерять лучше средне квадратичное значение и тока и напряжения и мощности без всяких выпрямителей. При этом можно измерять несинусоидальные величины.
hd44780
Цитата(MaslovVG @ Mar 22 2011, 22:20) *
Измерять лучше средне квадратичное значение и тока и напряжения и мощности без всяких выпрямителей. При этом можно измерять несинусоидальные величины.


Я знаю, что среднеквадратичное лучше disco.gif . Но через выпрямитель/диод фигня получается sad.gif . Пытался.
Сейчас как раз занимаюсь сборкой измерительной цепи без выпрямителя rolleyes.gif . Жаль, что только по вечерам ...
hd44780
Без выпрямителя я вот такое вижу - схема. Вместо 2-го транса можно взять 2-ю вторичку.
Как сделать то же на одной обмотке, при наличии средней точки - не знаю sad.gif.
Если кто знает - подскажите плиз.
dimka76
Цитата(hd44780 @ Mar 23 2011, 12:39) *
Как сделать то же на одной обмотке, при наличии средней точки - не знаю sad.gif.

Нажмите для просмотра прикрепленного файла
hd44780
dimka76, спасибо. Попробую.

Tanya
Цитата(hd44780 @ Mar 23 2011, 14:54) *
dimka76, спасибо. Попробую.

Попробуйте лучше операционный усилитель.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.