Merhaba 3 fazlı jenaratörün voltajlarını ve frekansını ölçmem gerekiyor. altaki devre ile tek fazın frekansını ve gerilimini ölçtüm ama bunu 3 faza uyarlayamadım. jenaratörden sadece 3 faz cıkıyor nötr hattı yok denildi. su pompasını çalıştırıyormuş.
3 faz için 3 ayrı trafo bunların giriş kısmını üçgen çıkışlarını ise yıldız bağlantı yaparak 2. resimdeki şekilde 12v üzerinden hem devreyi besleyip hemde ac voltajların ölçümünü yapabilir miyim.
Eğer bu çizim doğru ise trafo tavsiyesi verebilir misiniz küçük boyutlu olmasını tercihimdir.
eğer çizim yanlış yada mantık hatalı ise konu hakkında tavsiyelerinizi dilerim.
Tek Faz
Not: devreyi pic16f1827 ile yaptım
(https://i.ibb.co/PmsrXbF/ac-voltaj.jpg) (https://ibb.co/PmsrXbF)
(https://i.ibb.co/vBpQ6XY/Whats-App-Image-2024-09-05-at-19-59-18.jpg) (https://ibb.co/vBpQ6XY)
3Faz için tasarım
(https://i.ibb.co/H7Zr8YX/3faz.jpg) (https://ibb.co/H7Zr8YX)
Benim tavsiyem enerjiyi tam izole bir yöntem ile ölçüm yapılması daha saglıklı olur parazit ve yüksek gerilim işlemciye ulaşmamalı
True rms ölçüm konusunda araştırma yapınız.
Öncelikle izolasyonsuz mevcut devrenizin endüstriyel şartlarda hiç şansı yok, mevcut durumda sıfır koruma olduğu için çok uzun ömürlü olacağını zannetmiyorum.
Ben olsam araya AMC3330 gibi bir izole amplifier koyarım, en azından işlemci tarafı güvende olur. 10kv'a kadar dalgalanma koruması var. Bu girişi aynı zamanda gerilim bölücüden sonra zenerle korurdum.
#include <18f252.H>//18 1 2012
#device adc=10 //voltaj dan frekans olcme
#use delay(clock=20000000)
#fuses noPROTECT,noWDT,PUT,BROWNOUT,HS
/***entegreterbiyecisi@yahoo.com***/
#use fast_io (a)
#use fast_io (b)
#use fast_io (c)
int16 val,adc_val=0,adc_sample=0,freq=0,fr=0,vg=0,vb=0;
float volt_add;
unsigned ms=1;
signed int vfm();
/***entegreterbiyecisi@yahoo.com***/
///////////////////4094lcd
#define Strobe PIN_b1
#define data PIN_b2
#define clock PIN_b3
#include "lcd4094.c"
/***entegreterbiyecisi@yahoo.com***/
int16 t1_val;
#int_timer1
void mas(){
t1_val ++;
}
///////////////////////////////////////////////
void main(){
setup_adc_ports (ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
SET_TRIS_B (0b10000001);
//setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
//set_timer1(5500);
lcd_init();
/***entegreterbiyecisi@yahoo.com***/
delay_ms (100);
lcd_gotoxy(1,1);
printf (LCD_PutC, "GEN ");
delay_ms(500);
lcd_gotoxy(1,1);
printf (LCD_PutC, " FRQ VOLT " );
delay_ms (500);
////////////////////////////////////////////////////////////////////////////////
while(true){
///////////////////////////////////////V F mess
if(ms== 1){
vfm();
lcd_gotoxy(1,2);
printf(lcd_putc,"\%3ldHz %3ldV ",fr,vg);
if(vg<120){
lcd_gotoxy(1,2);
printf(lcd_putc,"ERR ");
}
ms=0;
}
/*delay_ms(50);
set_adc_channel(1);
delay_us(10);
vb=read_adc();
lcd_gotoxy(13,1);
printf(lcd_putc,"\%3ldV ",vb);
*/
if(!input(pin_b7)){ms=1;while(!input(pin_b7)){;}}
}
}
////////////////////////////////////////////////////////////////////////////////
signed int vfm(){
int32 time_out = 0;
set_adc_channel(0);
delay_us(10);
time_out = 0;
while(read_adc()>512 && ++time_out <5000 );
if(time_out >= 5000 ) return(-1);
time_out=0;
while(read_adc()<512 && ++time_out <5000 );
if(time_out >=5000) return(-1);
time_out=0;
volt_add =0;
adc_sample =0;
t1_val =0;
freq =0;
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
set_timer1(5500);
/////////////////////////////////////////////
while(true){
adc_val = read_adc();
volt_add = volt_add +adc_val;
adc_sample++;
if(adc_val<513) break;
}
/////////////////////////////////////////////
freq=(t1_val*60000)+(get_timer1()-5500);
fr = 320000/freq; //4*8*10000us (1/2 cycle 50hz 10 ms)
val = volt_add / adc_sample;
vg = (val-511) * 1.13;
return(0);
}
//#include "lcd4094.c"
///////////////////////////////////4094(Shift Register) 3wire Serial To Parallel
byte d0,d1,d2,d3,d4,d5,d6,d7;
/*
#IFNDEF data
#define data PIN_A0
#define clock PIN_A1
#define strobe PIN_A2
#ENDIF
*/
//4094 Shift Register
void set_shift(int8 value)
{
int8 location=0,n=0;
location=128;
for(n=1;n<=8;n++){
if ((value & location)>0) output_bit(data,1); else output_bit(data, 0);
output_bit(clock,1);
location=location / 2;
output_bit(clock,0);
}
output_bit(strobe,1);
output_bit(strobe,0);
}
//////////////////////////
void f_output(byte value){
set_shift(value);
}
//////////////////////////
void fatport(){
int value;
value=0;
if (d0==1) value=value+1;
if (d1==1) value=value+2;
if (d2==1) value=value+4;
if (d3==1) value=value+8;
if (d4==1) value=value+16;
if (d5==1) value=value+32;
if (d6==1) value=value+64;
if (d7==1) value=value+128;
f_output(value);
}
//////////////////////////
void dg0(int value){
d0=value;
fatport();
}
//////////////////////////
void dg1(int value){
d1=value;
fatport();
}
//////////////////////////
void dg2(int value){
d2=value;
fatport();
}
//////////////////////////
void dg3(int value){
d3=value;
fatport();
}
//////////////////////////
void dg4(int value){
d4=value;
fatport();
}
//////////////////////////
void dg5(int value){
d5=value;
fatport();
}
//////////////////////////
void dg6(int value){
d6=value;
fatport();
}
//////////////////////////
void dg7(int value){
d7=value;
fatport();
}
//////////////////////////
void f_output_bit(byte pin,value)
{
switch(pin)
{
case 1:dg0(value);
break;
case 2:dg1(value);
break;
case 3:dg2(value);
break;
case 4:dg3(value);
break;
case 5:dg4(value);
break;
case 6:dg5(value);
break;
case 7:dg6(value);
break;
case 8:dg7(value);
break;
}
}
//////////////////////////
void f_output_high(byte pin){
switch(pin){
case 1:dg0(1);
break;
case 2:dg1(1);
break;
case 3:dg2(1);
break;
case 4:dg3(1);
break;
case 5:dg4(1);
break;
case 6:dg5(1);
break;
case 7:dg6(1);
break;
case 8:dg7(1);
break;
}
}
//////////////////////////
void f_output_low(byte pin){
switch(pin){
case 1:dg0(0);
break;
case 2:dg1(0);
break;
case 3:dg2(0);
break;
case 4:dg3(0);
break;
case 5:dg4(0);
break;
case 6:dg5(0);
break;
case 7:dg6(0);
break;
case 8:dg7(0);
break;
}
}
//////////////////////////////////////////////////////////////////////flex_lcd.c
#define LCD_RS 3 //Q2
//#define LCD_RW -->>GND
#define LCD_E 4 //Q3
#define LCD_DB4 5 //Q4
#define LCD_DB5 6 //Q5
#define LCD_DB6 7 //Q6
#define LCD_DB7 8 //Q7
//========================================
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
//-------------------------------------
void lcd_send_nibble(int8 nibble){
// Note: !! converts an integer expression
// to a boolean (1 or 0).
f_output_bit(LCD_DB4, !!(nibble & 1));
f_output_bit(LCD_DB5, !!(nibble & 2));
f_output_bit(LCD_DB6, !!(nibble & 4));
f_output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
f_output_high(LCD_E);
delay_us(2);
f_output_low(LCD_E);
}
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address,int8 n){
f_output_low(LCD_RS);
delay_us(60);
if(address)
f_output_high(LCD_RS);
else
f_output_low(LCD_RS);
delay_cycles(1);
f_output_low(LCD_E);
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}
//----------------------------
void lcd_init(void){
int8 i;
f_output_low(LCD_RS);
f_output_low(LCD_E);
delay_ms(15);
for(i=0 ;i < 3; i++){
lcd_send_nibble(0x03);
delay_ms(5);
}
lcd_send_nibble(0x02);
for(i=0;i<sizeof(LCD_INIT_STRING);i++){
lcd_send_byte(0, LCD_INIT_STRING[i]);
}
}
//----------------------------
void lcd_gotoxy(int8 x,int8 y){
int8 address;
if(y != 1)
address = lcd_line_two;
else
address=0;
address += x-1;
lcd_send_byte(0, 0x80 | address);
}
//-----------------------------
void lcd_putc(char c){
switch(c){
case '\f':
lcd_send_byte(0,1);
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1,2);
break;
case '\b':
lcd_send_byte(0,0x10);
break;
default:
lcd_send_byte(1,c);
break;
}
}
/////////////////////////////////////////////////////////////////////////lCD SON
(https://i.ibb.co/60VknQp/gen-ac4094.png) (https://ibb.co/60VknQp)