BASIC4MCU | 질문게시판 | Atmega128 220V AC 전압, 전류 센싱
페이지 정보
작성자 Board 작성일2019-06-07 14:57 조회11,536회 댓글1건본문
안녕하세요, 오늘도 고생 많으시고 항상 도움주셔서 감사드립니다.
Atmega128을 사용해서 에너지 미터링을 하고싶습니다.
조사해보니 순시전력을 에너지 미터링 ic를 사용하지않고 MCU만으로 가능이 불가능하다고 하셨었는데
https://learn.openenergymonitor.org/electricity-monitoring/ct-sensors/interface-with-arduino
이 글을 보니 가능 할것같아서 질문드립니다.
60hz 의 교류전압을 직류 바이어스를 가해주어 맥류로 ADC를 하는 방법까지는 이해했습니다.
real_power=sum_inst_power/number_of_samples;
아래 코딩의 이부분에서 한주기동안의 adc한 전류와 전압을 누적한후 number_of_samples 로 평균내는 과정인데
이 샘플링 수가 분주비 128 16000000/128=125kHZ 이니 (1/60)/(1/125000) 이 되는게 맞는건가요?
또 이 과정이 MCU로 가능한 작업일까요?
#include <avr/io.h>
#include <math.h>
int16_t GetVoltage(uint8_t ch)//9.80(mv/digit)즉 1digit당 약 3deg/s,전압 센싱
{
int16_t val=0;
ADMUX=0x40; // 채널 선택
ADCSRA|=(1<<ADSC); // AD 변환 시작
while(!(ADCSRA&(1<<ADIF))){} // 변환 종료시까지 다음 실행 대기
val=ADC;
ADCSRA|=(1<<ADIF); // ADIF=0
return val;
}
//
int16_t GetCurrent(uint8_t ch)// 9.80(mv/digit)즉 1digit당 약 3deg/s // 전류 센싱
{
int16_t val=0;
ADMUX=0x41; // 채널 선택
ADCSRA|=(1<<ADSC); // AD 변환 시작
while(!(ADCSRA&(1<<ADIF))){} // 변환 종료시까지 다음 실행 대기
val=ADC;
ADCSRA|=(1<<ADIF); // ADIF=0
return val;
}
//
int main(void)
{
float inst_voltage,inst_current,inst_power,real_power,sum_inst_power,number_of_samples,
sum_squared_voltage,mean_square_voltage,root_mean_square_voltage,squared_voltage,
squared_current,sum_squared_current,root_mean_square_current,mean_square_current,
apparent_power,power_factor=0; // 전력 측정 변수
DDRF=0;
PORTF=0;
ADMUX=0x40;
ADCSRA=(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADPS2);
//분주비 128 16000000/128=125kHZ
while(1)
{
/*idea
실제 전력은 순시전력의 평균이다.
순간 전류 측정값*순간 전압 측정값=순시 전력
주어진 샘플 수에 대한 순시 전력 측정 값을 합한 다음 그 샘플 수로 나눈다*/
//순시전력 inst_power
inst_voltage=(GetVoltage(0)*5/1024-2.5)*10*(220/12); // 전압분배 1/10,220V AC-12V AC Adapter 220/12
inst_current=(GetCurrent(0)*5/1024-2.5)*62.5/10; // 변류비 62.5,Burden=10 옴
number_of_samples=(1/60)/(1/125000);
inst_power=inst_voltage*inst_current;
sum_inst_power+=inst_power;
real_power=sum_inst_power/number_of_samples;
//----------------------------------------------------------------------------------------
// RMS 전압 squared_voltage
squared_voltage=inst_voltage*inst_voltage;
sum_squared_voltage+=squared_voltage;
mean_square_voltage=sum_squared_voltage/number_of_samples;
root_mean_square_voltage=sqrt(mean_square_voltage);
//----------------------------------------------------------------------------------------
// RMS 전류 squared_current
squared_current=inst_current*inst_current;
sum_squared_current+=squared_current;
mean_square_current=sum_squared_current/number_of_samples;
root_mean_square_current=sqrt(mean_square_current);
//----------------------------------------------------------------------------------------
apparent_power=root_mean_square_voltage*root_mean_square_current; // 피상전력 구하기(220V로 가정해도 상관없을듯)
power_factor=real_power/apparent_power; //역률(power_factor)구하기
}
}
댓글 1
조회수 11,536master님의 댓글
master 작성일
순시전력이란 매 순간 변화하는 전압과 전류를 곱해서 전력을 계산해줘야합니다.
저항부하만 존재한다면 전압위상과 전류위상의 차이가 없지만
L,C 부하는 위상의 변화가 발생하므로 매 순간 전력을 계산해야합니다.
또, 전압은 사인파 모양이 거의 그대로 유지되지만 전류파형의 경우에는 사인파가 아닌 형상일 수 있으므로
전류파형의 주파수 성분이 높다면 아주 빠른 연산을 필요로 합니다.
즉, 어떤 부하의 전력을 계산하느냐에 따라서 MCU만으로 가능할 수도 있고 불가능할 수도 있는 것입니다.