Jump to content

    
Sign in to follow this  
hd44780

Цифровой вольтметр-амперметр-ваттметр на AVR для бытовой сети

Recommended Posts

Вот делаю такую штуку - сабж.

Делается для себя, но хочется не только некий показометр (а-ля китайские барометры, которые показывают хрен знает что, мало зависящее от атмосферного давления), а прибор, на показания которого можно ориентироваться :biggrin: .

 

Схему измерительной части прилагаю. Резистор 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. Показания "бегают" - часто меняются в небольших пределах. Я могу поставить в цикл задержку - типа мерять раз в секунду, но меня такой способ чего-то смущает..

 

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

 

Спасибо.

post-7980-1300267046_thumb.png

Edited by hd44780

Share this post


Link to post
Share on other sites

2. Результаты для тока и напряжения складывать в кольцевой буфер, выводить среднее арифметическое для значений в буфере. Чем длиннее буфер, тем (по-моему) меньше будет прыгать :)

Share this post


Link to post
Share on other sites

Vasily_, ага. и платить 50 еврозеленых баксов :rolleyes: . Плюс накладные расходы....

Моя конструкция в разы дешевле получится, даже если я туда граф. дисплей прилеплю и нарисую на нем большие цифры.

Да и интересно просто. Я ж разработчик, а не юзер с замашками тупых бухгалтеров с единственной мыслью в голове - "нажал кнопку и оно само все посчитает" :blink: .

Я резко разбогатею, если начну паять эти ваттметры и продавать их по 50 евро :biggrin: .

 

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

 

И еще - как можно определить тот косинус угла между током и напряжением?

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

 

Я знаю, что там как-то анализируется время выхода синусоид "из нуля",

Время я могу посчитать, а что потом делать - мне непонятно :crying: .

Edited by hd44780

Share this post


Link to post
Share on other sites
И еще - как можно определить тот косинус угла между током и напряжением?

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

 

А его и не надо определять. Надо просто взять сумму произведений мгновенных значений тока на напряжение за период. Результатом и будет значение активной мощности.

 

Share this post


Link to post
Share on other sites
И еще - как можно определить тот косинус угла между током и напряжением?

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

Я определял с помощью детектора фазы.

Ловите переход напряжения через 0 запоминаете номер семпла, потом тока - тоже запоминаете номер семпла,

Потом нехитрыми формулами вычисляете дельту между семлами, конвертируете дельту в угол, и считаете cos.

Share this post


Link to post
Share on other sites
Надо просто взять сумму произведений мгновенных значений тока на напряжение за период. Результатом и будет значение активной мощности.

 

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

Попробую.

 

Ловите переход напряжения через 0 запоминаете номер семпла, потом тока - тоже запоминаете номер семпла,

Потом нехитрыми формулами вычисляете дельту между семлами, конвертируете дельту в угол, и считаете cos.

 

Дельта - разность? И как дельту в угол перевести?

Что такое "детектор фазы"?

Edited by hd44780

Share this post


Link to post
Share on other sites
Спасибо. Где-то видел такое. Наверное, в AVR465. Только не понял, на фига оно ...

 

Это, кажись, прямо из учебника Бессонова по ТОЭ. Там про мощности в цепи переменного тока хорошо написано ...

Share this post


Link to post
Share on other sites
Это, кажись, прямо из учебника Бессонова по ТОЭ. Там про мощности в цепи переменного тока хорошо написано ...

 

Книжку нашел (учебник 1996 г), почитаю.

Edited by hd44780

Share this post


Link to post
Share on other sites
Дельта - разность? И как дельту в угол перевести?

Ф = 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 к ненулевому.

Share this post


Link to post
Share on other sites
Ф = delta * 2 Pi * F / Fd,

 

....

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

 

Спасибо.

Диоды там уже есть :biggrin: .

 

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

Share this post


Link to post
Share on other sites
Спасибо.

Диоды там уже есть :biggrin: .

 

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

как мне кажеться у диода есть маленькая неприятность обычные кремниевые диоды имеют прямое падение напряжения около 0,6—0,7 вольт, применение диодов Шоттки позволяет снизить это значение до 0,2—0,4 вольт, а если сделать активный выпрямитель и того не останется :laughing:

Share this post


Link to post
Share on other sites

На ТТ у меня диод германиевый (старый советский Д220), в выпрямителе - кремниевые - 1N4007.

 

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

Не подкинете ли схемку?

 

Хотя я решил мерить амплитуду и делить ее на корень из 2 - как в букваре.

Среднее арифметическое сильно "бегает" (писал выше), кольцевой буфер на 200 значений не спас, больше делать не могу - килобайта памяти в меге 8 не хватает :(. Не вешать же туда SRAM на 64 КБ :wacko: ...

Среднеквадратичное бегает меньше, но дает завышенные результаты - почти в 2 раза (при 230 на входе показывает 380-400 :) ). Я, конечно, могу подогнать коэффициентом, но мне интересно - почему идет завышение? Может потому, что диод на входе пол-периода режет и надо сперва делить, потом поднимать уровень ОУ, а в микрокоде смещать обратно?

 

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

 

К мощности пока не приступал. Дай Бог с напряжением и током управиться :rolleyes: .

Edited by hd44780

Share this post


Link to post
Share on other sites
Насчет активного выпрямителя - была мысль, но схемы не нашел :(

 

Странно. Например, см. у М.Джонса в "Практической электронике". Да и у Хоровица и Хилла должно быть. Это же классическая схема - активный выпрямитель на ОУ ...

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this