Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Mucit23 - 13 Ocak 2016, 17:45:17

Başlık: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 13 Ocak 2016, 17:45:17
Selamlar,

STM32F7 ile 3 kanal Adc den veri almak istiyorum. Her bir kanalın verisini DMA ile Değişkenlere yüklemem gerek.

Şuanda Tek kanaldan bu işi yapıyorum ama 3 kanala çıkınca takılıp kaldım. Öncelikle bu iş olurmu merak ediyorum. ADC sırasıyla 3 kanalı birde tarayıp benim değişkenlerime yazması lazım.

Stm32F4'de bu iş yapılıyor diye biliyorum. Hatta burada örnek kod var. 2 Kanaldan okuma yapılıp 2 boyutlu bir diziye kanal verileri yazılmış

https://github.com/FabLabSeoul/WingProject/wiki/STM32-ADC-Multi-Channel-Using-DMA

Aynısının 3 kanalını yapmaya çalışıyorum ama HAL library ile takıldığım birkaç nokta var.
Eski kütüphanede ADC kanal ayarı için tek bir fonksiyon vardı. Örneğin aşağıdaki gibi yapılıyordu.

  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_55Cycles5); //PC1 as Input
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_55Cycles5);


HAL library'de ise aşağıdaki gibi bir structy yapısı kullanılıyor.

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_7;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_6;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }


Ben Channel6, Channel7 ve Channel8 'i kullanmak istiyorum. Bunun için yukarıdaki kanal ayarlama işlemini her bir kanal için tekrarladım. 

DMA ayarlarındada farklılık var.

HAL kütüphanesinde DMA'da sadece boyut ayarı var başka birşey bulamadım ben. 3 kanal için aşağıdaki gibi yapmaya çalıştım.

  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 3)


En sonda gönderdiğim 3 verisi Lenght yani boyut olarak geçiyor. Tek kanal için 1 yazıyordum oraya.

ADC ayarlarında   ScanConvMode  = ENABLE; yaptım. Bu ayar aktif olunca kanalların taranması lazım. Ayrıca NbrOfConversion Parametresini 3 yaptım. 3 kez dönüşüm işlemi yapılacak.

DMA ayarlarım ise aşağıdaki gibi .
  hdma_adc.Instance = ADCx_DMA_STREAM;

  hdma_adc.Init.Channel  = ADCx_DMA_CHANNEL;
  hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
  hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  hdma_adc.Init.Mode = DMA_CIRCULAR;
  hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
  hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;

  HAL_DMA_Init(&hdma_adc);


Yaptığım tek değişiklik DMA_MINC_ENABLE yapmak. Yani Hafıza adresi arttırılacak dedim. Buna rağmen çalışmadı.

Aslında Sadece Channel 6 çalışıyor.

Normalde okuma sırasına göre düşünürsek Dizinin 0. elemanı Channel 6, Dizinin 1. elemanı Channel 7 ve Dizinin 2. elemanı Channel8 olması lazım.
6. Kanal da sıkıntı yok, dizinin 0. elemanı kanal 6 nın değerini veriyor. Dizinin 1. elemanından sürekli sıfır okuyorum. Dizinin 2. elemanı ise 0. kanal ile bağımlı olarak değişiyor. Sanki 0. kanaldan etkileniyor.

Neyi atlıyor olabilirim sizce? Kanal ayarı için başka bir ayar bulamadım ben.

Bu arada GPIO ayarları tamam. İlgili pinler PF8, PF9 ve PF10 analog giriş olarak ayarlandı.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 13 Ocak 2016, 23:11:37
Hocam

sConfig.Rank         = 1;


hepsinde 1 yapmışssın. Sırayla 1,2,3 diye gitmeyecek mi?

Şuradaki rehberde:
http://visualgdb.com/tutorials/arm/stm32/adc/ (http://visualgdb.com/tutorials/arm/stm32/adc/)

29. maddede rank olayını açıklamış.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 13 Ocak 2016, 23:35:06
Hocam şuan bende Rank olayını araştırıyordum. Ne olduğunu tam olarak anlayamadım. Datasheette ADC Regular Sequence Register adında ADC_SQRL1... ADC_SWRL4 arası registerlar var. Rank değeri bu registerlara yazılıyor.

Benim anlamadığım nokta sıralamayı nasıl yapacam. Rank ayarının nasıl kullanıldığını anlayamadım. Şimdi adc ayarlarımı aşağıdaki gibi yaptım.

/**
  * @brief  ADC configuration
  * @param  htim : ADC handle
  * @retval None
  */
static void ADC_Config(void)
{
  ADC_ChannelConfTypeDef sConfig;
  /*##-1- Configure the ADC peripheral #######################################*/
  AdcHandle.Instance          = ADC3;
 
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 3;
  AdcHandle.Init.ScanConvMode          = ENABLE;                        /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  AdcHandle.Init.ContinuousConvMode    = DISABLE;                       /* Continuous mode disabled to have only 1 conversion at each conversion trig */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;        /* Conversion start trigged at each external event */
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIG2_T2_TRGO;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = DISABLE;

  if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  {
    /* ADC initialization Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_6;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_7;
  sConfig.Rank         = 2;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 3;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  sConfig.Offset       = 0;

  if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  {
    /* Channel Configuration Error */
  }

  /*##-3- Start the conversion process #######################################*/
  if(HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 3) != HAL_OK)
  {
    /* Start Conversation Error */
  }

}


Her kanal için ayrı ayrı ayarlama yapıp Rank değerlerini 1-2-3 şeklinde belirledim. Ama buna rağmen çalışmadı hala 2. Kanaldan sürekli sıfır okuyorum. Normalde float değerler gelmesi lazım. Ama 1 ve 3 değişiyor. Kanallardan bir tanesi, genellikle yukarıda kanal ayarlaması yaparken en son hangisini ayarladıysam o kanal düzgün çalışıyor.

Bu Rank denilen olay nasıl işliyor? Benim sorunum nedir?
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 13 Ocak 2016, 23:48:40
şunu:

  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 3)

şöyle yapsan?:

  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)uhADCxConvertedValue, 3)


Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 00:15:20
Hocam kartı ofiste bıraktım Sabah Deneyeyim ama farkedermiki? 0. elemanın adresini göndermişim ben orada.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: PROTECH_ - 14 Ocak 2016, 00:27:06
Stm32 hal kutuphanesi tam bi fiyasko.
Std library bundan kat kat iyi.
Adam akilli bi dokumantasyon yok .
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 08:11:49
Doküman gerçekten az. Çok sıkıntı yaşıyorum.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 14 Ocak 2016, 09:36:56
sorun şurada olabilir mi?
uhADCxConvertedValue 16-bitlik bir değişken.
ama

HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 3)

burada 32-bite çevrilip işlem yapılıyor.
yani ilk iki 16-bit birleştirilip tek değişken olarak yazılıyor sanki?

HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 6)

yapsan olur mu acaba?
şuradaki arkadaş ta ayrılacak alanı 2 ile çarpmış ve bir soru üzerine neden böyle yaptığını da açıklamış.
http://tunizem.blogspot.com.tr/2014/09/using-adc-with-dma-on-stm32.html (http://tunizem.blogspot.com.tr/2014/09/using-adc-with-dma-on-stm32.html)
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 09:56:57
@Böcek dediğin mantıklı gerçekten. Verinin boyutu 32 bit yapılıyor.
DMA ayarlarında veri boyutu 32 bit olarak ayarlıydı.

  hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

Veri boyutunu HALFWORD olarak değiştirdim.

Öyle olunca 2. byte 0 oluyor normal olarak. Haliyle 16 bitlik değerin yüksek 16 biti daima sıfır olduğundan ben ekranda onu görüyorum.

Bu konuyu iyice bir araştırayım. Muhtemelen sorun budur.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 14 Ocak 2016, 10:03:00
Yukarıda verdiğim linkteki arkadaş stm32f4 ref manuel'deki http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf (http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf)

Table 47'yi işaret etmiş konu ile ilgili.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 12:06:12
Evet Tablo 7'yi az önce inceledim.
(http://s14.postimg.cc/ug9ebdvqp/Ekran_Al_nt_s.png)
Bu tabloya dikkat etmek gerek. Öğrenmiş olduk.

Eğer Değişken boyutu 16 bit ise Lenght kısmı dizi boyutunun 2 katı olmalı.

Dediğiniz gibi ADC ayarlarını değiştirdim. Şuan çok şükür çalıştı  :) Yalnız bir sıkıntı var.

ADC kanalları birbirinden etkileniyor nedense. Sebebini anlayamadım ama çözmem lazım.

Şöyle anlatayım.
1 Tane potansiyometrem ve 3 adet analog girişim var
Analog Girişler CH6, CH7 ve CH8 (GPIOlardan PF8, PF9 ve PF10)

Potu CH6 Ya bağlıyorum. CH7 ve CH8 boşta yani float konumunda. CH6 dan potun değerini okuyorum sıkıntı yok. Ama CH7 bundan etkileniyor. Potun değerini arttırırsam CH7'ninde değeri birazcık artıyor. CH7 boştayken 2500 civarı flaot bir değer veriyor.

Sonra Potu CH7'ye bağlıyorum. CH7'den normal olarak Potun değeri okunuyor ama bu seferde CH8 etkileniyor CH7 den. CH7 değeri arttırıldığı zaman CH8 de biraz artıyor. Aynı şekilde Potu CH8'e bağlıyorum yine CH8'den normal olarak veri alıyorum ama CH7 etkileniyor.

Tek sorun bu şuanda. Bu etkilenme sorunu neden olur fikriniz var mı?
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 14 Ocak 2016, 12:53:25
Şundan olabilir:
ADC_SAMPLETIME_3CYCLES
Daha büyük bir 'sampletime' seçip deneyebilirsin.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 14:39:42
Hocam hepsini denedim. En son ADC_SAMPLETIME_480CYCLES yaptım ama düzelmedi.

Şöyle bir durum var.
ADC tetikleme hızını 10Hz gibi düşük bir değer yapıyorum. ADC yavaş çalışıyorken Bu etkilenme çok az oluyor Fakat tetikleme hızını arttırırsam eğer etkilenme daha fazla oluyor. Bütün kanallar etkileniyor. Mesela potu CH7'ye bağlıyorum. CH7 4095 gösteriyorken CH8, 3000 küsürlere kadar çıkıyor. CH6 da 2000 lere kadar çıkıyor.

Timerden her tetikleme sinyali geldiğinde ADC girişindeki MUX kanal değiştiriyor bir sonraki kanal için ölçüm yapıyor. Bu sırada nasıl bir durum oluşsunki diğer kanallar birbirini etkilesin? Fikri olan var mı?

İsterseniz problem ile ilgili video çekebilirim.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 14 Ocak 2016, 14:56:30
Şuradaki kişi de aynı problemden muzdarip olmuş ve sample time'ı arttırarak çözmüş ama sende işe yaramadı.
Kodlarını bir incele istersen.
Şöyle bir satır gözüme çarpıyor:
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 15:23:26
Bana kalırsa iki örnek arası biraz beklenmesi gerekiyor.  Sürekli kanal drgistirince kanallar bibirinden etkileniyor olsa gerek.

Daha önce asm ve pic 16f877 de başıma geldiğini  hatırlıyorum.  Kanal değiştirmeden önce bekleme yapıyordum. örnekleme süresi uzatilsada  iki ornek arasi gecikme olmadığından problem devam ediyor.  En azından adc çalışma hızı artınca bu problemin daha fazla kendini gostermesini bu şekilde yorumluyorum.  Tabi stm 32 lerdeki adc yapısını tam bilmiyorum bende farklı bir durumda olabilir.  An itibariyle sorunu nasıl halledecegimi bilmiyorum.  Bahsettiğiniz kod iki örnek arası gecikme koyuyorsa eğer sorunu çözebilir. Ama bunun HAL kütüphanesindeki karşılığına bakmam lazım
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: yldzelektronik - 14 Ocak 2016, 15:32:53
Her ölçümü aldıktan sonra bir müddet beklemelisin.Bunu aynı kanaldan yaparken bile kullanmakta fayda var.Hangi denetleyici idi hatırlamıyorum (Stm32 ailesinden hangisi) ama dokümanlarından birinde bunu kısaca izah eden bir yer gördüğümü hatırlıyorum.Kaldı ki adcnin genel yapısını göz önüne aldığında da görebilirsin.

Hatta @z nin konularından birinde konuşuldu diye hatırlıyorum.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: bocek - 14 Ocak 2016, 16:31:16
/[i] ADC1 init function [/i]/
void MX_ADC1_Init(void)
{

  ADC_ChannelConfTypeDef sConfig;
  ADC_MultiModeTypeDef multimode;
...
...
...
  sConfig.Channel = ADC_CHANNEL_8;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
  HAL_ADC_ConfigChannel(&hadc1, &sConfig);

    /**Configure the ADC multi-mode
    */
  multimode.Mode = ADC_MODE_INDEPENDENT;
  multimode.TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;
  HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode);
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: z - 14 Ocak 2016, 16:50:03

(http://www.cncdesigner.com/resimler/RADC.gif)

http://www.cncdesigner.com/wordpress/?p=655 (http://www.cncdesigner.com/wordpress/?p=655)
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 14 Ocak 2016, 23:16:35
Abilerim dostlarım, Az önce deneyebildim kodu. Fakat devam ediyor sorun

Son haliyle ADC ayarlarım aşağıdaki gibi. MultiMode TwoSamplingDelay 20Cylces olacak şekilde ayarladım. Daha fazlada artmıyor zaten. Başka bir sorun olduğunu düşünüyorum. Çünkü gerçekten aşırı etkileniyor. Kabul edilebilir gibi değil.

static void ADC_Config(void)
{
  ADC_ChannelConfTypeDef sConfig;
ADC_MultiModeTypeDef MultiMode;
  /*##-1- Configure the ADC peripheral #######################################*/
  AdcHandle.Instance          = ADC3;
 
  AdcHandle.Init.ClockPrescaler        = ADC_CLOCKPRESCALER_PCLK_DIV4;
  AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  AdcHandle.Init.NbrOfConversion       = 3;
  AdcHandle.Init.ScanConvMode          = ENABLE;                        /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */
  AdcHandle.Init.ContinuousConvMode    = DISABLE;                       /* Continuous mode disabled to have only 1 conversion at each conversion trig */
  AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */
  AdcHandle.Init.NbrOfDiscConversion   = 0;
  AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_RISING;        /* Conversion start trigged at each external event */
  AdcHandle.Init.ExternalTrigConv      = ADC_EXTERNALTRIG2_T2_TRGO;
  AdcHandle.Init.DMAContinuousRequests = ENABLE;
  AdcHandle.Init.EOCSelection          = DISABLE;

  HAL_ADC_Init(&AdcHandle);

  /*##-2- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_6;
  sConfig.Rank         = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  sConfig.Offset       = 0;

  HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

  /*##-3- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_7;
  sConfig.Rank         = 2;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  sConfig.Offset       = 0;

  HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

  /*##-4- Configure ADC regular channel ######################################*/
  sConfig.Channel      = ADC_CHANNEL_8;
  sConfig.Rank         = 3;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  sConfig.Offset       = 0;

  HAL_ADC_ConfigChannel(&AdcHandle, &sConfig);

  /*##-5- Configure MultiMode Settings #######################################*/
MultiMode.Mode=ADC_MODE_INDEPENDENT;
MultiMode.TwoSamplingDelay=ADC_TWOSAMPLINGDELAY_20CYCLES;

  HAL_ADCEx_MultiModeConfigChannel(&AdcHandle, &MultiMode);

  /*##-6- Start the conversion process #######################################*/
  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue, 6);

}


Bunun dışında birde GPIO ve DMA ayarlarının yapıldığı MSP_init fonksiyonu var.
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
  GPIO_InitTypeDef          GPIO_InitStruct;
  static DMA_HandleTypeDef  hdma_adc;

  /*##-1- Enable peripherals and GPIO Clocks #################################*/
  /* ADC3 Periph clock enable */
  __HAL_RCC_ADC3_CLK_ENABLE();
  /* Enable GPIO clock ****************************************/
__HAL_RCC_GPIOF_CLK_ENABLE();
  /* Enable DMA2 clock */
  __HAL_RCC_DMA2_CLK_ENABLE();

  /*##-2- Configure peripheral GPIO ##########################################*/

  /* ADC Channel GPIO pin configuration */

  GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

  /*##-3- Configure the DMA streams ##########################################*/
  /* Set the parameters to be configured */
  hdma_adc.Instance = ADCx_DMA_STREAM;

  hdma_adc.Init.Channel  = ADCx_DMA_CHANNEL;
  hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY;
  hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_adc.Init.MemInc = DMA_MINC_ENABLE;
  hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  hdma_adc.Init.Mode = DMA_CIRCULAR;
  hdma_adc.Init.Priority = DMA_PRIORITY_HIGH;
  hdma_adc.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  hdma_adc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
  hdma_adc.Init.MemBurst = DMA_MBURST_SINGLE;
  hdma_adc.Init.PeriphBurst = DMA_PBURST_SINGLE;

  HAL_DMA_Init(&hdma_adc);

  /* Associate the initialized DMA handle to the ADC handle */
  __HAL_LINKDMA(hadc, DMA_Handle, hdma_adc);

  /*##-4- Configure the NVIC for DMA #########################################*/
  /* NVIC configuration for DMA transfer complete interrupt */
  HAL_NVIC_SetPriority(ADCx_DMA_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(ADCx_DMA_IRQn);
}


Sonuç:
https://www.youtube.com/watch?v=NkiLlNQ1SH4 (https://www.youtube.com/watch?v=NkiLlNQ1SH4)
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 15 Ocak 2016, 18:06:08
Başka ne yapabilirim? Fikri olan varmı
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: PROTECH_ - 15 Ocak 2016, 21:46:13
Mucit23 bundan sonrasi datasheet bakar  :P
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 15 Ocak 2016, 22:14:06
Hocam datasheete bakıyorum. Kurcalamadığım tek ayar EOC ayarı kaldı. Yani End Of Conversion.
Bu işlevin çalışmasını anlamaya çalışıyorum.
Datasheette ADCx->SR registerinin 1. biti EOC için ayrılmış. Şöyle bir açıklama var

Alıntı YapBit 1 EOC: Regular channel end of conversion
This bit is set by hardware at the end of the conversion of a regular group of channels. It is
cleared by software or by reading the ADC_DR register.
0: Conversion not complete (EOCS=0), or sequence of conversions not complete (EOCS=1)
1: Conversion complete (EOCS=0), or sequence of conversions complete (EOCS=1)

Ayrıca DisContinuous Mode'da ADC Regular Group kısmında (Sayfa 420)
Alıntı YapExample:
• n = 3, channels to be converted = 0, 1, 2, 3, 6, 7, 9, 10
• 1st trigger: sequence converted 0, 1, 2. An EOC event is generated at each
conversion.
• 2nd trigger: sequence converted 3, 6, 7. An EOC event is generated at each
conversion
• 3rd trigger: sequence converted 9, 10.An EOC event is generated at each conversion
• 4th trigger: sequence converted 0, 1, 2. An EOC event is generated at each conversion
Note: When a regular group is converted in discontinuous mode, no rollover occurs.
When all subgroups are converted, the next trigger starts the conversion of the first
subgroup. In the example above, the 4th trigger reconverts the channels 0, 1 and 2 in the
1st subgroup.

Tam olarak ne demek istiyor anlamadım aslında. Acaba EOC aktif olmadığı  için dönüşüm tamamlanmadan mı kanal değiştiriliyor.

Ben birde Timer Trigger olmadan yine ADC yi kendim tetikleyerek sıra ile ölçüm alacam.

Normal olarak pic lerde yaptığım gibi
Kanal değiştir
ADC yi başlat
Örnek Al
Kanal Değiştir
ADC yi başlat
Örnek Al

gibi. Deneyip sonucu yazarım.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: superconductor - 16 Ocak 2016, 07:46:28
Diger iki kanal float iken pot bagli kanala gore durum degistirmesi normal degil mi? Adc pinlerinin empedansi cok yuksek yuksek. 100k gibi bir direncle pulldown yapmayi dene hala etkileniyorsa o zaman problem var denebilir. Ayni durum digital inputlar icinde gecerli float birakip debugdan port input bufferini izleyin pinlerin yoresinden sinyal geciyorsa durumlari zangir zangir degisiyor.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 16 Ocak 2016, 09:41:31
Hocam bu kadar çok etkilenmesi normal değil gibi geldi bana. Ama aynı zamanda ADC girişleride yan yana PF10, PF9 ve PF8 olmak üzere işlemcinin dibinden yan yana duruyor. Bunlar dediğiniz gibi bir birinden etkilenebilir. Ben 100K direnci bir deneyeyim.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: z - 16 Ocak 2016, 11:06:53
Boş ADC pinleri varsa bunları GND ye doğrudan bağlamazsan bu kanallar ölçüm yapılan kanaldan etkilenir. Sesini yukarıda yazmıştım.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: Mucit23 - 20 Ocak 2016, 11:23:22
100K direnç sorunu çözdü. 1M direnç bağladım onunla da sorun çözüldü. Dediğiniz gibi hatlar birbirine çok yakın olduğundan ve ADC giriş empedansı çok yüksek olduğundan birbirinden etkileniyor. Direnç koymadan iki ölçüm arası istediğiniz kadar bekleyin fayda etmiyor.
Başlık: Ynt: Hal kütüphanesinde ADC kanal ayarları nasıl yapılıyor?
Gönderen: astum - 17 Nisan 2018, 14:53:07
Alıntı yapılan: bocek - 13 Ocak 2016, 23:48:40şunu:
  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)&uhADCxConvertedValue[0], 3)şöyle yapsan?:
  HAL_ADC_Start_DMA(&AdcHandle, (uint32_t*)uhADCxConvertedValue, 3)


Muhtemelen benzer problemi yaşıyorum.

https://www.picproje.org/index.php/topic,72715.0.html (https://www.picproje.org/index.php/topic,72715.0.html)