STM32F103C8T6 ADC DMA Gürültü Sorunu.

Başlatan e-zeki, 03 Nisan 2020, 00:54:14

e-zeki

Merhabalar. Bir proje üstünde çalışıyorum 6 kanaldan veri okumam, belli hesaplar yapıp 7 segment üzerinde göstermem lazım.
Dmadan veriyi çekiyorum sorun yok. Fakat herhangi bir gpio işlemi gerçekleşmeye başladığı an DMA verisi zıplamaya başlıyor. Inputlarda boşken vdd/2 giriş var +/- yapabilmek için. Dediğim gibi sadece DMA açıkken +- 3(4096) sekme var bu normal. Ama timer çalışmaya başlayınca ve segment taraması başladığı an +-100 e kadsr çıkıyor. Işlemci 72MHz Adc 4.5-8-9-12Mhz de denedim hepsinde aynı sıçrama var. İşlemci hızı düşerse sekme +-50ye kadar azalıyor fakat sıfırlanmıyor.
Böyle bir sorunla karşılaşan var mı daha önce?

Not: besleme gürültülerini kontrol ettim çok düşük. St link üzerinde beslediğimde de, dışarıdan beslediğimde de sonuç değişmedi.

Platform Keil mdk arm 5.26
Hal library f1 1.8

Mucit23

Eğer ADC Referansınız VCC ise bu kadar sapma olması normal diye düşünüyorum. Harici referans entegresi kullanmanızda fayda var.

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

e-zeki

@z abi bu videonu izlemiştim daha önce, izlediğim hiç aklıma gelmedi bi deneyeyim.
@Mucit23 problem offset kayması değil, kayda da önemli değil benim için.
Asıl sorun z hocamın videosundaki gibi spike durumu.

e-zeki

#4
Kodun tamamını kapadım. while dahil her yer boş. DMA'yı çalıştırıyorum ripple/sekme / gürültü vs. birşey yok. 2048+-2 düz çizgi gibi geliyor.
while içine var++; bile yazsam DMA verisi sekmeye başlıyor 2048+-70 aralığında gidip gelmeye başlıyor. gpio frekansını da denedim onunla da ilgili değil.
Harici bir besleme ile inputları besledim sonuç hiç değişmedi. :'(  :du:

bymrz

Hocam benzer durumu bende yaşıyorum. ADC verilerini sağlıklı şekilde alamıyorum. Sample rate lerinde ufak değişiklikler yapsam dahi sonucu etkiliyor.
Referans olarak ta VREF_INT i kullanıyorum, gerekli hesaplamaları yapıp ölçümü öyle değerlendiriyorum fakat özellikle besleme gerilimini dahi sağlıklı okuyamıyorum...

Umarım bir yerde hata yapıyoruzdur ve çözümünü bilen birisi vardır.

sessiz_roman

kod kısmını yazabilir misiniz acaba.

sorun şuradan da kaynaklanıyor olabilir.

çok kanallı adc okumalarında kanalların adc çevrimlerinin bitmesinin beklenmesi gerekiyor.
 galiba çevrimler bitmeden okuma yaptırıyorsunuz.

yani siz kodu baştan sona buraya bi atın bakalım.

e-zeki

@startirrek704250
 
Alıntı yapılan: e-zeki - 03 Nisan 2020, 14:18:33Kodun tamamını kapadım. while dahil her yer boş. DMA'yı çalıştırıyorum ripple/sekme / gürültü vs. birşey yok. 2048+-2 düz çizgi gibi geliyor.
while içine var++; bile yazsam DMA verisi sekmeye başlıyor 2048+-70 aralığında gidip gelmeye başlıyor. gpio frekansını da denedim onunla da ilgili değil.
Harici bir besleme ile inputları besledim sonuç hiç değişmedi. :'(  :du:

Yukarıda söyledim kodun tamamı kapalıyken hariç her duruma ripple var.

apsis

Acaba elindeki MCU clone muadilinden mi?
"Makineye Beyin" MEKATRONİK

sessiz_roman

Alıntı yapılan: e-zeki - 03 Nisan 2020, 20:31:39@startirrek704250
 
Yukarıda söyledim kodun tamamı kapalıyken hariç her duruma ripple var.

eldeki verilerle başka bir sebep kalmıyor hocam.ilginç bir durum.
çekirdek ve adc dma ayarlarını atın belki orada bir hata vardır buluruz.

GreeN

Burada Bende bu tarz bir problemle karsılastım. Ama bir çözüm bulamamıştım.
Terörü Lanetliyoruz.

e-zeki

kusura bakmayın çok geç yazıyorum maalesef.
@apsis  hocam özdisandan aldım ama patetes mi yolladılar bilmiyorum.
@GreeN  bire bir aynı durum hocam pinler floating durumdayken gelen datalar dans ediyor.
@startirrek704250

adc init
void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};

  /** Common config 
  */
  hadc1.Instance = ADC1;
  hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
  hadc1.Init.ContinuousConvMode = ENABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 6;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_0;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /** Configure Regular Channel 
  */
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = ADC_REGULAR_RANK_2;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

dma link
void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(adcHandle->Instance==ADC1)
  {
  /* USER CODE BEGIN ADC1_MspInit 0 */

  /* USER CODE END ADC1_MspInit 0 */
    /* ADC1 clock enable */
    __HAL_RCC_ADC1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**ADC1 GPIO Configuration    
    PA0-WKUP     ------> ADC1_IN0
    PA1     ------> ADC1_IN1
    PA2     ------> ADC1_IN2
    PA3     ------> ADC1_IN3
    PA4     ------> ADC1_IN4
    PA5     ------> ADC1_IN5 
    */
    GPIO_InitStruct.Pin = A1_Pin|A2_Pin|A3_Pin|A4_Pin 
                          |A5_Pin|A6_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* ADC1 DMA Init */
    /* ADC1 Init */
    hdma_adc1.Instance = DMA1_Channel1;
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_adc1.Init.Mode = DMA_CIRCULAR;
    hdma_adc1.Init.Priority = DMA_PRIORITY_MEDIUM;
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  /* USER CODE BEGIN ADC1_MspInit 1 */

  /* USER CODE END ADC1_MspInit 1 */
  }
}

argelojik

Merhaba .Ben de bir fikir vermek istedim. Acaba ADC giriş kanallarına 100 KOHM direnç bağladınız mı?

e-zeki

10K pulldown attım, +10nF da attım yok, bana mısın demiyor.

z

Butun ADC girislerini birlestir tek bir voltaj olcumu yapmayi dene.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com