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.
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.
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;
}