Timer ile ADC kullanımı bu kısım ilgili video yardımıyla oluşturulmuştur.
STM32CubeIDE de yeni bir proje başlatınız.
Örneğin ADC örnekleme hızını 4 kHz yapmak istiyorsunuz. CPU saati 168 MHz ise timer ayarlarında Prescalar = 1680 olduğunda (timer saati 100 kHz periyodu 10 mikrosaniye olur. bize 250 mikrosaniye lazım ki ADC örnekleme hızı 4 kHz ve örnekleme periyodu 250 mikro saniye olsun) ve Counter Periyodu 25 olduğunda timer periyodu ayarlanmış demektir. ADC bu periyoda göre başlatılacaktır. Aşağıdaki ayarları yapınız.
Clock Source = Internal Clock
Channel 1=Output Compare No Output
Trigger Event Selection=Update Event
Timer da DMA veya NVIC setlemesi yapılmayacaktır.
ADC setlemeri:
ADC de bir girişi onaylayınız.
DMA settings de ADD ile kullandığınız ADC yi setleyiniz. Seçtiğiniz DMA sürekl olacak sa ADC DMA circular olmalıdır.
ADC nin ayarlarını Parameter settings ten yapınız.
DMA Continous Requests =ENABLE
External Trigger Conversion Source =Timer 3 Trigger Out event (ben Timer 3 ü kullanıyorum.)
External Trigger Conversion EDGE=Trigger Detection On Rising Edge
NVIC sekmesinde hem DMA hemde ADC interruptları onaylı olmalıdır.
Eğer UART kullanacaksanız, UART hızını en hızlı konuma 256000 bits/s a getiriniz.
UART ı DMA ile kullanacaksanız. UART sekmesinde Add ile UART DMA yı ekleyip, NVIC de de interruptlarının onaylı olması gerekir.
Yukarıdaki ayarda ADC DMA ile bellekteki bir dizine sürekli veri yazacak, UART DMA isteği ile DMA göndercek, timer kendi başına çalışacak şekilde bir ayar yapılmıştır. Projeyi oluşturunuz (Generate Code IDE de project setlemesi altındadır.) Bir uzun veri dizisini 16 bitlik veri olarak tanımlayınız. /* USER CODE BEGIN 0 */ uint16_t adc_veri[512];unint8_t mode=0,mode_ex=1; /* USER CODE END 0 */
/* USER CODE BEGIN 2 */ HAL_TIM_Base_Start(&htim3); HAL_ADC_Start_DMA(&hadc1,(uint32_t *) &adc_veri[0],512); /* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc){
mode=1;
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){
mode=0;
}
/* USER CODE END 4 */
/* USER CODE BEGIN WHILE */ while (1) { if((mode == 1) && (mode_ex == 1)) { mode_ex=0; HAL_UART_Transmit_DMA(&huart3,(uint8_t *) &adc_veri[0],512); //ilk 256 kelime yada 512 byte seri porttan gönderilecektir. } if((mode == 0) && (mode_ex == 0)) { mode_ex=1; HAL_UART_Transmit_DMA(&huart3,(uint8_t *) &adc_veri[256],512); //ikinci 256 kelime yada 512 byte seri porttan gönderilecektir. } /* USER CODE END WHILE */ yukarıdaki kod dizinin her bir yarısının dolması ile UART dan veri transferi gerçekleştirecek ve daha sonra bekleyecektir. ÖNEMLİ NOTLAR 1. Eğer bir DMA transferinde 8 bit, 16 veya 32 bit tanımlanmışssa bu boyutta bir değişken dizisi transferi gerçekleyiniz. 2. DMA Transferinin başlatılması o DMA ile ilgili callback fonksiyonu içinde yapılmamalıdır. 3. Kütüphanelerin kullanımında bord üzerinde olan işlemci tipi bilinmeli o işlemci tipine göre kütüphane kullanılmalıdır. 4. Kütüphane ilavesinde Project >Properties > C/C++ Build > Settings opsiyonunda Tool Setting Sekmesinde Libraries kısmında llibrary search path da kütüphanenin bulunduğu klasör ve Libraries de kütüphane adı (İşlemciye göre Doğru ad) verilmelidir. Örneğin libarm_cortexM0l_math.a kütüphanesi için arm_cortexM0l_math ismi verilmelidir. #include "arm_math.h" #include "arm_const_structs.h" #include "arm_common_tables.h" tanımlamaları yapılmalı ve projenin Inc dosyalarının olduğu yere bu dosyalar kopyalanmalıdır.