Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

STM32F4XX ADC

Başlatan GreeN, 13 Ağustos 2014, 11:32:22

GreeN

adc ile kullanarak yaptığım tüm çalışmalarda problem çıktı. Çok fazla gürültü var. yanlış yaptığım birşey mi var ? anlamadım  adc de mi problem var.

Linkte aşağıda kodunu verdiğim bir çalımanın videosu var. Analog girişi gnd ye çeksem bile ekranda değer ufak tefek "zıplıyor".

video link  : https://drive.google.com/file/d/0B6VzIwS8hi18dDBsN21GTmtGc28/edit?usp=sharing





int main(void)
{
    int i;
    SystemInit();
    GLCD_Init();
    Delay(500);
    char buff[20];
    LCD_StringLine(50,50,"DENEME");
    ADC3_CH12_DMA_Config();
    ADC_SoftwareStartConv(ADC3);

while (1)
  {
 
    ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF;
    sprintf(buff,"ADC VALUE (HEX) = %d",ADC3ConvertedValue);
    LCD_StringLine(10,10,buff);
    sprintf(buff,"ADC VALUE = %d",ADC3ConvertedVoltage);
    LCD_StringLine(10,20,buff);
  }
}
void ADC3_CH12_DMA_Config(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
  GPIO_InitTypeDef      GPIO_InitStructure;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  
  DMA_InitStructure.DMA_Channel = DMA_Channel_2;
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 1;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);

  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

 
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);

 
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC3, &ADC_InitStructure);

  
  ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 1, ADC_SampleTime_3Cycles);
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
  ADC_DMACmd(ADC3, ENABLE);
  ADC_Cmd(ADC3, ENABLE);
}
Terörü Lanetliyoruz.

quarko

ADC den gelen veriyi direk ekrana basmışsın. Gelen örnekleri 16/32 veya 64 er olarak (veya daha fazla) toplayıp ortalamasını alırsan çok daha düzgün değerler elde edebilirsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

GreeN

Bana anlık veriler lazım. Misal sinüs sinyali okuyup ekrana dökecem. Yada farklı sayısal işaret işleme algoritmaları uygulayacam. FFT sonucu bile horon tepiyor.
Terörü Lanetliyoruz.

arm-beginner

GreenN, bu tür sorunlar ekseri yazılımdan kaynaklanmiyor.
Belki verdiğin linkde benim sorularıma cevap vardır, ama video seyredecek vaktim yok.
Sinyalın empedansı nekadar? SampleTime'ı seçerken bunu dikkade alarakmı seçtin?
Gürültü kaç bit'den oluşuyor? Son 1 veya 2 bit ise: normal.
Kullandığın MCU 64-pinden 176-pine kadar her çeşidi var. Bazıların Aref / AVCC / AGND var, bazıların yok.
ADC'den düzgün bir veri alabilmek için, bu girişlerde bazı önlemler, PCB tasarımda bazı şeyleri dikkade alman lazım. Bu girişler yok ise, iş çok daha zorlaşıyor ve bu önlemler VCC ve GND için alınması lazım.

Örmeğin PCB'yi tasarlarken, analog ve digital için farklı voltaj regülatör kullanıyorum ve onların ground'unu tek bir yerde birleştiriyorum. Demesi kolay, routing esnasında bazen insan saçlarını yolmak istiyor.
Başka bir örnek: kristal'ın ayrı bir ground'u var ve tek bir yerde diğer GND ile birleşiyor. Vs. vs.

Ben senin yerinde olsam, ilkönce Oszi ile AVCC ve VCC'ye bir göz atardım. Onlar ne kadar temiz olurlarsa, senin okuduğun veriler o kadar temiz olur.
Ondan sonra şu SampleTime ile biraz oyna. ADC_SampleTime_3Cycles için kaynağın empedansı epek düşük olması lazım. Gerçekden öylemi?

GreeN

http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf

Discovery board üzerinde çalışıyorum. STM32f407vg.
Bu dökümanda vref+ vdda vssa gibi pinler güzel bir şekilde bağlantı yapılmış.
Terörü Lanetliyoruz.

arm-beginner

#5
Alıntı yapılan: GreeN - 15 Ağustos 2014, 12:56:52
http://www.st.com/st-web-ui/static/active/en/resource/technical/document/user_manual/DM00039084.pdf

Discovery board üzerinde çalışıyorum. STM32f407vg.
Bu dökümanda vref+ vdda vssa gibi pinler güzel bir şekilde bağlantı yapılmış.


Cevabını şöyle algılıyorum:

Vcc ve AVcc? "Abi, ölçmeye ne gerek var. ST yaptıysa doğru yapmışdır"
Empedans? "Abi, o kadar detaya ne gerek var!"
SampleTime? "Abi, yok, onlar önemsiz şeyler, sen takma kafanı o tür şeylere. ST gıcıklık olsun diye yapar bu tür şeyleri.
Gürültü kaç bit'den oluşuyor? "Offf, amada meraklısın!"

GreeN

ADC3 1. kanal PA1 girişinden alınan ölçümü dma2 ile ram'de 0x4001224c adresine yazıyorum.

Gürültü için cevap olabilir:
A-Desimal olarak 1969 ile 2101 arasında ölçtüğüm değer değişiyor. Mubarek girişte sinyal yokken (boşta) bu iki değer arasında oynuyor.
B-Girişi 4.7k ile gnd'ye çektiğimde  62-136 arasında değişiyor.

girişi 4.7k ile vdd ye çektiğimde 3971 - 4008 arasında oynuyor.
değer kesinlikle sabit değil sürekli değişiyor.

Sample Time :
Sample değerleri ile de oynadım.

sample time 15 cycles ise ;
A-2020-2212
B-40-115 (4.7kgnd)

sample time 480 cycles ise ;
A- 1996 - 2128
B -  6 - 205 (4.7kgnd)

bu değerler arasında dalgalanıyor.

Bunlar normal değil.

VCC ve Avcc kontrol edeceğim.
Terörü Lanetliyoruz.

z

Girişe doğrudan (direnç vs olmadan) kalem pil bağla. Bir de bunun sonucuna bakalım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

arm-beginner

#8

Verdiğin değerler çok yüksek.
Aynı senin kullandığın Discovery-Board'a 2 direnç ve 1 kondensatör bağladım, ama beslemeyi bir 5V adaptör ile yaptım.

12V     o-----o
              |
             .-.
             | |
             | |  11k 1%
             '-'
              |
              o------o-------o  ADC
              |      |
             .-      |
             | |     |
     3k83 1% | |    ---
             '-'    --- 100p
              |      |
              |      |
             ===    ===
             GND    GND
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

Değerler en fazla dezimal 18 oynadı.
Tek aklıma gelen: sen beslemeyi USB üzerinden yapıyorsun ve PC'nin tüm gürültüsünü Discovery-Board'a yansıtıyorsun.

z'in fikri bence iyi bir fikir. Orda  1 veya 2 bit oynaması lazım. O ortamdada yukarda belirtiğin yüksek değerler gelirse, bil ki, sorun besleme.
Bol şanslar.

(Edit)
Bilgin olsun diye:
Emin olmak için kendi tasarladığım board'daki değerleri tekrar ölçtüm.
Orda STM32F103 kullanıyorum ve sinyalı 2 ADC ile ölçüyorum. Birini direk ölçüyorum, diğerinde sinyalın seviyesini 8 kat yükseltmek için bir MCP6022 var.
Her ikisinde hiç bir bit kımıldamiyor desem, çok abartı olmaz. Çok nadiren arada bir bit-0 oynuyor.
Ama bu seviyeye gelebilmek için, PCB'yi 4 kes yeniden tasarlamak zorunda kalmışdım.

Sanırım bu Dıscovery-Board'lar hasas ADC ölçümler için çok uygun bir ortam sağlamiyorlar.


GreeN

#9
 
Alıntı yapılan: z - 15 Ağustos 2014, 17:17:49
Girişe doğrudan (direnç vs olmadan) kalem pil bağla. Bir de bunun sonucuna bakalım.
Pillede denedim , kesinlikle stabil değil. Yine çok fazla oynama var. Besleme konusunda bir çalışma yapıp sonucu değerlendireceğim.

Beslemeyi 5v bir adaptör ile denedim. hiçbir değişiklik yok. Problem devam ediyor.
Terörü Lanetliyoruz.

GreeN

#10
stm32f407 deki beni cezbeden sadece adc'si idi. MCU ailesinde  daha hızlı adc bulamadım. Hala istediğim sonucu alamadım.
Konuyla ilgili olarak denemelere devam ediyorum . ADC yi Triple adc modunda çalıştırdım , durum yine aynı. Bir fark yok.  Durum şunu gösteriyor ,
@arm-beginner 'ın dediği  gibi board adc konusunda ölü. Beslemeyi pilli deneyecem. 

Edit: Beslemeyi pille denedim durum aynı.
Terörü Lanetliyoruz.

GreeN

Arkadaşlar adc girişinde 0.69 volt bir voltaj ölçüyorum. adc giriş ayarladığın her kanalda  dc 0.69 volt üzerinde parazit var.
Terörü Lanetliyoruz.

kimlenbu

osiloskop'ta giriş sinyalini inceledin mi ? vref'i inceledin mi ?