AC 220V Okuma

Başlatan PICaso, 23 Kasım 2020, 15:33:29

PICaso

Arkadaşlar merhaba,

Pic18f45K22 ile şebeke gerilimini okuyup lcd ye yazmak istiyorum. Fakat lcd ye yazdığım değer 200v-240V arasında

sürekli değişiyor. Kodda ne gibi değişiklikler yapabilirim? Herkese kolay gelsin.

#include "config.h"
#include "lcd_16x2.h"

uint32_t led_timestamp = 0;
static uint8_t led_state = FALSE;

uint32_t adcUpdate_timestamp = 0;

char lcd_msg[LCD_BUFFER_LEN] = { 0 };
#define ADC_BUFFER_LENGTH   40u
uint16_t adc_data[ADC_BUFFER_LENGTH] = {0};
uint8_t adc_data_index = 0;

void main()
{
  // Select 16MHz Internal Oscillator
  OSCCONbits.IRCF = 0x07;             // From 1MHz to 16MHz
  InitTimer0 ();
  LCD_Init ();
  // Configure ADC
  ANSELAbits.ANSA0 = 1;     // Disable the Digital Input Buffer on AN0
  TRISAbits.RA0 = 1;        // AN0 as Input Pin
  
  ADCON1bits.PVCFG = 0x00;  // +Vref = AVDD
  ADCON1bits.NVCFG = 0x00;  // -Vref = AVSS
  
  ADCON2bits.ADFM = 0x01;   // Right Justified
  ADCON2bits.ACQT = 0x01;   // 2TAD
  ADCON2bits.ADCS = 0x05;   // FOSC/16
  
  ADCON0bits.CHS = 0x00;    // AN0 Selected
  ADCON0bits.ADON = 1;      // Enable ADC
  
  sprintf (lcd_msg, "    Embedded");
  LCD_Print_Line (0, lcd_msg);
  sprintf ( lcd_msg, "AC RMS = %dV", 0u);
  LCD_Print_Line (1, lcd_msg);
  LCD_Update ();
  while(1)
  {    
     sprintf ( lcd_msg, " VOLTAJ  OLCUMU ");
     LCD_Print_Line (0, lcd_msg); 
     LCD_Update ();
     
    
    // ADC Update Task
    if( millis() - adcUpdate_timestamp >= 1u )
    {
      uint32_t ac_value = 0;
      adcUpdate_timestamp = millis ();
      
      ADCON0bits.CHS = 0x00;    // AN0 Selected
      ADCON0bits.GODONE = 1;  // Start Conversion
      while(ADCON0bits.GO == 1);
      uint8_t adc_lo = ADRESL;
      uint8_t adc_hi = ADRESH;
      adc_data[adc_data_index] =  (uint16_t)(adc_hi << 8) | (uint16_t)adc_lo;
      adc_data_index++;
      if( adc_data_index >= ADC_BUFFER_LENGTH )
      {
        adc_data_index = 0u;
        // Time to Process and Display Data
        uint32_t adc_filter_val = 0;
        uint16_t adc_buf_local = 0;
        for( uint8_t i=0; i<ADC_BUFFER_LENGTH; i++ )
        {
          adc_buf_local = adc_data[i];
          adc_filter_val += ((uint32_t)(adc_buf_local*(uint32_t)adc_buf_local ));
        }
        // 625*625 = 390625
        // 128*128 = 16384
        // 625^2 / 128^2 = 23.8414
        adc_filter_val = (uint32_t)((float)adc_filter_val * 23.84);
        adc_filter_val /= ADC_BUFFER_LENGTH;      // mean squared sum
        adc_filter_val *= 2;   
        ac_value = (uint16_t)sqrt(adc_filter_val);// root mean square
        ac_value *= 68u;
        ac_value /= 1000u;
        
       sprintf ( lcd_msg, "AC RMS = %luV", ac_value);  
        LCD_Print_Line (1, lcd_msg);
        LCD_Update();
        
       
      }
    }
  }
}

PICaso


M.Salim GÜLLÜCE

Kullandığın devrede sıkıntı war.
-Bir kere kapasitör kullanmazsan 0 +230 arası tüm değerleri görürsün
Kapasitör kullandığında da deşarj olabilmeli.
Kısacası kurgun yanlış.
-ikincisi kurduğun devre senin çarpılma riskinide getirir.
Zira şebekeden gelen faz ile nötr kazara yer değiştirse devrenin tamamı yüksek voltaja bağlanmış olur.

Mümkünse trafo kullan.
yada optik veya galvanik izolasyon kullan.
Yüksek empedans girişli (10-50 MOhm gibi) bir fark amplifikatörü ile bağlanmaya çalış.
Şurada paylaştığım devre sana fikir verebilir.
Benzer şeylerde paylaşmıştım forumda aramanı tavsiye ederim.
https://www.picproje.org/index.php/topic,78254.msg601150.html#msg601150

PICaso

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 23 Kasım 2020, 15:58:18Kullandığın devrede sıkıntı war.
-Bir kere kapasitör kullanmazsan 0 +230 arası tüm değerleri görürsün
Kapasitör kullandığında da deşarj olabilmeli.
Kısacası kurgun yanlış.
-ikincisi kurduğun devre senin çarpılma riskinide getirir.
Zira şebekeden gelen faz ile nötr kazara yer değiştirse devrenin tamamı yüksek voltaja bağlanmış olur.

Mümkünse trafo kullan.
yada optik veya galvanik izolasyon kullan.
Yüksek empedans girişli (10-50 MOhm gibi) bir fark amplifikatörü ile bağlanmaya çalış.
Şurada paylaştığım devre sana fikir verebilir.
Benzer şeylerde paylaşmıştım forumda aramanı tavsiye ederim.
https://www.picproje.org/index.php/topic,78254.msg601150.html#msg601150

hocam trafo kullanmayı düşünmüyorum. proteusda program gayet güzel çalışıyor. Dediğiniz fişin takılma yönü önemli. AC

 nin 1 alternansını kullanarak, gerilim bölücüyle bu işi yapmak imkansız mıdır?

Mr.Thinking

bir multimetre de nasıl ölçülüyor ac voltaj? inceleyip uygulayabilirsiniz. Piyasa da endüstriyel bir sürü pano tipi ac ölçen cihazlar var çoğunda trafo kullanılmıyor. Onlara da bakabilirsiniz.
ego=1/Knowledge

M.Salim GÜLLÜCE

#5
Alıntı yapılan: PICaso - 23 Kasım 2020, 16:53:10hocam trafo kullanmayı düşünmüyorum. proteusda program gayet güzel çalışıyor. Dediğiniz fişin takılma yönü önemli. AC

 nin 1 alternansını kullanarak, gerilim bölücüyle bu işi yapmak imkansız mıdır?
Verdiğim linkteki devre alternans falan dinlemez iki giriş ucu arasındaki gerilim farkına bakar.
Çıkışındaki Opamp İntegral şeklinde revize edilip RMS DC ye dönüştürüldüğünde istediğini elde etmiş olursun.
İstersen 2000 volt ölç (Giriş dirençleri o voltaja dayanıklı olması şartı ile) farketmez ondan sonra.

PICaso

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 23 Kasım 2020, 19:13:45Verdiğim linkteki devre alternans falan dinlemez iki giriş ucu arasındaki gerilim farkına bakar.
Çıkışındaki Opamp İntegral şeklinde revize edilip RMS DC ye dönüştürüldüğünde istediğini elde etmiş olursun.
İstersen 2000 volt ölç (Giriş dirençleri o voltaja dayanıklı olması şartı ile) farketmez ondan sonra.
(Resim gizlendi görmek için tıklayın.)
Hocam AC voltaj rms değeri azaldığı ya da arttığı durumlarda opamp çıkışı da lineer olarak değişir mi?

TS954 yerine kullanabileceğim muadil entegre neler olabilir?

Erol YILMAZ

#7
LM358 veya LM324 kullanabilirsin.
Differantial amplifier yapısı endüstriyel elektronikte sıklıkla kullanılır.

Gerilim kazancı = 3K / (2x220K) olarak hesaplanır.
Çıkışın Ofset gerilimi 2.5v'tur.

Whats-App-Image-2020-11-24-at-11-47-46" border="0

Opampın Çıkışında 2.5V ofset gerilimine bindirilmiş 3/440 oranında zayıflatılmış girişteki AC sinyali göreceksin.
Bunu da ADC yardımıyla True RMS olarak okuyabilirsin.

Proteus

Kolay gelsin,

https://tr.aliexpress.com/item/33004868114.html

Diğer opamplı devreler ile aynı , en büyük farkı trafo ile izolasyon olması,

Kolay gelsin

PICaso

Alıntı yapılan: Erol YILMAZ - 24 Kasım 2020, 11:51:25LM358 veya LM324 kullanabilirsin.
Differantial amplifier yapısı endüstriyel elektronikte sıklıkla kullanılır.

Gerilim kazancı = 3K / (2x220K) olarak hesaplanır.
Çıkışın Ofset gerilimi 2.5v'tur.

Whats-App-Image-2020-11-24-at-11-47-46" border="0

Opampın Çıkışında 2.5V ofset gerilimine bindirilmiş 3/440 oranında zayıflatılmış girişteki AC sinyali göreceksin.
Bunu da ADC yardımıyla True RMS olarak okuyabilirsin.

Hocam True RMS ile ilgili bir tecrübem olmadı. Pic 18f45k22 ile yapılabilir mi?

Erol YILMAZ

tabi ki çok basit...

mehmet

ZC dan sonraki 90° de adc okuma yapabilirsiniz.
Buna göre de istediğiniz işlem yapılabilir...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

PICaso

Alıntı yapılan: mehmet - 24 Kasım 2020, 14:50:59ZC dan sonraki 90° de adc okuma yapabilirsiniz.
Buna göre de istediğiniz işlem yapılabilir...
True RMS konusu ile yapmaya çalışacağım. Dediğiniz gibi ZC yi algılayıp, 5ms timer başlatıp, timer sonunda ADC ile peak voltajı okumakta mantıklı.

ACM

#13
Alıntı yapılan: mehmet - 24 Kasım 2020, 14:50:59ZC dan sonraki 90° de adc okuma yapabilirsiniz.
Buna göre de istediğiniz işlem yapılabilir...

Erol hocamın devresi  sıfır geçişide yakalıyor yani ? Hemde direkt 220V girişle. Süüüüper , kopyala hemen.