ADC Problemi

Bowman

Üye
Katılım
7 Ekim 2022
Mesajlar
95
K tipi termokuplu ADC ile okuyup bir formül üzerinden gerilim hesaplatıyorum. Elimdeki bir kartta termokupl okuyan devre var. Sağlam çalıştığına eminim. Ben de o devre üzerinden sıcaklık ve gerilim okuması yaptım. Hangi sıcaklık sonucunda mikrodenetleyicinin ADC bacağına hangi gerilimin geldiğinin tablosunu oluşturdum. Sonrasında nümerik analiz yöntemlerinden biri olan en küçük kareler yöntemi(least squares method) kullanarak gerilim-sıcaklık formülü oluşturdum.

Formülde y = mx + b için m ve b parametreleri hesaplanıyor. Videonun linki bu izleyip öğrenmek isteyenler için. Y gerilimi, x ise sıcaklığı gösteriyor. Yaptığım işlemde m'yi 0.0035, b'i ise 0.0984 olarak buldum. Yani formül y = 0.0035x + 0.0984.

Adamlar elimdeki kartta NXP'nin MKL16Z128VLH4 işlemcisini kullanmış. Ben de Nuvoton'un M031SD2AE mikrodenetleyicisini kullanıyorum. İki işlemci de ARM Cortex-M0 mimarisine sahip. Fakat NXP'nin işlemcisinin ADC'si 8,10,12 bit programlanabilir şekilde. Bendeki ADC ise direkt 12 bit.

Kusura bakmayın biraz uzun tutuyorum ama en açık şekilde anlaşılsın istiyorum. Problem burada başlıyor. Ben kartta mikrodenetleyiciyi söktüm ve mikrodenetleyiciye giden bacağı bir kablo ile kendi geliştirme kartımın ADC pinine aldım. Önce gerilimi okumak istedim. 20 derece için yaklaşık 190mV okuyorum multimetrede. Sonrasında aynı bacağı ADC pinine bağladım ve Keil watch ekranında gelen saf adc değerlerine baktım. ADC değerlerini önce size'ı 25 olan bir buffera attım ve onun ortalamasını aldım. Böylece biraz daha stabil bir değer alırım diye düşündüm. Yaklaşık olarak 50-60 arasında bir adc değerleri okuyorum.

Fakat işlem yapmaya geçersem benim işlemcimin adc referans gerilimi 3.3V, çözünürlüğü ise 12 bit yani 4096. ADC kanalından okuduğum gerilimi şu formülle hesapladım. Gerilim = (3.3*adc değeri) / 4095.

Bu işlemi multimetrede okuduğum 190 mV için yaptım. Gerilim yerine 0.190 yazdım. Elde ettiğim sonuç yaklaşık olarak 235. Yani benim adc değerini 235 olarak okumam gerekirken 50-60 arası okuyorum. Bu bana adamların adc yi 10 bit çözünürlükte kullandığı çıkarımını verdi.

Ben de kodumda şöyle bir şey yaptım.

C:
#define M_PARAMETER    0.0035
#define B_PARAMETER 0.0984

double k_thermo_value(double adcValue)
{
    adcVoltage = (ADC_REF_VOLTAGE * adcValue) / ADC_RESOLUTION;
    adcVoltage *= 4.5;

    kTemperature = (adcVoltage - B_PARAMETER) / (M_PARAMETER);
    
    return kTemperature;
}
Fakat k tipi termokuplu avucumun içine alınca çok aşırı hızlı tepki veriyor sıcaklığa ve sıcaklık çok fazla oynuyor. Acaba 4.5 ile çarpma işlemim bana hatalı sonuç veriyor olabilir mi ? Bir de nasıl daha sağlıklı bir yöntem bulabilirim.
 
y = mx + b olarak formülü tespit ettiysen, burada 4.5 ile çarpma ve sonrasında ADC voltajından B parametresini çıkarma ne oluyor anlamadım. Senin formülle alakası olmayan işlemler yapıyorsun gibi görünüyor.
 
4,5 değeri ile hesapladığında olması gereken değer ulaşmaya çalışmış arkadaş. ama bu durumda hata standart değil ki! 40 olması gereken değer 50 olduğunda sonuç %25 oranında sapacak, bir de bu 4.5 ile çarpınca dalgalanma daha da fazla görülecek. Sorunu işin kökünde halletmeniz lazım. Lehimlemeler, devrelerin gnd birleşimi beslemeler doğru şekilde yapıldı mı?
 
y = mx + b olarak formülü tespit ettiysen, burada 4.5 ile çarpma ve sonrasında ADC voltajından B parametresini çıkarma ne oluyor anlamadım. Senin formülle alakası olmayan işlemler yapıyorsun gibi görünüyor.
Abi benim aradığım x = .. şeklindeydi yani kulağı biraz tersten tuttum. x = (y-b) / m oldu. :) 4.5 ile çarpmamın sebebi de çözünürlükler farklı olduğu için her seferinde okuduğum adc değeri olması gerekenin 4.5 ile bölünmesine elde edilen değerdi.

4,5 değeri ile hesapladığında olması gereken değer ulaşmaya çalışmış arkadaş. ama bu durumda hata standart değil ki! 40 olması gereken değer 50 olduğunda sonuç %25 oranında sapacak, bir de bu 4.5 ile çarpınca dalgalanma daha da fazla görülecek. Sorunu işin kökünde halletmeniz lazım. Lehimlemeler, devrelerin gnd birleşimi beslemeler doğru şekilde yapıldı mı?
Evet malesef bunu şuan yaşıyorum. Çok anlamsız dalgalanmalar var sıcaklık 12 dereceden 20 dereceye çıkıyor adım adım sonra 8'e düşüyor falan. Lehimlemeler, besleme vs. donanım olarak bir sorun yok tekrar kontrol ettim. Bu sefer farklı bir şey yaptım. Arduinoda map fonksiyonu bulunmakta.
C:
analogValue = map(analogValue,0,1024,0,4095);
Şöyle yaparak 0-1024 arasındaki değeri, 0-4095 arasına map etmeye çalıştım. Şu an dalgalanmalar 4.5 ile çarpmama nazaran daha iyi. Map fonksiyonu tam olarak şu şekilde.
C:
uint32_t map(uint32_t x, uint32_t in_min, uint32_t in_max, uint32_t out_min, uint32_t out_max)
{
    return ((x-in_min)*(out_max-out_min)) / (in_max - in_min) + out_min;
}

Normalde size'ı 25 olan bir adc bufferım var değerleri oraya atıp ortalama alıyorum. Şimdi medyan alma vs. gibi farklı adc stabil değer alma yöntemleri deneyeceğim. Tavsiyeleriniz olursa beklerim.
 
Öncelikle bir multimetre ile algoritmayı tam olarak oturt. Yani termokupl voltajını multimetre ile ölç ve hesap makinası ile sıcaklığı hesapla. Bunu doğru olarak yaptıktan sonra aynı algoritmayı programa dökersin.
 
Devrede bir yükseltici var sanırım. Yoksa termokupl çıkışı 190mV olamaz.

Kod yazmadan önce multimetre ile deneyin ve formülünüzün doğru olduğundan emin olun. Sonra ADC kodunu test etmek için bir gerilim bölücü (veya potans) ve paralel bir kondansatör kullanın. Bu ikisi de çalışıyorsa birleştirince çalışması lazım.
 
Devrede bir yükseltici var sanırım. Yoksa termokupl çıkışı 190mV olamaz.

Kod yazmadan önce multimetre ile deneyin ve formülünüzün doğru olduğundan emin olun. Sonra ADC kodunu test etmek için bir gerilim bölücü (veya potans) ve paralel bir kondansatör kullanın. Bu ikisi de çalışıyorsa birleştirince çalışması lazım.
Evet yükselteç bulunuyor. Termokupl çıkışı derken yanlış demiş olabilirim kusura bakmayın. Ben yükselteçin çıkışında yani adc pinine giden noktadan ölçüm yaptım. 22k-10nF bir filtre eklemişler.

Küçük bir ekleme olarak da aslında ben kendime bir nevi lookup table hazırladım. 20-30-40 şeklinde 200 dereceye kadar ölçümler yaptım. Elimdeki hali hazırda çalışan karta termokuplu bağlayıp çakmakla ısıttım sonrasında da multimetreden sıcaklıklardaki değeri elimden geldiğince doğru ölçmeye çalıştım. Başka bir türlü doğruya yakın ölçme yöntemi var mı acaba?
 
Kendi mcu ADC girişinize farklı seviyelerde DC gerilim uygulayıp kontrol ettiniz mi? Yani termocouple bağlantısını tamamen izole edip ADC girişinize kontrol maksatlı DC sinyal uygukadiniz mı? Yaopmadiysaniz denemeniz iyi olur
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,653
Mesajlar
97,266
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top