- Arduino ve STM32F103C8'de ADC'yi karşılaştırma
- STM32'de ADC
- Analog Sinyalin Dijital Biçime Dönüştürülmesi
- STM32F103C8T6'daki ADC Pinleri
- Gerekli Bileşenler
- Devre Şeması ve Açıklamaları
- ADC değerlerini okumak için STM32'yi programlama
Hemen hemen her gömülü uygulamada kullanılan ortak bir özellik, ADC modülüdür (Analogdan Dijitale Dönüştürücü). Bu Analogdan dijitale Dönüştürücüler, Sıcaklık sensörü, Eğim sensörü, Akım sensörü, Esnek sensör ve çok daha fazlası gibi analog sensörlerden voltaj okuyabilir. Bu eğitimde, Energia IDE'yi kullanarak Analog voltajları okumak için STM32F103C8'de ADC'yi nasıl kullanacağımızı öğreneceğiz. Biz olacaktır STM32 Mavi Hap kuruluna küçük potansiyometre arayüzü ve bir analog pin değişen bir voltaj kaynağı, voltaj okuma ve 16x2 LCD ekran üzerinde görüntüler.
Arduino ve STM32F103C8'de ADC'yi karşılaştırma
Arduino kartında, 0V – 5V giriş voltajı aralığına sahip 6 kanallı (Mini ve Nano'da 8 kanal, Mega'da 16), 10 bitlik ADC içerir. Bu, 0 ile 5 volt arasındaki giriş gerilimlerini 0 ile 1023 arasındaki tam sayı değerlerine eşleyeceği anlamına gelir. Şimdi STM32F103C8 durumunda, 0V -3.3V giriş aralığına sahip 10 kanal, 12-Bit ADC'ye sahibiz. 0 ile 3.3 volt arasındaki giriş voltajlarını 0 ile 4095 arasındaki tam sayı değerlerine eşler.
STM32'de ADC
STM32 mikrodenetleyicilerine gömülü ADC, dönüşümün birkaç adımda gerçekleştirildiği SAR (ardışık yaklaşım kaydı) ilkesini kullanır. Dönüştürme adımlarının sayısı, ADC dönüştürücüdeki bit sayısına eşittir. Her adım ADC saati tarafından sürülür. Her ADC saati, sonuçtan çıktıya bir bit üretir. ADC'nin iç tasarımı, anahtarlamalı kapasitör tekniğine dayanmaktadır. STM32'de yeniyseniz, STM32 ile Başlarken eğitimimize göz atın.
12 bit Çözünürlük
Bu ADC, 10 kanallı 12 bitlik bir ADC'dir. Burada 10 kanal terimi, analog voltajı ölçebileceğimiz 10 ADC pini olduğunu ima eder. 12 bit terimi, ADC'nin çözünürlüğünü ifade eder. 12-bit, 2'nin on (2 12) üssü olan 4096 anlamına gelir. Bu, ADC'miz için örnek adımların sayısıdır, dolayısıyla ADC değerlerimizin aralığı 0'dan 4095'e olacaktır. Değer 0'dan artacaktır. 4095, adım başına voltaj değerine göre, formülle hesaplanabilir
VOLTAJ / ADIM = REFERANS VOLTAJI / 4096 = birim başına (3.3 / 4096 = 8.056mV).
Analog Sinyalin Dijital Biçime Dönüştürülmesi
Bilgisayarlar yalnızca ikili / dijital değerleri (1'ler ve 0'lar) depolar ve işler. Bu nedenle, sensörün volt cinsinden çıkışı gibi Analog sinyallerin işlenmesi için dijital değerlere dönüştürülmesi ve dönüşümün doğru olması gerekir.Analog girişlerinde STM32'ye bir giriş analog voltajı verildiğinde, analog değer okunur ve bir tamsayı değişkeninde saklanır. Kaydedilen bu Analog değer (0-3,3V), aşağıdaki formül kullanılarak tam sayı değerlerine (0-4096) dönüştürülür:
GİRİŞ VOLTAJI = (ADC Değeri / ADC Çözünürlüğü) * Referans Voltajı
Çözünürlük = 4096
Referans = 3.3V
STM32F103C8T6'daki ADC Pinleri
STM32'de PA0'dan PB1'e 10 adet Analog Pin vardır.
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ü
Gerekli Bileşenler
- STM32F103C8
- LCD 16 * 2
- Potansiyometre 100k
- Breadboard
- Bağlantı telleri
Devre Şeması ve Açıklamaları
16 * 2 LCD ve Analog Girişin bir STM32F103C8T6 kartına arayüzlenmesi için devre şeması aşağıda gösterilmiştir.
LCD için yapılan bağlantılar aşağıda verilmiştir:
LCD Pin Hayır |
LCD Pin Adı |
STM32 Pin Adı |
1 |
Zemin (Gnd) |
Zemin (G) |
2 |
VCC |
5V |
3 |
VEE |
Potansiyometre Merkezinden Pim |
4 |
Kayıt Seçimi (RS) |
PB11 |
5 |
Okuma / Yazma (RW) |
Zemin (G) |
6 |
Etkinleştir (EN) |
PB10 |
7 |
Veri Bit 0 (DB0) |
Bağlantı Yok (NC) |
8 |
Veri Bit 1 (DB1) |
Bağlantı Yok (NC) |
9 |
Veri Bit 2 (DB2) |
Bağlantı Yok (NC) |
10 |
Veri Bit 3 (DB3) |
Bağlantı Yok (NC) |
11 |
Veri Bit 4 (DB4) |
PB0 |
12 |
Veri Bit 5 (DB5) |
PB1 |
13 |
Veri Bit 6 (DB6) |
PC13 |
14 |
Veri Bit 7 (DB7) |
PC14 |
15 |
LED Pozitif |
5V |
16 |
LED Negatif |
Zemin (G) |
Bağlantılar yukarıdaki tabloya göre yapılır. Devrede iki adet Potansiyometre mevcuttur, birincisi gerilimi değiştirmek ve STM32'ye analog giriş sağlamak için kullanılabilen gerilim bölücü için kullanılır. Bu potansiyometrenin sol pini STM32'den (3.3V) giriş pozitif voltajını alır ve sağ pini toprağa, potansiyometrenin merkez pini STM32'nin analog giriş pinine (PA7) bağlanır. Diğer potansiyometre, LCD ekranın kontrastını değiştirmek için kullanılır. STM32 için güç kaynağı, bir PC veya Dizüstü bilgisayardan USB güç kaynağı ile sağlanır.
ADC değerlerini okumak için STM32'yi programlama
Önceki eğitimimizde, USB Bağlantı Noktasını kullanarak STM32F103C8T6 Kartını Programlama hakkında bilgi edindik. Yani artık bir FTDI programcısına ihtiyacımız yok. STM32'nin USB portu üzerinden PC'ye bağlayın ve ARDUINO IDE ile programlamaya başlayın. STM32'nizi ARDUINO IDE'de analog voltajı okuyacak şekilde programlamak çok basittir. Arduino kartı ile aynıdır. STM32'nin jumper pinlerini değiştirmeye gerek yoktur.
Bu programda analog değeri okuyacak ve bu değer ile voltajı hesaplayacak ve ardından LCD ekranda hem analog hem de dijital değerleri gösterecektir.
Önce LCD pimlerini tanımlayın. Bunlar, LCD pinlerinin STM32'nin hangi pinine bağlandığını tanımlar. Gereksinimlerinize göre değişiklik yapabilirsiniz.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // LCD'nin bağlı olduğu pin adlarını belirtin
Daha sonra, LCD ekran için başlık dosyasını ekliyoruz. Bu, STM32'nin LCD ile nasıl iletişim kurması gerektiğine ilişkin kodu içeren kitaplığı çağırır. Ayrıca Liquid Crystal işlevinin yukarıda tanımladığımız pin adlarıyla çağrıldığından emin olun.
#Dahil etmek
İçinde kurulum () fonksiyonu, sadece LCD ekranda görüntülenecek bir intro mesajı verecekti. LCD'yi STM32 ile arayüzleme hakkında bilgi edinebilirsiniz.
lcd.begin (16, 2); // 16 * 2 LCD lcd kullanıyoruz.clear (); // Ekranı temizle lcd.setCursor (0, 0); // İlk satırın ilk sütununda lcd.prin t ("CIRCUITDIGEST"); // Bu lcd.setCursor (0, 1); // İkinci satırda ilk sütun n lcd.print ("STM32F103C8"); // Thi yazdır s gecikmesini (2000); // iki saniye bekleyin lcd.clear (); // Ekranı temizle lcd.setCursor (0, 0); // İlk satır ilk sütunda lcd.print ("ADC GİRİŞİ KULLANARAK"); // Bu lcd.setCursor (0,1); // İkinci satırın ilk sütununda lcd.print ("STM32F103C8"); // Bu gecikmeyi yazdır (2000); // iki saniye bekleyin lcd.clear (); // Ekranı temizle
Son olarak sonsuz loop () fonksiyonumuzun içinde, potansiyometreden PA7 pinine sağlanan analog voltajı okumaya başlarız. Daha önce tartıştığımız gibi, mikro denetleyici dijital bir cihazdır ve voltaj seviyesini doğrudan okuyamaz. SAR tekniği kullanılarak voltaj seviyesi 0 ile 4096 arasında eşlenir. Bu değerlere ADC değerleri denir, bu ADC değerini elde etmek için aşağıdaki satırı kullanın
int val = analogRead (A7); // ADC değerini PA 7 pininden okuyun
Burada analogRead () fonksiyonu, pinin analog değerini okumak için kullanılır. Son olarak bu değeri " val " adlı bir değişkene kaydediyoruz . Bu değişkenin türü tamsayıdır çünkü bu değişkende saklanmak üzere sadece 0 ile 4096 arasında değişen değerler alacağız.
Bir sonraki adım , ADC değerinden voltaj değerini hesaplamak olacaktır. Bunu yapmak için aşağıdaki formüllere sahibiz
Gerilim = (ADC Değeri / ADC Çözünürlük) * Referans Voltag e
Bizim durumumuzda mikrodenetleyicimizin ADC çözünürlüğünün 4096 olduğunu zaten biliyoruz. ADC değeri de önceki satırda bulunuyor ve val denilen değişkeni saklıyor. Referans voltajı mikro çalıştığı voltaj eşittir. STM32 kartına USB kablosuyla güç verildiğinde, çalışma voltajı 3,3V'tur. Kart üzerindeki Vcc ve topraklama pini boyunca bir multimetre kullanarak da çalışma voltajını ölçebilirsiniz. Dolayısıyla, yukarıdaki formül aşağıda gösterildiği gibi bizim durumumuza uyar
float voltaj = (float (val) / 4096) * 3.3; // formüller gerilim dalgalı ADC değeri dönüştürmek için e
Float (val) ile karıştırılabilirsiniz . Bu, "val" değişkenini int veri türünden "float" veri türüne dönüştürmek için kullanılır. Bu dönüşüm gereklidir çünkü sadece float'ta val / 4096'nın sonucunu alırsak bunu 3.3 ile çarpabiliriz. Değer tam sayı olarak alınırsa her zaman 0 olacak ve sonuç da sıfır olacaktır. ADC değerini ve voltajını hesapladıktan sonra, geriye kalan tek şey sonucu aşağıdaki satırları kullanarak yapılabilecek LCD ekranda görüntülemek.
lcd.setCursor (0, 0); // imleci sütun 0, satır 0'a ayarlayın lcd.print ("ADC Değeri:"); lcd.print (val); // ADC değerini göster lcd.setCursor (0, 1); // imleci sütun 0, satır 1'e ayarlayın lcd.print ("Voltaj:"); lcd.print (voltaj); // Voltajı göster
Tam kod ve Tanıtım Videosu aşağıda verilmiştir.