Basit Elektronik Yük Devresi V2

Öncelikle şu düzeltmeyi yap. Yapay yükün güç kaynağından çektiği akım en kısa yoldan dönüş yapmalı. Mevcut pcb ile bütün kartı dolaşıyor, bu başta ölçüm hataları olmak üzere sorunlara sebep olacak.

İnput konektörünün GND pininin pcb bağlantısını kazıyarak kes. Tam gösterdiğim iki nokta arasına kalın bir kablo ile bağlantı yap. Yani input konektörünün kart ile GND bağlantısı sadece bu kablo ile olsun.


38510 eklentisine bak
Bu saatte yapmam mümkün değil. Yarın ancak.

Adc den okuduğun değeri 24.7 ile çarparsan mA cinsinden akımı ölçeceğini düşünüyorum. Ama yine oradaki kazanç dirençlerine göre falan düzeltme yapmamız lazım
500mA için ADC den okuduğum değeri 20.84 ile çarpınca Ekranda 500.16mA görüyorum.
Ama akımı aynı çarpanla 1A'e çıkarınca ekranda 1024mA görüyorum.

128mV ise biraz garip bir durum var. 3.9K ya 1.5K ise dirençler oranın gaini 3.6 olması lazım. Bu durumda ya kaynak akımı 0.5A değil ya da shuntlerin değerlerinde kayma var. Ama zaten bu summing amplifier işi benim çok aklıma yatmadı layout açısından oldukça sıkıntılı bir işlem. Yine lineerlik vs testi uzun baya. Bence amaç hızlıca bu yükü kullanmak ise, yani yük projesi yapmak değilse şu iki multimetre işini kullanman en pratiği
Kaynak akımını pensampermetre ile ölçüyorum. bir kaç mA hata olabili belki ama büyük hatalar yok. Shuntlerde sıkıntı vardır belki.
Yükü lazım olduğunda multimetreler ile her türlü kullanıyorum zaten. Amaç multimetre ve pensampermetreden kurtulup dahili ekranda görmek değerleri.
O dandik aletlere para vermem. Bana katacakları hiç bir şey yok. Evet kafam biraz kalın ama yinede bir şeyler öğreniyorum. O yüzden bu yolda ilerlemek işime geliyor. Gerekirse layout' u filan da değiştiririm. Yeterki mantıklı bir şema olsun elimde.
 
Yapay yük ile 500mA çektiğinde C_READ1 noktasında 99mV gerilim olmalı. Tabi eleman toleransları yüzünden bu bir miktar sapacaktır. Fakat yukarıda 0.128mV ölçtüğünü yazmışsın. Burada bir hata var gibi. 0.128mV değil de 0.128V olabilir mi?
Hemen tekrar ölçüyorum.
 
@HexfeT

20241127_032849.jpg
 
500mA için 128mV çıkış alıyoruz. Bu durumda C_READ1 noktasından 0.256mV/mA oranında gerilim aldığımızı varsayarsak kodu aşağıdaki gibi düzenlersen bir şeyler olacak gibi.

Kod:
akimDeger = analogRead(akimRead);
  voltajDususu = (akimDeger * 5.0) / 1023;
  akim = voltajDususu / 0.256;
 
500mA için 128mV çıkış alıyoruz. Bu durumda C_READ1 noktasından 0.256mV/mA oranında gerilim aldığımızı varsayarsak kodu aşağıdaki gibi düzenlersen bir şeyler olacak gibi.

Kod:
akimDeger = analogRead(akimRead);
  voltajDususu = (akimDeger * 5.0) / 1023;
  akim = voltajDususu / 0.256;
ekranda 0.46 görüyorum.
 
Yukarıdaki 0.128V ölçümü alırken ölçü aletinin siyah probunu dokunduğun GND noktasına göre ölçüm farklı çıkabilir. Tam opamp GND bacağına çok yakın bir noktada olmalı.

Ayrıca yukarıdaki PCB modifikasyonu yapılmazsa yapay yükün çektiği akıma göre okunan değerler çok oynak olacak.
 
Yatayım artık. Yarın devam edelim. Saat 2 de yatmaya karar verdim, saat 4 oldu. :)
 
Şimdi biraz toparlamaya çalışayım.
Yük girişi boşta iken A6 (Voltaj Okuma) pininden ölçtüğüm değer -0.0006V
Yüke 5V verdiğimde multimetreden 5.08V ölçerken Ekrandan 5.02V ölçüyorum.
Yüke 10V verdiğimde multimetreden 10V ölçerken Ekrandan 9.92V ölçüyorum.
Yüke 15V verdiğimde multimetreden 15.05V ölçerken Ekrandan 14.95V ölçüyorum.
Yüke 20V verdiğimde multimetreden 20.02V ölçerken Ekrandan 19.75V ölçüyorum.
Yüke 25V verdiğimde multimetreden 25V ölçerken Ekrandan 23.84V ölçüyorum.

ADC de bir lineerlik hatası var. Bu tip basit ADC lerde olur zaten.

Öncelikle R1 ve R2 gerilim bölücü dirençleri sök, soğumasını bekle. Sonra da tam olarak direnç değerlerini ölç ve bir kenara yaz. Cihaz 1 saat çalışsın, sonra da AREF i ölç ve bir kenara yaz.

Bir de şu anda kullandığın formülü de yaz. Daha önceki mesajlarda belki vardır bu bilgiler ama şu an için bir özet olması bakımından yeniden yazmakta fayda var. Formül ile olabilecek en yakın sonucu elde edelim.

Bunu elde edince, geri kalan hatayı da interpolasyon ile çözmen gerekecek. Mesela 10 farklı voltaj ölçümünü yapıp gerçek voltaj, hesaplanan voltaj tablosu yapacaksın. Sonra bu tabloya göre ölçülen değeri düzelteceksin. Ama önce yukarıdakileri halledelim. interpolasyonu sonra yaparız.
 
En az 5 farklı akım değeri için okuma yapın. Gerçek değer (örneğin multimetreden okuduğunuz) ve sizin devrenizin okuduğu değer. Bunları bir excel dosyasına yazıp grafiğini çizin. Offset hatası mı var yoksa doğrusallık sorunu mu var karşınıza hemen çıkacaktır. Akım arttıkça makas açılıyorsa doğrusallık sorunu, sürekli fazla yada eksik okuma durumu varsa (aynı miktarı) offset problemi vardır. İkisi bir arada da olabilir. Grafiği çizin kendiniz göreceksiniz. Daha sonra basit bir matematik işlemi ile okumanız gereken doğru değerleri ekrana yazdırırsınız.
 
Lineerlik hatası kesin var.

[imath]\frac{\normalsize 5.08}{\normalsize 5.02} < \frac{\normalsize 25}{\normalsize 23.84}[/imath]
 
Dirençeleri söküp ölçtüm.
%1 toleranslı 18K : 17.996
%0.1 toleranslı 3.24K : 3.229 (Bunun vadedilen toleransı yanlış. Hesaplamama göre %0.33 toleransılı bu.)

Dirençleri devreye geri takıp beklemeye başladım. 1 saat sonra ölçeceğim.
Ayrıca @HexfeT 'in gece söylediği ground kısayol olayınıda yaptım.
Öncelikle şu düzeltmeyi yap. Yapay yükün güç kaynağından çektiği akım en kısa yoldan dönüş yapmalı. Mevcut pcb ile bütün kartı dolaşıyor, bu başta ölçüm hataları olmak üzere sorunlara sebep olacak.

İnput konektörünün GND pininin pcb bağlantısını kazıyarak kes. Tam gösterdiğim iki nokta arasına kalın bir kablo ile bağlantı yap. Yani input konektörünün kart ile GND bağlantısı sadece bu kablo ile olsun.


38510 eklentisine bak
 
Şönt gibi düşük değerli dirençlerde bağlantı noktası bile ölçüm değerini etkiler. Kalibrasyon şart.
 
ADC de bir lineerlik hatası var. Bu tip basit ADC lerde olur zaten.

Öncelikle R1 ve R2 gerilim bölücü dirençleri sök, soğumasını bekle. Sonra da tam olarak direnç değerlerini ölç ve bir kenara yaz. Cihaz 1 saat çalışsın, sonra da AREF i ölç ve bir kenara yaz.

Bir de şu anda kullandığın formülü de yaz. Daha önceki mesajlarda belki vardır bu bilgiler ama şu an için bir özet olması bakımından yeniden yazmakta fayda var. Formül ile olabilecek en yakın sonucu elde edelim.

Bunu elde edince, geri kalan hatayı da interpolasyon ile çözmen gerekecek. Mesela 10 farklı voltaj ölçümünü yapıp gerçek voltaj, hesaplanan voltaj tablosu yapacaksın. Sonra bu tabloya göre ölçülen değeri düzelteceksin. Ama önce yukarıdakileri halledelim. interpolasyonu sonra yaparız.

Tüm ölçümler aşağıdaki gibi.

R1: 17996
R2: 3229
AREF: 4995

MULTİMETREEKRAN
5.04V4.99V
7.546V7.51V
10V9.98V
12.437V12.39V
15.14V15.08V
17.5V17.43V
20.05V19.83V
22.5V21.99V
25.16V24.01

C++:
//Voltaj Değişkenleri ///////////////
const int voltajRead = A6;
int voltajDeger = 0;
const float R1 = 17996.0;
const float R2 = 3229.0;
float voltaj = 0.0;
float girisVoltaji = 0.0;
//////////////////////////////////////

// Voltaj Okuma Kodları /////////////////////////////////////////
  voltajDeger = analogRead(voltajRead);
  voltaj = (voltajDeger * 4.995) / 1023;
  girisVoltaji = voltaj * (R1 + R2) / R2;
///////////////////////////////////////////////////////////////
 
Tamam şimdi iş senin en favori kısmına geldi :gulus2: Yukarıda voltajı hesaplıyorsun ya, o voltajı bir düzeltme katsayısı ile çarpman lazım.

Multimetre değerlerini bir array içerisine koy

Kod:
float gercek_deger[] =
{
  5.04,
  7.546,
  *
  *
  *
};

ekran değerlerini de bir array içerisine koy

Kod:
float olculen_deger[] =
{
  4.99,
  7.51,
  *
  *
  *
};

Sonra da öyle bir algoritma yazacağız ki, verilen bir değeri ölçülen değerler tablosundan gerçek değer tablosuna ölçeklendirecek.
 
Böyle bir algoritmayı hemen chatgpt ye yazdırabilirsin, ama doğru çalışmazsa sarfedeceğin zaman, yeni yazmaktan daha uzun olabilir :) Ama mantığını anlaman için bana verdiği cevabı ekleyeyim buraya

1732710286617.png


Şu da ürettiği kod. Bana çok kalabalık geldi, ama dediğim gibi, olayın mantığını anlamak için kullan, aynen kopyama

C:
#include <stdio.h>

// Function to perform interpolation
float interpolate(float adc_table[], float real_table[], int size, float adc_value) {
    // Clamp adc_value to the bounds of adc_table
    if (adc_value <= adc_table[0]) {
        return real_table[0];
    } else if (adc_value >= adc_table[size - 1]) {
        return real_table[size - 1];
    }

    // Find the segment [i, i+1] containing adc_value
    int i;
    for (i = 0; i < size - 1; i++) {
        if (adc_table[i] <= adc_value && adc_value < adc_table[i + 1]) {
            break;
        }
    }

    // Perform linear interpolation
    float adc_low = adc_table[i];
    float adc_high = adc_table[i + 1];
    float real_low = real_table[i];
    float real_high = real_table[i + 1];

    float real_value = real_low + ((adc_value - adc_low) / (adc_high - adc_low)) * (real_high - real_low);
    return real_value;
}

int main() {
    // Example tables
    float adc_table[10] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
    float real_table[10] = {0.0, 0.95, 1.8, 2.7, 3.55, 4.4, 5.2, 6.1, 7.0, 7.9};

    // Test with a sample adc_value
    float adc_value = 3.25;
    float real_value = interpolate(adc_table, real_table, 10, adc_value);

    printf("ADC Value: %.2f, Real Value: %.2f\n", adc_value, real_value);
    return 0;
}
 
Böyle bir algoritmayı hemen chatgpt ye yazdırabilirsin, ama doğru çalışmazsa sarfedeceğin zaman, yeni yazmaktan daha uzun olabilir :) Ama mantığını anlaman için bana verdiği cevabı ekleyeyim buraya

38526 eklentisine bak

Şu da ürettiği kod. Bana çok kalabalık geldi, ama dediğim gibi, olayın mantığını anlamak için kullan, aynen kopyama

C:
#include <stdio.h>

// Function to perform interpolation
float interpolate(float adc_table[], float real_table[], int size, float adc_value) {
    // Clamp adc_value to the bounds of adc_table
    if (adc_value <= adc_table[0]) {
        return real_table[0];
    } else if (adc_value >= adc_table[size - 1]) {
        return real_table[size - 1];
    }

    // Find the segment [i, i+1] containing adc_value
    int i;
    for (i = 0; i < size - 1; i++) {
        if (adc_table[i] <= adc_value && adc_value < adc_table[i + 1]) {
            break;
        }
    }

    // Perform linear interpolation
    float adc_low = adc_table[i];
    float adc_high = adc_table[i + 1];
    float real_low = real_table[i];
    float real_high = real_table[i + 1];

    float real_value = real_low + ((adc_value - adc_low) / (adc_high - adc_low)) * (real_high - real_low);
    return real_value;
}

int main() {
    // Example tables
    float adc_table[10] = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
    float real_table[10] = {0.0, 0.95, 1.8, 2.7, 3.55, 4.4, 5.2, 6.1, 7.0, 7.9};

    // Test with a sample adc_value
    float adc_value = 3.25;
    float real_value = interpolate(adc_table, real_table, 10, adc_value);

    printf("ADC Value: %.2f, Real Value: %.2f\n", adc_value, real_value);
    return 0;
}
Eve geçeyim bakacağım abi. Biraz dışarı çıkmam gerekti. Ben çıkmayalı çok şey değişmiş dışarıda. :katil2:
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,981
Mesajlar
119,259
Üyeler
2,835
Son üye
alpermete

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top