STM32F0 Discovery ADC Problemi

Başlatan newpronik, 04 Haziran 2015, 10:51:18

newpronik

Merhaba arkadaşlar adc ile ilgili ufak bir sıkıntım var.
NTC kullanarak sıcaklık ölçmeye çalışıyorum. Ölçtüğüm veriyide ekrana yazıyorum.

Reset atınca ekranda sıcaklık
önce 127 derece
sonra 113 derece gösteriyor ardından normal oda sıcaklığını ölçmeye devam ediyor reset atana kadar NTC'yi düzgünce ölçüyor.
ama reset tuşuna basarsam yine 127 görüyorum sonra 113 sonrada 24,25 odanın sıcaklığını görüyorum.

ADC Kurulumu;
void Config_ADC1(void)
{
	ADC_InitTypeDef ADC_InitStructure;

	/* ADC1 DeInit */
	ADC_DeInit(ADC1);

	/* ADC1 Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

	/* Initialize ADC structure */
	ADC_StructInit(&ADC_InitStructure);

	/* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
	ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
	ADC_Init(ADC1, &ADC_InitStructure);

	/* Convert the ADC1 input with 55.5 Cycles as sampling time */
	ADC_ChannelConfig(ADC1, 1, ADC_SampleTime_55_5Cycles); // PA.1 - IN1

	/* ADC Calibration */
	ADC_GetCalibrationFactor(ADC1);

	/* Enable ADC1 */
	ADC_Cmd(ADC1, ENABLE);

	/* Wait the ADCEN falg */
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));

	/* ADC1 regular Software Start Conv */
	ADC_StartOfConversion(ADC1);
}


Pin Setlemesi

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA| RCC_AHBPeriph_GPIOB|  RCC_AHBPeriph_GPIOC, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;     // PA.1 ADC IN1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);


adc to temp fonksiyonu

float Sicaklik_Al( ){

	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);

    float resistance = ADC_GetConversionValue(ADC1);
    if(resistance < 100)return 0;
    resistance = ((40960000/resistance) - 10000);
    resistance = log(resistance);
    resistance = 1 / (0.001129148 + (0.000234125 * resistance) + (0.0000000876741 * resistance * resistance * resistance));
    resistance = resistance - 273.15;  // Convert Kelvin to Celsius
    return resistance;

}


ntcyi pulldown olarak 10k direnç ile bağladım. Filtreleme için 100nf kondansatör paralel bağladım.
adc to temp için arduino kütüphanesinde bu şekilde çeviriyordu oradan arakladım :) daha iyi bir fikri olan varsa çevirme için kesinlikle öğrenmek isterim ben başka bulamadım.

En önemli şey ise bu şekilde reset durumunda ekranda önce 127 sonra 113 sonrada sıcaklığı görmem.

şimdiden teşekkür ederim.

MrDarK

O zaman ana while döngünün içine girmeden önce 3 kere adc okuması yap ondan sonra ana döngüye gir. Aldığın deger 100 derecenin altındaysa hatalı deyip tekrar ölçebilirsin. Sonuçta bu sensor mekan içi sıcaklık ölçeceğine göre 100 dereceye çıkmaz kıyamet kopana kadar .d
Picproje Eğitim Gönüllüleri ~ MrDarK

newpronik

ama benim amacım zaten bunu o şekilde çözmek değil sonuçta bu stabil bir sistem olmalı daha baştan böyle bir sıkıntı varsa devamında da kaçırdığım yerler olabilir.

Klein

#3
Ham ADC değerin bu esnada ne?
ilk başta filtre kesim frekansı çok düşük diye düşündüm.  ama filtre yokmuş. diğr işlemler filtre gibi davranıyor olabilir.

MrDarK

Kodlarını şimdi inceledim;

ADC kurulumunu yaptıktan sonra;

/* Wait the ADCEN falg */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN)); bunun yerine.

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); flagini beklet

Örnek proje olarak şunu inceleyebilirsin, buda stm32f0 ile yapıldı sonuçta;
https://www.picproje.org/index.php/topic,58660.msg455206.html#msg455206
Picproje Eğitim Gönüllüleri ~ MrDarK

newpronik