STM32F103 ADC dönüşümünde kullanabileceğimiz 3 metot vardır. Polling, interrupt ve DMA metotlarıdır. Polling en basit metot olup adc dönüşümü bitene kadar MCU bekler. Yapılacak ölçümün çok hızlı olmasının gerekmediği veya uzun zaman aralıklarında tek ölçüm yapılmasının yeterli olduğu durumlarda sıklıkla kullanılır. Interrupt metodunda ise MCU adc'ye çevrim işleminin başlaması için komut verir ve program akışına devam eder. Adc çevrimi tamamlandığında interrupt meydana gelir ve interrupt vektörünün işaret ettiği fonksiyon çağrılır. MCU'nun ADC çevrimini beklemesi gerekmez. DMA (Direct Memory Acces) kullanım şeklinde ADC'ye dönüştürmeye başlaması için mikrodenetleyici tarafından komut verilir ve diğer işlemlere yapılmaya devam eder. ADC'nin çevrimi tamamladıktan sonra ADC değeri hafıza bölgesine DMA tarafından yazılır. Mikrodenetleyici hiç bir şekilde ADC işlemleri ile meşgul olmaz. Özellikle çok sayıda ölçümün art arda ve hızlı yapılmasının istendiği durumlarda DMA kullanılır. Bu örnekte polling metodunu kullanacağız.
STM32F103'ün datasheet'inde maksimum dönüşüm süresi 1MSPS olarak belirtilmiştir. Bu değeri 14 MHZ adc değerinde ve en düşük örnekleme(1.5 döngü) süresinde elde edilebilir. Dönüşüm Zamanı ise 12.5 döngüdür. toplam çevrim zamanı 14 döngü olur. 14MHZ/14 döngü = 1 mikro saniye olur buda 1 MSPS ye eşit olur. Eğer birden fazla kanalı sırayla (scan mode) okuyorsanız, bu hız toplam kanal sayısına bölünecektir. 1 mikro saniye için HCLK 14 ve katları şeklinde olmalıdır. Bundan dolayı en yüksek frekans 56 MHZ olur. HCLK 56 MHZ ve ADC prescaler 14 yaparak devam edelim. ADC1 IN0 seçip diğer ayarları aynı bırakalım. CubeIDE 1.19 da konfigürasyonu buna göre yapıp Project/Generate Code yaparak projemize başlayabiliriz.Proje içindeki main.c dosyasını açıp ve kullanıcı özel değişken alanına ADC den okuyacağız değerlerin yazılacağı değişkenleri tanımlayalım:
/* USER CODE BEGIN PV */
uint32_t adc1, adc2;
/* USER CODE END PV */
Ardından sonsuz döngü bölümüne ise aşağıdaki gibi ADC den okuma kodunu yazalım:
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_Delay(100);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
adc1 = HAL_ADC_GetValue(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 100);
adc2 = HAL_ADC_GetValue(&hadc1);
HAL_ADC_Stop (&hadc1);
/* USER CODE END WHILE */

Debugger den giriş değerini görebiliriz.Debugger araç çubuğunda Resume (F8) komutunu verip programı çalışma moduna aldığımızda da değişkenlerin nasıl değiştiğini izleyebilmekteyiz.
Henüz yorum yapılmamış. İlk yorumu siz yapın!