AC voltmeter

Avdelningen för modifiering samt generell elektronik och teknik.
Post Reply
AT91RM9200
Posts: 8
Joined: 2008-02-03 18:09:54

AC voltmeter

Post by AT91RM9200 »

Hello the friends,
Good evening,

AC voltmeter:
Image

i hope, it become useful...

/////////////
16F877A//True RMS
///////////

#include <16F877A.h>
#fuses HS,NOPROTECT,NOWDT,NOLVP,NOWRT
#use delay(clock=20000000)

#byte ADRESH = 0x1E
#byte ADRESL = 0x9E
#byte ADCON0 = 0x1F
#byte ADCON1 = 0x9F
#bit ADGODONE = ADCON0.2

//ADC INT DEĞİŞKENLERİ
int1 v_i_sira_flag;
int8 onceki_v_ornek,onceki_i_ornek;
int8 ARG1L,ARG1H,RES0,RES1,RES2,RES3;
int16 adc_ornek;
int32 adc_ornek_kare;
int16 v_ornek_olcum_sayisi,i_ornek_olcum_sayisi;
int32 v_ornek_toplami,i_ornek_toplami;
//ADC INT CIKTILARI
int1 faz_sonu_flag;
int1 i_zero_flag;
int1 v_zero_flag;
int16 faz_suresi,faz_farki;
int16 v_faz_olcum_sayisi,i_faz_olcum_sayisi;
int32 v_faz_toplami,i_faz_toplami;

//GLOBAL ALT SUB DEĞİŞKENLERİ
int buf_int_01,buf_int_02,buf_int_03,buf_int_04,buf_int_05;
int16 buf_int16_01,buf_int16_02,buf_int16_03;

#include <math.h>
//#include <max7219.c>

#INT_AD
void ad_int(){

adc_ornek = MAKE16(ADRESH,ADRESL);

if (adc_ornek<512){ adc_ornek=512-adc_ornek; } else { adc_ornek=adc_ornek-512; }

////////////////////////////////////////////////////////////////////////////////
adc_ornek_kare = adc_ornek * adc_ornek;
////////////////////////////////////////////////////////////////////////////////
if (ADRESH>=2 && onceki_v_ornek<2){
faz_sonu_flag=1;
v_faz_toplami = v_ornek_toplami;
v_ornek_toplami = 0;
v_faz_olcum_sayisi = v_ornek_olcum_sayisi;
v_ornek_olcum_sayisi = 0;
v_zero_flag=0;
}
v_ornek_toplami = v_ornek_toplami + adc_ornek_kare;
onceki_v_ornek=ADRESH;
v_ornek_olcum_sayisi = v_ornek_olcum_sayisi + 1;
if (v_ornek_olcum_sayisi > 350) {v_zero_flag=1; v_ornek_olcum_sayisi=0; v_ornek_toplami=0;}

ADGODONE=1;
}

//OLCUM ORTALAMA HESAPLAMA DEĞİŞKENLERİ
int8 ortalama_sayaci;
int32 v_ortalama_toplami,i_ortalama_toplami;
int32 v_ortalama_olcum_sayisi,i_ortalama_olcum_sayisi;
float v_rms,v_rms_yedek;


void faz_degerlendir(){
ortalama_sayaci=ortalama_sayaci+1;
if (ortalama_sayaci!=20){
v_ortalama_toplami=v_ortalama_toplami+v_faz_toplami;
v_ortalama_olcum_sayisi=v_ortalama_olcum_sayisi+v_faz_olcum_sayisi;
}else{
v_rms = v_ortalama_toplami;
v_rms = (v_rms / v_ortalama_olcum_sayisi);

v_rms = SQRT(v_rms) * 4.88;

ortalama_sayaci=0;
v_ortalama_toplami=0;
v_ortalama_olcum_sayisi=0;
}
}
void bios(){
DISABLE_INTERRUPTS(GLOBAL);

ADCON0=0x81;
ADCON1=0xC0;

ENABLE_INTERRUPTS(INT_AD);

///////////////////////////////////
//DEĞİŞKENLER BAŞLANGIÇ DEĞERLERİ//
///////////////////////////////////
v_ornek_olcum_sayisi=0;
v_ornek_toplami=0;
ortalama_sayaci=0;
v_ortalama_toplami=0;
v_ortalama_olcum_sayisi=0;
///////////////////////////////////

ADGODONE=1;

ENABLE_INTERRUPTS(GLOBAL);

}

int16 a,b;
int c,d,e;
const int donusum[10] = {
0x3F,
0x06,
0x5B,
0x4F,
0x66,
0x6D,
0x7D,
0x07,
0x7F,
0x6F,


};

void main(){
bios();

while(True){
if (faz_sonu_flag){
faz_degerlendir();
faz_sonu_flag=0;
}

if (v_rms_yedek!=v_rms){
v_rms_yedek=v_rms;
a=v_rms;
b = a / 100;
c = b;
b = (a - (c*100))/10;
d = b;
b = a-(c*100)-(d*10);
e = b;
}

output_b(0x0E);
output_c(donusum[c]);
delay_ms(1);//0E
output_c(0);
output_b(0x0D);//0D
output_c(donusum[d]);
delay_ms(1);
output_c(0);
output_b(0x0B);//0B
output_c(donusum[e]);
delay_ms(1);
output_c(0);
}
}
User avatar
übermensch
Hedersbit
Posts: 3190
Joined: 2002-03-08 0:03:05
Location: Kista
Contact:

Post by übermensch »

The source is unreadable to anybody not speaking turkish. It would be a good idea to use english for variables and comments if you publish it outside Turkey. Also, why not build a normal rectified + integrating voltmeter?
In cars several processors are connected by a bus
AT91RM9200
Posts: 8
Joined: 2008-02-03 18:09:54

Post by AT91RM9200 »

Yes, sorry. I thought the advantage become, ::)
Post Reply