Bu, MPLAB ve XC8 kullanarak PIC mikro denetleyicilerini öğrenmeye ilişkin 9. öğreticimizdir. Şimdiye kadar, MPLABX ile çalışmaya başlama, PIC ile yanıp sönen LED, PIC'de Zamanlayıcılar, LCD arayüz oluşturma, 7 segmentli arayüz oluşturma vb. Gibi birçok temel öğreticiyi ele aldık. Mutlak bir acemiyseniz, lütfen PIC eğitimlerinin tam listesini buradan ziyaret edin. ve öğrenmeye başlayın.
Bu eğitimde, PIC mikro denetleyicimiz PICF877A ile ADC'yi Nasıl Kullanılacağını öğreneceğiz.. Mikroişlemci projelerinin çoğu, gerçek dünyadan veri okumak için en çok kullanılan yollardan biri olduğu için, içinde bir ADC (Analogdan Dijitale dönüştürücü) içerecektir. Sıcaklık sensörü, akı sensörü, basınç sensörü, akım sensörleri, voltaj sensörleri, jiroskoplar, ivmeölçerler, mesafe sensörü gibi neredeyse tüm sensörler ve hemen hemen her bilinen sensör veya dönüştürücü, sensörlerin okumasına göre 0V ila 5V arasında bir analog voltaj üretir. Örneğin bir sıcaklık sensörü, sıcaklık 25C olduğunda 2.1V verebilir ve sıcaklık 60C olduğunda 4.7'ye kadar çıkabilir. Gerçek dünyanın sıcaklığını bilmek için, MCU'nun sadece bu sıcaklık sensörünün çıkış voltajını okuması ve bunu gerçek dünya sıcaklığı ile ilişkilendirmesi gerekir. Bu nedenle ADC, MCU projeleri için önemli bir çalışma aracıdır ve onu PIC16F877A'mızda nasıl kullanabileceğimizi öğrenmenizi sağlar.
Ayrıca diğer mikro denetleyicilerde ADC kullanımı hakkındaki önceki makalelerimize bakın:
- Arduino Uno'da ADC Nasıl Kullanılır?
- Raspberry Pi ADC Eğitimi
- ADC0808 ile 8051 Mikrodenetleyici arasında arayüz oluşturma
PIC Mikrodenetleyici PIC16F877A'da ADC:
Mevcut birçok ADC türü vardır ve her birinin kendi hızı ve çözünürlüğü vardır. En yaygın ADC türleri flaş, ardışık yaklaşım ve sigma-deltadır. 16F877A kullanılan ADC'nin tipi ardışık yaklaşım ADC olarak adlandırılan kısa veya SAR. Öyleyse kullanmaya başlamadan önce biraz SAR ADC hakkında bilgi edelim.
Ardışık Yaklaşım ADC: SAR ADC, bir karşılaştırıcı ve bazı mantık konuşmalarının yardımıyla çalışır. Bu tip ADC, bir referans voltajı (değişken olan) kullanır ve bir karşılaştırıcı kullanarak giriş voltajını referans voltajı ile karşılaştırır ve dijital bir çıkış olacak fark, En önemli bit'ten (MSB) kaydedilir. Karşılaştırmanın hızı, PIC'nin çalıştığı Saat frekansına (Fosc) bağlıdır.
Artık ADC hakkında bazı temel bilgileri bildiğimize göre, veri sayfamızı açalım ve ADC'yi PIC16F877A MCU'muzda nasıl kullanacağımızı öğrenelim. Kullandığımız PIC, 10 bitlik 8 kanallı ADC'ye sahiptir. Bu, ADC'mizin çıkış değerinin 0-1024 (2 ^ 10) olacağı ve MCU'muzda analog voltajı okuyabilen 8 pin (kanal) olduğu anlamına gelir. Bizim ADC 10 bit olduğu için 1024 değeri 2 ^ 10 ile elde edilir. Analog voltajı okuyabilen sekiz pim, veri sayfasında belirtilmiştir. Aşağıdaki resme bakalım.
AN0 ile AN7 arasındaki analog kanallar sizin için vurgulanmıştır. Sadece bu pinler analog voltajı okuyabilecektir. Bu nedenle, bir giriş voltajını okumadan önce, kodumuzda giriş voltajını okumak için hangi kanalın kullanılması gerektiğini belirtmeliyiz. Bu eğitimde, bu kanaldaki analog voltajı okumak için bir potansiyometre ile kanal 4'ü kullanacağız.
A / D modülünde, verileri Giriş pinlerinden okumak için yapılandırılması gereken dört kayıt bulunur. Bu kayıtlar:
• A / D Sonucu Yüksek Kayıt (ADRESH)
• A / D Sonucu Düşük Kaydı (ADRESL)
• A / D Kontrol Kaydı 0 (ADCON0)
• A / D Kontrol Kaydı 1 (ADCON1)
ADC için Programlama:
PIC Mikrodenetleyici ile ADC kullanarak program çok basit, sadece bu dört kayıtlarını anlamak ve daha sonra herhangi bir analog voltaj basit olacaktır okuma gerekir. Her zamanki gibi yapılandırma bitlerini başlatın ve void main () ile başlayalım .
İçinde void main () Elimizdeki ADCON1 kayıt ve ADCON0 kayıt kullanarak bizim ADC başlatmak için. ADCON0 kaydı aşağıdaki bitlere sahiptir:
Bu yazmaçta ADON = 1 yaparak ADC modülünü açmalıyız ve ADCS1 ve ADCS0 bitlerini kullanarak A / D Dönüşüm Saatini açmalıyız, gerisi şimdilik ayarlanmayacaktır. Programımızda A / D dönüşüm saati Fosc / 16 olarak seçilmiştir, kendi frekanslarınızı deneyebilir ve sonucun nasıl değiştiğini görebilirsiniz. Tüm ayrıntılar veri sayfasının 127. sayfasında mevcuttur. Bu nedenle ADCON0 aşağıdaki gibi başlatılacaktır.
ADCON0 = 0b01000001;
Şimdi ADCON1 kaydı aşağıdaki bitlere sahiptir:
Bu kayıtta, Fosc / 16'yı tekrar seçmek için A / D Sonuç Formatı Seçimini ADFM = 1'e göre yüksek yapmalı ve ADCS2 = 1 yapmalıyız. Dahili referans voltajını kullanmayı planladığımız için diğer bitler sıfır kalır. Ayrıntıların tamamı veri sayfası 128 sayfasında mevcuttur. Bu nedenle ADCON1 aşağıdaki gibi ayarlayacaktır.
ADCON1 = 0x11000000;
Şimdi ana fonksiyonumuzun içindeki ADC modülünü başlattıktan sonra, while döngüsüne girelim ve ADC değerlerini okumaya başlayalım. Bir ADC değerini okumak için aşağıdaki adımlar izlenmelidir.
- ADC Modülünü başlatın
- Analog kanalı seçin
- Git / Bitti bitini yüksek yaparak ADC'yi başlatın
- Git / Bitti bitinin düşmesini bekleyin
- ADRESH ve ADRESL kayıtlarından ADC sonucunu alın
1. ADC Modülünü Başlatın: Bir ADC'yi nasıl başlatacağımızı zaten öğrendik, bu nedenle ADC'yi başlatmak için aşağıdaki işlevi çağırıyoruz
Void ADC_Initialize () işlev aşağıdaki gibi olduğu.
void ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON ve Fosc / 16 seçilir ADCON1 = 0b11000000; // Dahili referans voltajı seçilir}
2. Analog kanalı seçin: Şimdi ADC değerini okumak için hangi kanalı kullanacağımızı seçmemiz gerekiyor. Bunun için bir işlev yapalım, böylece while döngüsü içindeki her kanal arasında geçiş yapmamız kolaylaşır.
unsigned int ADC_Read (unsigned char channel) {// **** Kanalın seçilmesi ** /// ADCON0 & = 0x11000101; // Kanal Seçim Bitlerinin Temizlenmesi ADCON0 - = kanal << 3; // Gerekli Bitlerin ayarlanması // ** Kanal seçimi tamamlandı *** ///}
Daha sonra seçilecek kanal değişken kanalın içine alınır. Çizgide
ADCON0 & = 0x1100101;
Önceki kanal seçimi (varsa) temizlenir. Bu, bitsel ve "&" operatörü kullanılarak yapılır. 3, 4 ve 5 bitleri 0 olmaya zorlanırken diğerleri önceki değerlerinde bırakılır.
Ardından, kanal numarası üç kez sola kaydırılarak ve bitler veya operatör "-" kullanılarak bitler ayarlanarak istenen kanal seçilir.
ADCON0 - = kanal << 3; // Gerekli Bitleri Ayarlama
3. Git / Bitti bitini yüksek yaparak ADC'yi başlatın : Kanal seçildikten sonra, sadece GO_nDONE bitini yüksek yaparak ADC dönüşümünü başlatmalıyız:
GO_nDONE = 1; // A / D Dönüşümünü Başlatır
4. Go / DONE bitinin alçalmasını bekleyin: GO / DONE biti ADC dönüşümü tamamlanana kadar yüksek kalacaktır, bu nedenle bu bit yeniden düşene kadar beklememiz gerekir. Bu bir while döngüsü kullanılarak yapılabilir.
while (GO_nDONE); // A / D Dönüşümünün tamamlanmasını bekleyin
5. ADRESH ve ADRESL kayıtlarından ADC sonucunu alın: Go / DONE biti tekrar düştüğünde, bu ADC dönüşümünün tamamlandığı anlamına gelir. ADC'nin sonucu 10 bitlik bir değer olacaktır. MCU'muz 8 bitlik bir MCU olduğundan, sonuç üst 8 bit ve alt 2 bit olarak bölünür. Üstteki 8 bitlik sonuç ADRESH yazmacında saklanır ve alttaki 2 bitlik kayıt ADRESL'de saklanır. Dolayısıyla, 10 bitlik ADC değerimizi almak için bunları kayıtlara eklemeliyiz. Bu sonuç, aşağıda gösterildiği gibi işlev tarafından döndürülür:
dönüş ((ADRESH << 8) + ADRESL); // Sonucu döndürür
ADC kanalını seçmek, ADC'yi tetiklemek ve sonucu döndürmek için kullanılan tam fonksiyon burada gösterilmektedir.
işaretsiz int ADC_Read (işaretsiz karakter kanalı) {ADCON0 & = 0x11000101; // Kanal Seçim Bitlerinin Temizlenmesi ADCON0 - = kanal << 3; // Gerekli Bitleri Ayarlamak __delay_ms (2); // Tutma kapasitörünü şarj etmek için edinme süresi GO_nDONE = 1; // A / D Dönüşümünü başlatırken (GO_nDONE); // A / D Dönüşümünün tamamlanmasını bekleyin return ((ADRESH << 8) + ADRESL); // Sonucu döndürür}
Artık kanal seçimini girdi olarak alacak ve bize ADC değerini döndürecek bir fonksiyonumuz var. Dolayısıyla bu işlevi doğrudan while döngümüzün içinde çağırabiliriz, çünkü bu eğitimde 4. kanaldan analog gerilimi okuduğumuz için işlev çağrısı aşağıdaki gibi olacaktır.
i = (ADC_Read (4)); // adc'nin sonucunu "i" içinde saklayın.
ADC'mizin çıktısını görselleştirmek için, LCD veya 7 segment gibi bir tür ekran modülüne ihtiyacımız olacak. Bu eğitimde, çıktıyı doğrulamak için 7 segmentli bir ekran kullanıyoruz. Resim ile 7 segmenti nasıl kullanacağınızı öğrenmek istiyorsanız buradaki öğreticiyi izleyin.
Tam kod aşağıda verilmiştir ve süreci de açıklanmıştır video sonunda.
Donanım Kurulumu ve Testi:
Her zamanki gibi, donanımımıza geçmeden önce Proteus kullanarak kodu simüle edin , projenin şemaları aşağıda gösterilmiştir:
PIC mikrodenetleyicili 4 basamaklı yedi segmentli ekran modülünün bağlantıları önceki proje ile aynıdır, analog kanal 4 olan pin 7'ye bir potansiyometre ekledik. Potu değiştirerek MCU'ya değişken bir voltaj gönderilecektir. ADC modülü tarafından okunacak ve 7 segmentli ekran Modülünde görüntülenecektir. 4 basamaklı 7 segmentli ekran ve PIC MCU ile arabirimi hakkında daha fazla bilgi edinmek için önceki öğreticiye bakın.
Burada, LED yanıp sönen Eğitimde oluşturduğumuz aynı PIC Mikroişlemci kartını kullandık. Bağlantıyı sağladıktan sonra programı PIC'e yükleyin ve bunun gibi bir çıktı görmelisiniz.
Burada pottan ADC değerini okuduk ve 0-1024 çıkışını 0-5 volt olarak eşleyerek (programda gösterildiği gibi) gerçek gerilime dönüştürdük. Değer daha sonra 7 segmentte görüntülenir ve multimetre kullanılarak doğrulanır.
İşte bu, artık piyasada bulunan tüm Analog Sensörleri kullanmaya hazırız, devam edin ve bunu deneyin ve her zamanki gibi herhangi bir sorun yaşarsanız yorum bölümünü kullanın, size yardımcı olmaktan mutluluk duyarız.