STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme

Başlatan Mucit23, 23 Ocak 2025, 12:11:04

Mucit23

Selamlar.

STM32F030 MCU'da 9 kanal adc verisine ihtiyacım var.

Sırayla ADC CH0, ADC CH1.... ADC CH8 arasını okumak istiyorum. (PA0, PA1, .... PA7, PB0) Basit bir uygulama olacak. Regular Conversiyon'da kanal değişimini yapamadım bir türlü.

Denemek için iki kanal okumaya çalıştım. Daima 0. kanalın verisini okuyorum.

Şöyle bir kodum var.

  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
/*Kanal 0 (PA0) Okunuyor. */
ADC_CH_Cfg.Channel = ADC_CHANNEL_0;   //Kanal Secimi   
  ADC_CH_Cfg.RankADC_RANK_CHANNEL_NUMBER
    ADC_CH_Cfg.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc, &ADC_CH_Cfg) != HAL_OK//Kanal Ayarlaniyor
  {
    Error_Handler();
  }
if (HAL_ADC_Start(&hadc) != HAL_OK) //ADC'yi Baslat
    {
      Error_Handler();
    }
if (HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY) != HAL_OK)//Donusumun tamamlanmasini bekle
{
Error_Handler();
}
ADC_Data[0]=HAL_ADC_GetValue(&hadc);  //Degeri Oku
HAL_ADC_Stop(&hadc);
HAL_Delay(100);
/*Kanal 1 (PA1) Okunuyor. */
ADC_CH_Cfg.Channel = ADC_CHANNEL_1;   //Kanal Secimi   
  ADC_CH_Cfg.RankADC_RANK_CHANNEL_NUMBER;
    ADC_CH_Cfg.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
  if (HAL_ADC_ConfigChannel(&hadc, &ADC_CH_Cfg) != HAL_OK)
  {
    Error_Handler();
  }
if (HAL_ADC_Start(&hadc) != HAL_OK) //ADC'yi Baslat
    {
      Error_Handler();
    }
if (HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY) != HAL_OK)//Donusumun tamamlanmasini bekle
{
Error_Handler();
}
ADC_Data[1]=HAL_ADC_GetValue(&hadc);  //Degeri Oku
HAL_ADC_Stop(&hadc);
HAL_Delay(100);
  }

ADC Ayarlarım ise aşağıdaki gibi.

  hadc.Instance = ADC1;
  hadc.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;
  hadc.Init.Resolution = ADC_RESOLUTION_12B;
  hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
  hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc.Init.LowPowerAutoWait = DISABLE;
  hadc.Init.LowPowerAutoPowerOff = DISABLE;
  hadc.Init.ContinuousConvMode = DISABLE;
  hadc.Init.DiscontinuousConvMode = DISABLE;
  hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc.Init.DMAContinuousRequests = DISABLE;
  hadc.Init.Overrun = ADC_OVR_DATA_PRESERVED;
  if (HAL_ADC_Init(&hadc) != HAL_OK)
  {
    Error_Handler();
  }

Bunun sebebi nedir? DMA ile ölçüm almak istedim. 4 kanal otomatik okuyorum 5 kanal okumak istediğimde sistem donuyor. Bunu da anlayamadım. Regular dönüşüm yapsam yeterli olacak aslında.

sedronjames

adc ayarlarını yapmak için STM32CUBEIDE kullanıyor musun hocam?

Mucit23


sedronjames

cubemx'te parametreleri ayarladığının sayfanın ekran görüntüsünü atma şansın var mı üstat? sanki tüm kanalları scan etmiyor. o kapalı olabilir mi?

Mucit23



Ayarlarım bu şekilde. Aslında DMA ile çalıştırdım. Ama bu yöntemi anlayamadım. Regular mod ile scan etmesine gerek yokki. Her seferinde ölçüm yapılacak olan kanalı değiştiriyorum manuel olarak.

sedronjames

ben de dma kullanmışım. dma kullanınca continuous conversion modunu disable etmek gerekiyordu diye aklımda kalmış. st'nin kütüphanesinde veya bu mx programında bir bug olabilir ağabey. sen daha iyi bilirsin. timerlar ile uğraşırken benim başıma gelmişti. datasheette gösterilen varolan özelliği cubemx'te seçemiyordum.

Mucit23

Normalde Scan Conversion Mode Disabled Olabilmesi lazım ama CubeMX müsade etmiyor.

PROTECH_

Continiues mod + DMA
Ve Rank sırasi ile istedigin kanali sirasiyla tarayabilirsin
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

Tagli

Alıntı yapılan: PROTECH_ - 27 Ocak 2025, 13:57:25Continiues mod + DMA
Continuous değil, Scan mode gerekiyor.

Continuous Mode: İşlem bittikten sonra otomatik olarak tekrar başlar, tetik sinyali beklemez.
Scan Mode: Birden fazla kanal sıra ile taranır. DMA'sız kullanım pek mümkün/pratik değil.

İhtiyaca göre bu iki mod beraber de kullanılabilir. Ama ben genelde belirli bir periyodda yazılımsal veya donanımsal tetiklemeyi (mesela bir TIM ile) tercih ediyorum. Continuous mode ile kendi kendine tekrar başlaması pek işime gelmiyor.
Gökçe Tağlıoğlu

PROTECH_

Alıntı yapılan: Tagli - 27 Ocak 2025, 18:58:33Continuous değil, Scan mode gerekiyor.

Gerekiyor nerden, sen mi yaptiriyorsun projeyi?

Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN