9 Kasım 2015 Pazartesi


STM32F407 Analog Dijital Çeviriciler
Donanım – ADC Bloğu
STM32F407 mikrodenetleyicisinin içerisinde 3 (üç) adet 12-bit analog dijital çevirici (ADC) blok bulunur. Her ADC bloğun çevrim süresi yaklaşık 1us’dir. ADC yapılandırması çok çeşitlidir ve biz bu yazımızda basit olarak iki voltajın ölçümünü eş zamanlı olarak 2 (iki) ADC kullanarak gerçekleştireceğiz.

Basitleştirilmiş bir ADC blok şeması Figür 1’de verilmiştir. (Blok şema RM0090 teknik dokümanından Figür 44 sayfa 387’den alınmıştır.) ADC bloğunun komplesi 2 (iki)den fazla ADC, bazı özellikler ve ek olarak bazı ayarlar içermektedir.

                                                 Figür 1. ADC blok diyagramı

Figür 1’de resmin merkezinde ADC yer almaktadır. Besleme hattı VDDA ve VSSA, referans hatları olan VREF+ ve VREF- ve mikrodenetleyicinin tüm pin’lerini bu çalışma şekli desteklemektedir. Ek olarak, ADCCLK olarak adlandırılan gerekli olan clock sinyali mikrodenetleyici tarafında üretilmektedir. Analog giriş sinyalleri mikrodenetleyicinin ADCx_INxx olarak isimlendirilen pin’lerinden dış dünya ile bağlantı yapılır ve “Analog mux” olarak isimlendirilen bir multiplexer’a girerler. Dış dünyadan bağlanabilen 16 pin mevcuttur ve multiplexer’a ek olarak 3 (üç) girişe daha izin verilir. Bu bahsi geçen 3 (üç) giriş mikrodenetleyicinin sıcaklığını, besleme voltajını ve referans hattını ölçmek için kullanılmaktadır. ADC register’ları ile bu pin’ler seçilebilir. Bu seçim manuel olarak yapılmak isteniyor ise ADCx_SQR3 register’ı kullanılır.

                ADC çevrim sonucunu “Regular Data Register(ADCx_DR)” register’ının içerisine yazar. Burada kullanılan “x” Hangi ADC’nin kullanılacağını belirtir(1,2 veya 3 gibi).

                ADC bloğu donanımda önceden belirlenen 16 pin için ardışık çevrimlerin sayısı kadar ardışık çevrim modu uygulanmasına niyetlenildiğinde, istenen Multiplexer ayarları ADCx_SQR1 ve ADCx_SQR2 register’ları ayarlanmalıdır. Buna rağmen çevrim sonuçlarının tutulduğu bir register bulunur bu nedenle bir kullanıcı programı veya DMA donanımı sonraki çevrim bitmeden önce veri register’ındaki çevrim sonucunu taşımak zorundadır.

                Çevrim parametreleri ADCx_CR1 ve ADCx_CR2 register’ları içerisindeki bit’lerin set edilmesi ile kullanılır. ADCx_SMPR1 ve ADCx_SMPR2 register bit’leri vasıtası ile her çevrim sırasının örnek alma zamanı ayarlanır. Ayrıca, çevrim mikrodenetleyicinin diğer donanımlarından gelen çeşitli sinyaller ile veya yazılım ile başlatılabilir ve bu figür 1’de alt tarafında gösterilmiş olan Multiplexer ile seçilebilir. Detay için RM0090 teknik dokümanında Figür 1 bölüm 11’e bakabilirsiniz.

                Örnek bir program hazırladık ve Figür 2’de listeledik. Bu program ADC1 ve ADC2’yi PA2 ve PA3 pinleri üzerindeki voltajı ölçmek için kullanmıştır. ADC’lerin, Port A ve LCD ekranın kurulumları ile program başlar ve ardından sonsuz döngü içerisine girer. Sonsuz döngü içinde yazılım komut ile ölçümü başlatır ve biraz zaman gecikmesi ile çevrimin bitmesini bekler. Sonunda her iki ADC sonuçları LCD ekrana gönderilir.

                Bazı kurulumlar her ADC için ortaktır. Bu ortak bit’ler ADC ortak register’ı olan kontrol register (ADC_CRR) içerisinde yer alır. Diğer kurulumlar her ADC için ayrıdır ve eşleşen bit’ler her ADC için bölünmüş register’larda tutulurlar.

Demo program eş zamanlı modda çalışan 2 (iki) ADC kullanır. Her iki ADC bir yazılım komutuyla çevrime başlar. Bu seçenek “Regular simultaneous mode only” olarak isimlendirilir ve ADC ortak kontrol register (ADC_CCR, ortak register tüm 3 (üç) ADC içindir) düşük 5 (beş) bit’ine “00110” yazarak seçilir. Tüm ADC’ler için clock varsayılan değerde bırakılmıştır ve pre-scaling aktif edilmemiştir.

Giriş sinyali için örnek alma zamanı varsayılan değerinde ve ADC clock cycle en kısa olacak şekilde bırakılmıştır; örnekleme zamanı değiştirilmek istenir ise her ADC için ayrılmış olan ADCx_SMPR1 ve ADCx_SMPR2 register’ları içerisinde 3 (üç) bit olarak sıralanmış olan kısımlara yazmak gerekir.

 #include "stm32f4xx.h"
#include "LCD2x16.c"
/* giriş pinleri PA2 & PA3 -> analog olarak ayarlanmak zorundadır
  Port A  clock aktif olmalıdır */
int main () {
unsigned int j;
/*-----------------------------------------------------------------------------*/
/* Yazılım tetiklemeli, çift, eş zamanlı örnek alma                     */
/*-----------------------------------------------------------------------------*/
RCC->APB2ENR |= 0x00000100 + 0x00000200;    // ADC1 ve ADC2 clock aktif edilir.
RCC->AHB1ENR |= 0x00000001 + 0x00000002;    // GPIOA ve GPIOB clock aktif edilir.
ADC->CCR = 0x00000006;   // DMA kullanılmaz, Regular simultaneous mode only seçilir.
ADC1->CR2 = 0x00000001;    // Kontrol Register 2: ADC1 açık
ADC1->SQR3 = 0x00000002;  // regular SeQuence Register 3
ADC2->CR2 = 0x00000001;    // Kontrol Register 2: ADC2 açık
ADC2->SQR3 = 0x00000003;  // regular SeQuence Register 3
GPIOA->MODER |= 0x000000f0; // MODE Register -> PA2, PA3 pinleri analog
LCD_init();
LCD_string("ADC1=", 0);
LCD_string("ADC2=", 0x40);
while (1) {
ADC1->CR2 |= ADC_CR2_SWSTART;  // çevrim eş zamanlı başlatılır.
for (j = 0; j<100; j++){};                           // çevrimin bitmesi beklenir.
LCD_Int16((int)ADC1->DR, 0x06, 1);    // sonuç LCD ekranın 1nci satırına yazılır
LCD_Int16((int)ADC2->DR, 0x46, 1);    // sonuç LCD ekranın 2nci satırına yazılır
            };
}



Hiç yorum yok:

Yorum Gönder