N76E003 12 bit gömülü SAR ADC sahiptir. 8 Farklı ADC kanalına sahiptir. Bu yazıda AIN0 kanalını kullanarak MP503 gaz sensörünün değerlerini okuyacağız. Bu işlemi yapabilmeniz için değerleri okuyabileceğiniz bir ortama ihtiyacınız olması gerekir. Seri haberleşme yapabilmek için PuTTY, Serial Port Utility gibi program kullanabilir ya da lcd ekran üzerinden rahatça okuma yapabilirsiniz.
ADC açıklamaları ile devam edelim. Öncelikle 8 farklı kanal üzerinden seçim yapmalısınız. Örneğin AIN0 kanalını kullanalım.
#define Enable_ADC_AIN0 ADCCON0&=0xF0;P17_Input_Mode;AINDIDS=0x00;AINDIDS|=SET_BIT0;ADCCON1|=SET_BIT0
AIN0 kanalınının aktif olabilmesi için yukarıda bulunan gerekli ayarlar h dosyası içerisindedir.
Ardından ADC fonksiyonuna gelecek olursak;
unsigned int ADC_Read(void)
{
register unsigned int value = 0x0000;
clr_ADCF;
set_ADCS;
while(ADCF == 0);
value = ADCRH;
value <<= 4;
value |= ADCRL;
return value;
}
ADC dönüştürme işleminin başlaması için ADCF bitinin temizlenmesi gerekir. Ardından ADCS bitinin set edilmesi dönüştürme işlemini başlatır. ADCRH ve ADCRL registerleri dönüştürülecek olan değerin ayarlanması için kullanılmıştır. ADC 12 bit olduğundan, ADCRH 8 bit olarak, ADCRL 4 bit olarak kullanılır.
ADC ayarlarını yaptığımıza göre sensör ayarlarına geçebiliriz.
MP503 hava kalitesi gaz sensörü olarak kullanılmaktadır. Alkol ve karbondioksite karşı tepki gösteren bir sensördür. Sensör tarafından okunan bu değeri ppm değerine dönüştüreceğiz.
Gaz sensörlerinde, gaz konstrasyonu yüksek ise direnç azalır. Sensör bu dahili direncin yanısıra harici bir yük direnci gereksinimi duyar. MP503 sensörü içerisinde ortama bağlı değişiklik gösteren dirence sahiptir. 1k ile 30k arasında olması gereken bu direnç değeri ölçülen gaz değerinin hassasiyetini belirler. Sensörün doğru değerlerde ölçüm yapabilmesi için, öncelikle ısıtılması gerekir. Isıtma direnci sensör içerisinde yerleşik olarak bulunur.
Bu şekil bize Rs/R0 değişimine göre milyonda bir gaz oranını (ppm) gösterir. Ppm konstrasyonu ayarı yapabilmek için sensör datasheetinde bulunan bu grafik göz önünde bulundurulmalıdır. R0 temiz havadaki değeri temsil eder. Rs ortamdaki gaza göre değişiklik gösteren dirençtir. Öncelikle Rs direncini hesaplamayız.
RS = [(Vin x RL) / Vout] - RL
RS / R0 Temiz havadaki direnç oranı sabittir.
R0 değerini hesaplamak için farklı bir kodumuz olacak;
#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"
unsigned int ADC_Oku(uint8_t);
int Adc0;
float sensor_volt,RS_hava,R0,sensordeger,x,oran;
void main (void)
{
InitialUART0_Timer1(9600);
while(1)
{
Adc0 = ADC_Oku(0);
for( x = 0 ; x < 500 ; x++)
sensordeger = sensordeger + Adc0;
sensordeger = sensordeger/500.0;
sensor_volt = sensordeger*(Vin/4096.0);
RS_air = ((Vin*RL)/sensor_volt)-RL;
R0 = RS_hava/oran;
printf("R0 : %f\r\n",R0);
Timer0_Delay1ms(250);
}
}
unsigned int ADC_Read(void)
{
register unsigned int value = 0x0000;
clr_ADCF;
set_ADCS;
while(ADCF == 0);
value = ADCRH;
value <<= 4;
value |= ADCRL;
return value;
}
Grafik log-log ölçeğine sahiptir.
log(y) = m*log(x) + b
Grafikten hangi gaz için ppm hesabını yapacaksınız iki farklı nokta seçmelisiniz. Herkesin masasında kolonya vardır 🙂
Grafikten alkol için 2 farklı nokta seçelim. (60,0.07) (10,0.4)
m = log(y/y0) / log(x/x0) b = log(y) - m*log(x) m ve b değerlerini seçilen noktalar sayesinde bulduktan sonra ppm hesabını yapabilirsiniz.
Adc0 = ADC_Oku(0);
sensor_volt = Adc0*(Vin/4096.0);
RS_gas = ((Vin*RL)/sensor_volt)-RL;
ratio = RS_gas/R0;
ppmlog = (log10(oran)-b)/m;
ppm = pow(10.0, ppmlog);
printf("ppm : %f\r\n",ppm);
Timer0_Delay1ms(250);
İstenilen gaz konsantrasyonunu bulmak için bu formülleri kullanabilirsiniz. Kontrollü çalışan hava temizleyiciler, yangın alarmı gibi farklı projeler de geliştirebilirsiniz.
Okuduğunuz için teşekkürler, İyi çalışmalar.