- ADC nedir?
- ARM7-LPC2148'de ADC
- ARM7-LPC2148'deki ADC Pinleri
- ARM7-LPC2148'deki ADC Kayıtları
- LPC2148'de ADxCR Kaydı
- ADxGDR: ADC Global Veri Kaydı
- Gerekli Bileşenler
- Devre şeması
- ADC için ARM7-LPC2148 programlama
Elektronik dünyasında, piyasada sıcaklık, hız, yer değiştirme, basınç vb. Ölçmek için kullanılan birçok analog sensör çeşidi vardır. Analog sensörler, zaman içinde sürekli değişen çıktı üretmek için kullanılır. Analog sensörlerden gelen bu sinyaller, birkaç mikro volttan (uV) birkaç mili volta (mV) kadar değer olarak çok küçük olma eğilimindedir, bu nedenle bir çeşit amplifikasyon gereklidir. Bu analog sinyalleri mikrodenetleyicide kullanmak için, mikro denetleyici yalnızca dijital sinyalleri anladığından ve işlediğinden, analog sinyali dijital sinyale dönüştürmemiz gerekir. Bu nedenle mikro denetleyicinin çoğu, ADC (Analogdan Dijitale dönüştürücü) adı verilen dahili bir önemli özelliğe sahiptir . Mikrodenetleyicimiz ARM7-LPC2148 ayrıca ADC özelliğine sahiptir.
Bu eğitimde, bir Analog pinine değişen bir voltaj sağlayarak ADC'yi ARM7-LPC2148'de nasıl kullanacağımızı ve analogdan dijitale dönüştürdükten sonra 16x2 LCD ekranda görüntüleyeceğimizi göreceğiz. Öyleyse ADC hakkında kısa bir girişle başlayalım.
ADC nedir?
Daha önce de belirtildiği gibi ADC, Analogdan dijitale dönüştürme anlamına gelir ve analog değerleri gerçek dünyadan 1'ler ve 0'lar gibi dijital değerlere dönüştürmek için kullanılır. Peki bu analog değerler nelerdir? Bunlar sıcaklık, hız, parlaklık vb. Günlük yaşamımızda gördüğümüz parametrelerdir. Bu parametreler ilgili sensörler tarafından analog voltajlar olarak ölçülür ve daha sonra bu Analog değerler mikrodenetleyiciler için Dijital değerlere dönüştürülür.
ADC aralığımızın 0V ile 3.3V arasında olduğunu ve 10 bitlik bir ADC'ye sahip olduğumuzu varsayalım, bu, 0-3.3 Volt giriş voltajımızın 1024 seviyeli ayrık analog değere (2 10 = 1024) bölüneceği anlamına gelir. Anlamı 1024, 10 bitlik ADC için çözünürlüktür, benzer şekilde 8 bitlik ADC çözünürlüğü 512 (28) ve 16 bitlik ADC çözünürlüğü 65.536 (216) olacaktır. LPC2148, 10 bit çözünürlüklü ADC'ye sahiptir.
Bununla gerçek giriş voltajı 0V ise MCU'nun ADC'si 0 olarak okuyacak ve 3.3V ise MCU 1024'ü okuyacak ve 1.65v gibi bir yerde ise MCU 512 okuyacaktır. Aşağıdakileri kullanabiliriz. ADC Çözünürlüğü ve Çalışma voltajına dayalı olarak MCU tarafından okunacak dijital değeri hesaplamak için formüller.
(ADC Çözünürlüğü / Çalışma Gerilimi) = (ADC Dijital Değeri / Gerçek Gerilim Değeri)
Örneğin referans voltajı 3v ise:
ADC'yi bir önceki yazımızda detaylı olarak anlattık.
ARM7-LPC2148'de ADC
- LPC2148, iki analogdan dijitale dönüştürücü içerir.
- Bu dönüştürücüler tek 10 bitlik ardışık yaklaşım analogdan dijitale dönüştürücülerdir.
- ADC0'ın altı kanalı varken, ADC1'in sekiz kanalı vardır.
- Bu nedenle, LPC2148 için mevcut ADC girişlerinin toplam sayısı 14'tür.
- Giriş voltajını yalnızca (0 - 3.3V) aralığında dönüştürür. Voltaj referansını 3,3V aşmamalıdır. IC'ye zarar vereceği ve belirsiz değerler sağlayacağı için.
LPC2148'de ADC'nin bazı önemli özellikleri
- Her dönüştürücü, saniyede 400.000'den fazla 10 bit örnekleme kapasitesine sahiptir.
- Her analog giriş, kesinti ek yükünü azaltmak için özel bir sonuç kaydına sahiptir.
- Tekli veya çoklu girişler için burst dönüştürme modu.
- Giriş pini veya zamanlayıcı eşleşme sinyali üzerindeki geçişte isteğe bağlı dönüştürme.
- Her iki dönüştürücü için Global Başlatma komutu.
Ayrıca diğer Mikrodenetleyicilerde ADC'yi nasıl kullanacağınızı kontrol edin:
- Arduino Uno'da ADC Nasıl Kullanılır?
- ADC0808 ile 8051 Mikrodenetleyici arasında arayüz oluşturma
- PIC Mikrodenetleyicisinin ADC Modülünü Kullanma
- Raspberry Pi ADC Eğitimi
- MSP430G2'de ADC nasıl kullanılır - Analog Gerilim Ölçümü
- STM32F103C8'de ADC nasıl kullanılır
ARM7-LPC2148'deki ADC Pinleri
Daha önce belirtildiği gibi, ARM7-LPC2148'de 6 analog giriş pinli iki kanal ADC0 ve 8 analog giriş pinli ADC1 vardır. Yani analog girişler için toplam 14 pin vardır. Aşağıdaki diyagram, analog giriş için kullanılabilen pinleri göstermektedir.
ADC giriş pinleri diğer GPIO pinleri ile çoklandığından. ADC işlevini seçmek için PINSEL kaydını yapılandırarak bunları etkinleştirmemiz gerekir.
Aşağıdaki tablo, ADC pinlerini ve LPC2148'deki saygın ADC kanal numarasını göstermektedir. AD0, 0 kanalı ve AD1, kanal 1'dir
LPC2148 Pimi |
ADC Kanalı Hayır |
P0.28 |
AD0.1 |
P0.29 |
AD0.2 |
P0.30 |
AD0.3 |
P0.25 |
AD0.4 |
P0.4 |
AD0.6 |
P0.5 |
AD0.7 |
P0.6 |
AD1.0 |
P0.8 |
AD1.1 |
P0.10 |
AD1.2 |
P0.12 |
AD1.3 |
P0.13 |
AD1.4 |
P0.15 |
AD1.5 |
P0.21 |
AD1.6 |
P0.22 |
AD1.7 |
ARM7-LPC2148'deki ADC Kayıtları
Kayıtlar, LPC2148'de A / D dönüştürme özelliğini kullanmak için programlamada kullanılır.
Aşağıda, A / D dönüşümü için LPC2148'de kullanılan kayıtların bir listesi bulunmaktadır
1. ADCR: Analogdan Dijitale Kontrol Kaydı
Kullanım: Bu kayıt, LPC2148'deki A / D dönüştürücüyü yapılandırmak için kullanılır
2. ADGDR: Analogdan Dijitale Global Veri Kaydı
Kullanım: Bu yazmaç, A / D dönüştürücü için YAPILDI bitine sahiptir ve dönüşümün SONUÇ burada saklanır.
3. ADINTERN: Analogdan Dijitale Kesme Etkinleştirme Kaydı
Kullanım: Bu bir Kesme Etkin kütüğüdür.
4. ADDR0 - ADDR7: Analogdan Dijitale Kanal Veri Kaydı
Kullanım: Bu kayıt, ilgili kanallar için A / D değerini içerir.
5. ADSTAT: Analogdan Dijitale Durum Kaydı.
Kullanım: Bu kayıt, ilgili ADC kanalı için DONE bayrağını ve ayrıca ilgili ADC kanalı için OVERRUN bayrağını içerir.
Bu eğitimde sadece ADCR ve ADGDR kayıtlarını kullanacağız. Onları detaylı olarak görelim
LPC2148'de ADxCR Kaydı
Sırasıyla kanal 0 ve kanal 1 için AD0CR ve AD1CR. 32 bitlik bir kayıt. Aşağıdaki tablo, ADCR kaydı için bit alanlarını göstermektedir.
31:28 |
27 |
26:24 |
23:22 |
21 |
20 |
19:17 |
16 |
15: 8 |
7: 0 |
AYRILMIŞ |
KENAR |
BAŞLAT |
AYRILMIŞ |
PDN |
AYRILMIŞ |
CLKS |
PATLAMAK |
CLCKDIV |
SEL |
Bireysel kayıtların nasıl yapılandırılacağını görelim
1. SEL: (0 - 7) arasındaki bitler, ADC dönüşümü için kanalı seçmek için kullanılır. Her kanal için bir bit ayrılmıştır. Örneğin Bit-0'ın ayarlanması, ADC'nin dönüşüm için AD0.1'i örneklemesini sağlayacaktır. Ve bit -1 ayarlandığında AD0.1 olacaktır; benzer şekilde bit-7'nin ayarlanması AD0.7 için dönüştürme yapacaktır. Önemli adım, kullandığımız porta göre PINSEL'e sahip olmamızdır, örneğin PLC2148'de PORT0 için PINSEL0.
2. CLCKDIV: (8'den 15'e) gelen bitler Clock Divisor içindir. Burada APB saati (ARM Çevresel Veriyolu saati), LPC2148'de ardışık yaklaşım yöntemini kullandığımız için A / D dönüştürücü için gerekli saati oluşturmak üzere bu değer artı bir ile bölünür; bu, 4.5 MHz'den küçük veya ona eşit olmalıdır.
3. BURST: Bit 16, BURST dönüştürme modu için kullanılır.
Ayar 1: ADC, SEL bitlerinde seçilen tüm kanallar için dönüştürme yapacaktır.
Ayar 0: BURST dönüştürme modunu devre dışı bırakır.
4. CLCKS: (17'den 19'a) üç bitlik bitler, sürekli A / D dönüştürme modu olduğu için burst modunda A / D dönüşümü için çözünürlüğü ve saat sayısını seçmek için kullanılır.
Bit değeri (17 ila 19) |
Bitler (Doğruluk) |
Saat yok |
000 |
10 |
11 |
001 |
9 |
10 |
010 |
8 |
9 |
011 |
7 |
8 |
100 |
6 |
7 |
101 |
5 |
6 |
110 |
4 |
5 |
111 |
3 |
4 |
5. PDN: Bit 21, LPC2148'de ADC'nin Güç Kapatma Modunu seçmek içindir.
- A / D, PDN modunda.
- A / D çalışma modunda
6. BAŞLAT: (24 - 26) arasındaki bitler BAŞLAT içindir. BURST dönüştürme modu 0 ayarlanarak KAPALI olduğunda, bu BAŞLAT bitleri A / D dönüşümünün ne zaman başlatılacağı için kullanışlıdır. START, kenar kontrollü dönüştürme için de kullanılır. Bu, LPC2148'in CAP veya MAT pininde bir giriş olduğunda, A / D dönüştürmeye başlar. Aşağıdaki tabloyu kontrol edelim
Bit Değeri (24-26) |
LPC2148 PIN'leri |
ADC'nin işlevi |
000 |
ADC'yi PDN modunda ayarlamak için kullanılır Başlama Yok |
|
001 |
A / D Dönüşümünü Başlatın |
|
010 |
CAP0.2 / MAT0.2 |
LPC2148'in CAP / MAT pinlerinde pim 27'de (Yükselen veya Düşen) seçilen EDGE'de A / D dönüşümünü başlatın |
011 |
CAP0.0 / MAT0.0 |
|
100 |
MAT0.1 |
|
101 |
MAT0.3 |
|
110 |
MAT1.0 |
|
111 |
MAT1.1 |
7. EDGE 27 inci biraz başlangıç biti 010-111 içeren zaman kullanılır, EDGE içindir. Bunun için yukarıdaki tabloyu görebileceğiniz CAP veya MAT girişi olduğunda dönüşüme başlar.
Ayar : 0 - Düşen Kenarda
1 - Yükselen Kenarda
ADxGDR: ADC Global Veri Kaydı
Sırasıyla ADC Kanalı 0 ve ADC kanalı 1 için AD0GDR ve AD1GDR.
32 bitlik bir kayıt, A / D dönüşümünün SONUÇ'unu ve ayrıca A / D dönüşümünün yapıldığını gösteren DONE bitini içerir. Aşağıdaki tablo ADGDR kaydı için bit alanlarını göstermektedir.
31 |
30 |
29:27 |
26:24 |
23:16 |
15: 6 |
5: 0 |
YAPILDI |
AŞIRI |
AYRILMIŞ |
CHN |
AYRILMIŞ |
SONUÇ |
AYRILMIŞ |
1. SONUÇ: Bu bitler (6 ila 15), ADCR SEL kaydında seçilen kanal için A / D dönüşümünün sonucunu içerir. Değer yalnızca A / D dönüşümü tamamlandıktan sonra okunur ve bu DONE biti ile gösterilir.
ÖRNEK: 10 Bitlik bir ADC sonucu için saklanan değer (0 ila 1023) arasında değişir.
2. KANAL: Bu 24 ila 26 bitleri, A / D dönüşümünün yapıldığı kanal numarasını içerir. Dönüştürülen dijital değer RESULT bitinde mevcuttur.
ÖRNEK: 000, ADC kanalı 0 ve 001, ADC kanalı 1 vb. İçindir.
3. aşıldı: 30 inci taşması bit REFERANS modunda kullanılır. 1 ayarlandığında, önceki dönüştürülmüş ADC değerinin üzerine yeni dönüştürülmüş ADC değeri yazılır. Kayıt okunduğunda, OVERRUN bitini temizler.
4. DONE: 31. bit, DONE biti içindir.
Set 1: A / D dönüşümü tamamlandığında.
Set 0: Kayıt okunduğu ve ADCR yazıldığı zaman.
ADC'de kullanılan önemli yazmaçları LPC2148'de gördük. Şimdi ARM7'de ADC kullanmaya başlayalım.
Gerekli Bileşenler
Donanım
- ARM7-LPC2148 Mikrodenetleyici
- 3.3V voltaj regülatörü IC
- 5V voltaj regülatörü IC
- 10K Potansiyometre - 2 Adet
- LED (Herhangi Bir Renk)
- LCD ekran (16X2)
- 9V pil
- Breadboard
- Kabloların Bağlanması
Yazılım
- Keil uVision5
- Sihirli Flaş Aracı
Devre şeması
Aşağıdaki tablo, LCD ve ARM7-LPC2148 arasındaki devre bağlantılarını göstermektedir.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (Kayıt Seçimi) |
P0.6 |
E (Etkinleştir) |
P0.12 |
D4 (Veri pini 4) |
P0.13 |
D5 (Veri pimi 5) |
P0.14 |
D6 (Veri pini 6) |
P0.15 |
D7 (Veri pini 7) |
ARM 7 - LPC2148 ile LCD'yi kullanma hakkında daha fazla bilgi edinin.
ÖNEMLİ: Burada biri 5V LCD ekran için ve diğeri analog giriş için potansiyometre ile değiştirilebilen 3.3V olmak üzere iki voltaj regülatörü IC kullanıyoruz.
Arasındaki bağlantıları LCD & ARM7 Stick ile 5V Gerilim Regülatörü
5V Voltaj Regülatörü IC |
Pin işlevi |
LCD ve ARM-7 LPC2148 |
1. Sol Pim |
Pil 9V Girişinden + Ve |
NC |
2. Merkez Pimi |
- Ve pilden |
VSS, R / W, K LCD ARM7'nin GND'si |
3. Sağ Pim |
Düzenlenmiş + 5V Çıkış |
VDD, A LCD + 5V / ARM7 |
LCD'li potansiyometre
LCD ekranın kontrastını değiştirmek için bir potansiyometre kullanılır. Bir potun üç pimi vardır, Sol pim (1) + 5V'ye ve orta (2) LCD modülünün VEE veya V0'ına ve sağ pim (3) GND'ye bağlanır. Düğmeyi çevirerek kontrastı ayarlayabiliriz.
3.3V voltaj regülatörlü LPC2148 ve potansiyometre arasındaki bağlantı
3.3V Voltaj Regülatörü IC |
Pin işlevi |
ARM-7 LPC2148 |
1. Sol Pim |
- Ve pilden |
GND pimi |
2. Merkez Pimi |
Düzenlenmiş + 3.3V Çıkış |
Potansiyometreye Giriş ve potansiyometre çıkışına P0.28 |
3. Sağ Pim |
Pil 9V Girişinden + Ve |
NC |
ADC için ARM7-LPC2148 programlama
ARM7-LPC2148'i programlamak için keil uVision ve Flash Magic aracına ihtiyacımız var. ARM7 Stick'i mikro USB portu üzerinden programlamak için USB Kablosu kullanıyoruz. Keil kullanarak kod yazıyoruz ve bir hex dosyası oluşturuyoruz ve ardından HEX dosyası Flash Magic kullanarak ARM7 çubuğuna flash yapıyor. Keil uVision ve Flash Magic'in yüklenmesi ve bunların nasıl kullanılacağı hakkında daha fazla bilgi için ARM7 LPC2148 Mikrodenetleyiciye Başlarken bağlantısını izleyin ve Keil uVision kullanarak Programlayın.
Bu eğitimde analog giriş voltajını (0 - 3.3V) LPC2148'de ADC kullanarak dijital değere dönüştürüyoruz ve analog voltajı LCD ekranda (16x2) görüntülüyoruz. Giriş analog voltajını değiştirmek için bir potansiyometre kullanılacaktır.
ARM7-LPC2148 4-bit modu ile LCD arabirimi hakkında daha fazla bilgi edinmek için bu bağlantıyı izleyin.
ARM 7 ile ADC kullanarak tam kodu burada biz bunun birkaç parça açıklıyoruz, bu yazının sonunda verilmiştir.
LPC2148-ADC programlamasına dahil olan adımlar
1. PINSEL kaydı, LPC2148'in port pinini ve analog giriş olarak ADC işlevini seçmek için kullanılır.
PINSEL1 = 0x01000000; // AD0.1 olarak P0.28'i seçin
2. ADxCR'ye (ADC kontrol kaydı) değer yazarak dönüştürme için saat ve bit doğruluğunu seçin.
AD0CR = 0x00200402; // ADC işlemini 10 bit / dönüşüm için 11 CLK olarak ayarlar (000)
3. Değeri ADxCR'de START bitlerine yazarak dönüştürmeyi başlatın.
İşte 24 yazdım inci AD0CR kayıt biraz.
AD0CR = AD0CR - (1 << 24);
4. Şimdi 0'dan 1'e değiştiği için karşılık gelen ADxDRy'nin (ADC veri kaydı) DONE bitini (31.) kontrol etmeliyiz. Bu nedenle 31. bit veri kaydında dönüşüm yapılıp yapılmadığını sürekli kontrol etmek için while döngüsünü kullanıyoruz.
while (! (AD0DR1 & 0x80000000));
5. Biten bit 1'e ayarlandıktan sonra, dönüştürme başarılı olur, daha sonra sonucu aynı ADC veri kaydı AD0DR1'den okur ve değeri bir değişkende saklarız.
adcvalue = AD0DR1;
Biz adlı bir değişken gerilim ve mağazaya dijital değere dönüştürmek için bir formül kullanabilirsiniz Sonraki gerilimi .
voltaj = ((adcvalue / 1023.0) * 3.3);
5. Analogdan dijitale dönüştürmeden sonra dijital değerleri (0 ila 1023) görüntülemek için aşağıdaki satırlar kullanılır.
adc = adcvalue; sprintf (displayadc, "adcvalue =% f", adc); LCD_DISPLAY (displayadc); // ADC değerini göster (0 ila 1023)
6. Analogdan dijitale dönüştürme ve 5. adımdan sonra giriş analog voltajını (0 - 3.3V) görüntülemek için aşağıdaki satırlar kullanılır.
LCD_SEND (0xC0); sprintf (voltaj değeri, "Voltaj =%. 2f V", voltaj); LCD_DISPLAY (voltaj değeri); // Ekran (giriş analog voltajı)
7. Şimdi giriş voltajını ve dijital değerleri LCD ekranda göstermeliyiz. Bundan önce, LCD ekranı başlatmalı ve görüntülenmek üzere mesaj göndermek için uygun komutları kullanmalıyız.
LCD'yi başlatmak için aşağıdaki kod kullanılır
void LCD_INITILIZE (void) // LCD'yi hazırlama işlevi { IO0DIR = 0x0000FFF0; // P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 pinlerini OUTPUT delay_ms (20) olarak ayarlar; LCD_SEND (0x02); // LCD'yi 4-bit çalışma modunda başlat LCD_SEND (0x28); // 2 satır (16X2 ) LCD_SEND (0x0C); // İmleç kapalı iken göster LCD_SEND (0x06); // Otomatik artış imleci LCD_SEND (0x01); // Ekran net LCD_SEND (0x80); // İlk satır ilk konum }
LCD'deki değerleri görüntülemek için aşağıdaki kod kullanılır
karakterleri yazdırmak için boşluk LCD_DISPLAY (char * msg) // Fonksiyon teker teker gönderilir { i = 0 uint8_t; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // Üst yarım bayt gönderir IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH veri yazdırmak için IO0CLR = 0x00000020; // RW DÜŞÜK Yazma modu delay_ms (2); IO0CLR = 0x00000040; // EN = 0, RS ve RW değişmedi (yani RS = 1, RW = 0) delay_ms (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // Alt yarım bayt gönderir IO0SET = 0x00000050; // RS & EN YÜKSEK IO0CLR = 0x00000020; gecikme_ms (2); IO0CLR = 0x00000040; gecikme_ms (5); i ++; } }
Gecikme oluşturmak için aşağıdaki fonksiyon kullanılır
void delay_ms (uint16_t j) // Milisaniye cinsinden gecikme yapma işlevi { uint16_t x, i; için (i = 0; i
Tanıtım Videosu ile kodun tamamı aşağıda verilmiştir.