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’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 "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