Ana içeriğe git

Haberler

Konu: HAL lib ADC  (739 Kez okunmuş) önceki konu - sonraki konu

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.
HAL lib ADC
STM32F030 ile çalışmalarıma devam ederken hazır OLED LCDyi sadece text olarak çalıştırmayı başarımışken ADC olayına gireyim dedim.

ADC den aldığım veriyi Volt olarak göstermek istediğimde ADC girişi boş iken de dğer alıyorum.  float tip çalıştığımda virgülden sonraki basamaklar  +- 0,20 gezmekte.

okumayı ADC callback içinde 100 kadar sayan bir for döngüsü içinde yapıyorum. bu gezmeyi nasıl çözerim. bunu çözer isem 10K NTCyle (3D Printer için aldığım) ısı ölçmeye niyetim var.
Kod: [Seç]
/* USER CODE BEGIN 0 */
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if (__HAL_ADC_GET_FLAG(hadc, ADC_FLAG_EOC))
{
for (int i=1; i<100; i++)

ADCRaw = HAL_ADC_GetValue(hadc);
Vin = Vin + (330 * (ADCRaw/4095)); //VRef * (ADC Data/2^ADCbit)
}
Vin=Vin/100;
}
/* USER CODE END 0 */

Ynt: HAL lib ADC
Yanıt #1
hocam ortalama lmışsınız ama her 0-100 geçişinde problem olur. onun için kayar nokta ortalama (moving average) kullanırsanız daha iyi olur sanırım.
her 100 iterasyonda ortalama alıorsunuz, bu iterasyonlar içindeki değerlerin sapması bu iterasyonu sapmaya yöneltir.


Ynt: HAL lib ADC
Yanıt #3
Gezme işini çözmek için ortalama yöntemine gideyim dedim. Kaydırmalı diziye atıp ortalama yöntemini de deneyeyim.  Ayrıca CubeMX içinde ADC ayarlarını varsayılan bırakmıştım okısmıda bir kontrol edeyim düzeltmem gereken birşey varmıdiye.

bu arada HAL lib ile ARM işi arduiuno ya dönmüş ama  HAL lib işlemcinin flashının (16K)tamamen dolmasına sebep oldu en yüksek optimizasyonda olmasına rağmen.

  • 1k
  • [*]
Ynt: HAL lib ADC
Yanıt #4
ADC pini boşta ise ADC'den random değer okunması normaldir, gürültüyü okumuş oluyorsunuz. En azından gnd ye ve VCC ye çekip denemeler yapabilirsiniz.

HAL ve ST Standart Lib. özellikle flash ram i küçük mcu için çok verimsiz. Standart Lib. aileye özel olduğundan ram rom kullanımı açısından daha iyi.

Ynt: HAL lib ADC
Yanıt #5
Keil
Kod: [Seç]
 ortalama = SUM(x)/10
yemez çünkü SUM  C99 da yok deyip önüme engel koydu :) neyapalım fazladan bir for döngüsü kurup dizini elemanlarını toplayıp ortalayacağım:)

Ynt: HAL lib ADC
Yanıt #6
Sanırım bir yerlerde hata yapıyorum kod düzgün çalışmıyor.  sonuç olarak yine değişen değerler alıyorum.

ADC Callback rutini
Kod: [Seç]
 
/* 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 = 330 * (ADCRaw/4095); //VRef * (ADC Data/2^ADCbit)
  }
}
/* USER CODE END 0 */
while içinde ki rutin
Kod: [Seç]
		float X[10], ToplamX=0;
int j;
X[0] = Vin;    //okudugumuz degeri dizinin ilk elemanina
for (int i=0;i<9;i++) //9 kere döngü döner
{
j = 8 - i; //8 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<9;y++)
{
ToplamX += X[y]; // tüm X degerlerini toplayip 10 a bölüyoruz.
}
OrtalamaX = ToplamX/10;
  • Son Düzenleme: Temmuz 08, 2017, 20:30:37 - MC_Skywalker

Ynt: HAL lib ADC
Yanıt #7
derinliği arttırın hocam. yani 9 yapmayın 64-128 gibi rakamlar yapın.

Ynt: HAL lib ADC
Yanıt #8
Hocam derinlik şuan 100 buraya kodun eski halini kopyalamışım.

ADC girişini AVO Metre ile ölçütüğümde 2.042V okuyorum benim devre de 1.92V ile 1.96V arasında okuyorum. derinliği 100 yaptığımda ilk başlarda ölçülen değer rampa şeklinde yükselerek. kafayı toplayayım birde F4 Disco ile deneyeyim.

Ynt: HAL lib ADC
Yanıt #9
derinlik kadar ölçüm olmadan sinyal doğru ölçülmez.