Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Mucit23 - 23 Ocak 2025, 12:11:04

Başlık: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: Mucit23 - 23 Ocak 2025, 12:11:04
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.Rank =  ADC_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.Rank =  ADC_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.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: sedronjames - 23 Ocak 2025, 13:41:20
adc ayarlarını yapmak için STM32CUBEIDE kullanıyor musun hocam?
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: Mucit23 - 23 Ocak 2025, 14:01:33
Evet CubeMX ile projeyi oluşturuyorum.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: sedronjames - 23 Ocak 2025, 14:40:19
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?
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: Mucit23 - 23 Ocak 2025, 15:25:07
(https://i.hizliresim.com/rrxzq5h.PNG) (https://hizliresim.com/rrxzq5h)

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.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: sedronjames - 23 Ocak 2025, 16:46:39
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.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: Mucit23 - 23 Ocak 2025, 17:39:07
Normalde Scan Conversion Mode Disabled Olabilmesi lazım ama CubeMX müsade etmiyor.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: PROTECH_ - 27 Ocak 2025, 13:57:25
Continiues mod + DMA
Ve Rank sırasi ile istedigin kanali sirasiyla tarayabilirsin
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: Tagli - 27 Ocak 2025, 18:58:33
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.
Başlık: Ynt: STM32F0 ADC Regular Conversiyon'da Kanal Değiştirme
Gönderen: PROTECH_ - 04 Şubat 2025, 20:34:55
Alıntı yapılan: Tagli - 27 Ocak 2025, 18:58:33Continuous değil, Scan mode gerekiyor.

Gerekiyor nerden, sen mi yaptiriyorsun projeyi?