Timer ile ADC kullanımı

Timer ile ADC kullanımı

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.

  1. Bordunuzu seçiniz.
  2. Bordunuzun ayarlarından timer kısmında timer periyodunu ADC nin örnekleme frekansına göre ayarlayı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.