STM32F030F4 HAL lib ADC sorunu

Başlatan MC_Skywalker, 26 Temmuz 2017, 20:23:01

MC_Skywalker

linerite sorunu gibi görünen bir sorun yaşıyorum. ADC den okuduğum değer gezmekte -+0.2 gibi gezme olmakta

ADC IT geri dönüşünde ADC versini 4095'e bölüp referans vvoltajı ile çarpıp sonuç alıyorum. sonra onu 100 elemanlı diziye tersten atıp ortalamasını alıyorum.

ilk başta dizi ile işlem yapmak yerineyine ADC Callback içinde  0-100 arası aldığım değeri toplayıp ortalama aldığımda da benzersorunu yaşıyorum.

bu sıkıntıyı nasıl aşarım bulamadım. yardım edebilecek var mı?
// varialbes for OLEDLCD 
char lcd_buff[25];
float Vin=0, ADCRaw=0,OrtalamaX=0;
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))
		{
							
				ADCRaw = HAL_ADC_GetValue(hadc);
				Vin = 3.31 * (ADCRaw/4095);			//VRef * (ADC Data/2^ADCbit)
		}
}
/* USER CODE END 0 */


Main içinde 100 elemalı diziye atıp ortalama alıyorum.

float X[100], ToplamX=0;
			int j;
			X[0] = Vin;										   //okudugumuz degeri dizinin ilk elemanina 
				for (int i=0;i<99;i++) 				 //99 kere döngü döner
					{
						j = 98 - i; 							 //98 den 0 e dogru geriye saydiralim
						X[j+1] = X[j] ; 					 // Her seferinde eski X[j] degerini bir eskisinin yerine tasiyalim
					} 
				for (int y=0;y<99;y++)
					{
						ToplamX += X[y];					 // tüm X degerlerini toplayip 10 a bölüyoruz.		
					}
				OrtalamaX = ToplamX/100;	
		
		sprintf(lcd_buff,"MC_Skywalker");
		ssd1306_SetCursor(25,0);
		ssd1306_WriteString(lcd_buff,Font_7x10,White);
		
		sprintf(lcd_buff,"Volt:%.3f", OrtalamaX );
		ssd1306_SetCursor(0,15);
		ssd1306_WriteString(lcd_buff,Font_11x18,White);
					
		sprintf(lcd_buff,"ADC RAW: %.2f",ADCRaw);
		ssd1306_SetCursor(0,45);
		ssd1306_WriteString(lcd_buff,Font_7x10,White);			
		
		ssd1306_UpdateScreen();
		HAL_Delay(10);





cripple

Filtre yaparken uyguladığım bir yöntem var. Şu şekilde yaptığımda güzel sonuçlar alıyorum:
Örnek 100 değer aldıktan sonra bu değerleri sorting ile dizi içerisinde küçükten büyüğe veya büyükten küçüğe sıralıyorum.
Sonra bu değerlerin ortasındaki 20 değeri (veya daha fazla olabilir burası size kalmış) alarak bunların ortalamasını alıyorum. Sonuç olarak en küçük ve en büyük 40 değerden arındırmış oluyorum.Böylelikle adc nin arada aldığı saçma küçük ve büyük değerler ortalamaya etki etmemiş oluyor. Denemenizi tavsiye ederim.
Saygılarımla.

MC_Skywalker

ADC'den gelen verinin gezmesi sorunun sebebini bulamadım. video da görüldğü gibi ADC çışı stabil değil.




skara1214

Cripple yaptığın şeyin hızlı bir algoritması varmı?
Herkes ölür ama herkes gerçekten yaşamaz

baran123

@MC_Skywalker sabit dirençde olsa sabit olmasını beklemek aslında pek mantıklı değil.
Sonıuçta sizin orada ölçtüğünüz değer gerilim bölücüye giren sabit kabul ettiğiniz bir DC voltaj.
Fakat bu voltaj ne kadar stabil ?
O değerin ölçtüğü ufak gezinmeler DC gerilimdeki ripple lar olabilir.
Bu aslında size beslemenin stabilitesi hakkında fikir verebilir.


Zaten 12 Bit ölçtüğünüzde varsayarsak bu oynamalar normal.

muhendisbey

Uzay bağlantıda 12-bit adc'de tek ölçüm alınırsa gezinti normal sayılabilir. Güvenilir sonuç için birden fazla ölçüm alıp değerlendirmek gerekir. Bunun dışında MCU'nuzu kullanmadım ama analog reference pinine düzgün harici referans vermek de bu tip problemleri bir nebze azaltıyor.



Bir deneme yapın: Cihazın yanında cep telefonu ile arama yapın, şarj aletleri varsa kurduğunuz devreye yakınlaştırın ve oynama miktarına bakın.
Zulmü alkışlayamam, zalimi asla sevemem; Gelenin keyfi için geçmişe kalkıp sövemem.

eeburakdemir

@MC_Skywalker VDDA beslemesini yaparken 3.3V hattını LC filtreden geçirmeyi deneyebilirsiniz ( Bir nebzede farkı var ) . @baran123 hocam'a katılıyorum. LC filtrenin kesim frekansı yüksek tutulduğunda oynama görülüyor. Fakat Kesim frekansını düşürürseniz önemli bir faktör olabilir.
Asla pes etme...

MC_Skywalker

#7
ST'in  uygulama notunda 1 LSB sapma olabilirliğinden bahsetmiş.  12Bit, 10Bit, 8bit olarak ADC konfügüre ettim yine gezme ve giren gerilimden sapma oluyor. ADCRaw yukarı aşağı 0x64f(000001100100) oynuyor.

ADC pin girşini MM ile öçtüğümde 3.312V görüyorum, ADC dönüşümü sonucu ise 3.213V ile 3 .217V.  Devre USB üzerinden besleninyor. 5V LM117 ile 3.3 V düşürülüyor.

MCU'nın bellek(IRAM) miktarının az olması esas ihtiyacımı karşılamıyor. NTC ile sıcaklık ölçecektim bellek yetersizliğinden proje derlenmiyor.  F0 sersi başka bir MCU bakacağım.