Перейти к содержанию
    

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

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

Делается для себя, но хочется не только некий показометр (а-ля китайские барометры, которые показывают хрен знает что, мало зависящее от атмосферного давления), а прибор, на показания которого можно ориентироваться :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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем это делать http://www.conrad.com/VOLTCRAFT-ENERGY-LOG...f75c01%2Fmd5%7D и это работает точно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

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

 

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

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

 

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

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Попробую.

 

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

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

 

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

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ф = delta * 2 Pi * F / Fd,

 

....

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

 

Спасибо.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

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

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

 

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

 

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

Изменено пользователем hd44780

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет активного выпрямителя - была мысль, но схемы не нашел :(

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я неточно выразился. Я не пойму, куда мне его ставить?

Если б была 2-я вторичка на понижащем трансе, там понятно, а тут ....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...