Hello the friends,
Good evening,
AC voltmeter:
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);
}
}
AC voltmeter
- übermensch
- Hedersbit
- Posts: 3190
- Joined: 2002-03-08 0:03:05
- Location: Kista
- Contact: