- Primerjava ADC v Arduinu in STM32F103C8
- ADC v STM32
- Kako se analogni signal pretvori v digitalno obliko
- ADC zatiči v STM32F103C8T6
- Potrebne komponente
- Shema vezja in pojasnila
- Programiranje STM32 za branje vrednosti ADC
Skupna značilnost, ki se uporablja v skoraj vseh vdelanih aplikacijah, je modul ADC (analogni v digitalni pretvornik). Ti analogno-digitalni pretvorniki lahko berejo napetost iz analognih senzorjev, kot so temperaturni senzor, senzor nagiba, trenutni senzor, Flex senzor in še veliko več. Torej, v tej vadnici bomo izvedeli, kako uporabljati ADC v STM32F103C8 za branje analognih napetosti z uporabo Energia IDE. Na ploščo STM32 Blue Pill bomo povezali majhen potenciometer in na analogni zatič napajali različno napetost, odčitavali napetost in jo prikazovali na 16x2 LCD zaslonu.
Primerjava ADC v Arduinu in STM32F103C8
Na plošči Arduino vsebuje 6-kanalni (8 kanalov na Mini in Nano, 16 na Mega), 10-bitni ADC z območjem vhodne napetosti 0V – 5V. To pomeni, da bo preslikal vhodne napetosti med 0 in 5 voltov v celoštevilčne vrednosti med 0 in 1023. Zdaj imamo v primeru STM32F103C8 10 kanalov, 12-bitni ADC z vhodnim območjem 0V -3,3V. Vhodne napetosti med 0 in 3,3 volta bo preslikal v celoštevilčne vrednosti med 0 in 4095.
ADC v STM32
ADC, vdelan v mikrokrmilnike STM32, uporablja načelo SAR (zaporedni približni register), po katerem se pretvorba izvede v več korakih. Število korakov pretvorbe je enako številu bitov v pretvorniku ADC. Vsak korak poganja ura ADC. Vsaka ura ADC ustvari en bit od rezultata do izhoda. Notranja zasnova ADC temelji na tehniki s preklopnim kondenzatorjem. Če ste nov uporabnik STM32, si oglejte našo vadnico Kako začeti s STM32.
12-bitna ločljivost
Ta ADC je 10-kanalni 12-bitni ADC. Tu izraz 10 kanal pomeni, da obstaja 10 ADC zatičev, s pomočjo katerih lahko merimo analogno napetost. Izraz 12-bit pomeni ločljivost ADC. 12-bit pomeni 2 na stopnjo deset (2 12), kar je 4096. To je število vzorčnih korakov za naš ADC, zato bo obseg naših vrednosti ADC od 0 do 4095. Vrednost se bo povečala od 0 do 4095 na podlagi vrednosti napetosti na korak, ki jo lahko izračunamo s formulo
NAPETOST / KORAK = REFERENČNA NAPETOST / 4096 = (3,3 / 4096 = 8,056mV) na enoto.
Kako se analogni signal pretvori v digitalno obliko
Ker računalniki shranjujejo in obdelujejo samo binarne / digitalne vrednosti (1 in 0). Torej je treba analogne signale, kot je izhod senzorja v voltih, pretvoriti v digitalne vrednosti za obdelavo, pretvorba pa mora biti natančna. Ko je na analognih vhodih podana vhodna analogna napetost STM32, se analogna vrednost odčita in shrani v celoštevilčno spremenljivko. Ta shranjena analogna vrednost (0-3,3V) se pretvori v celoštevilčne vrednosti (0-4096) po spodnji formuli:
INPUT VOLTAGE = (vrednost ADC / ločljivost ADC) * referenčna napetost
Ločljivost = 4096
Referenca = 3,3 V
ADC zatiči v STM32F103C8T6
V STM32 je 10 analognih zatičev od PA0 do PB1.
Preverite tudi, kako uporabljati ADC v drugih mikrokrmilnikih:
- Kako uporabljati ADC v Arduino Uno?
- Povezava ADC0808 z mikrokrmilnikom 8051
- Uporaba modula ADC mikrokrmilnika PIC
- Vadnica za ADC Raspberry Pi
- Kako uporabljati ADC v MSP430G2 - Merjenje analogne napetosti
Potrebne komponente
- STM32F103C8
- LCD 16 * 2
- Potenciometer 100k
- Breadboard
- Priključne žice
Shema vezja in pojasnila
Shema vezja za vmesnik 16 * 2 LCD in analognega vhoda na ploščo STM32F103C8T6 je prikazana spodaj.
Povezave za LCD so podane spodaj:
Številka LCD |
Ime pin LCD |
Ime pin STM32 |
1. |
Tla (Gnd) |
Tla (G) |
2. |
VCC |
5V |
3. |
VEE |
Pin iz središča potenciometra |
4. |
Izbira registra (RS) |
PB11 |
5. |
Branje / pisanje (RW) |
Tla (G) |
6. |
Omogoči (EN) |
PB10 |
7. |
Podatkovni bit 0 (DB0) |
Brez povezave (NC) |
8. |
Podatkovni bit 1 (DB1) |
Brez povezave (NC) |
9. |
Podatkovni bit 2 (DB2) |
Brez povezave (NC) |
10. |
Podatkovni bit 3 (DB3) |
Brez povezave (NC) |
11. |
Podatkovni bit 4 (DB4) |
PB0 |
12. |
Podatkovni bit 5 (DB5) |
PB1 |
13. |
Podatkovni bit 6 (DB6) |
PC13 |
14. |
Podatkovni bit 7 (DB7) |
PC14 |
15. |
LED pozitivna |
5V |
16. |
LED negativno |
Tla (G) |
Povezave se izvedejo v skladu z zgornjo tabelo. V vezju sta prisotna dva potenciometra, prvi se uporablja za delilnik napetosti, ki se lahko uporablja za spreminjanje napetosti in zagotavlja analogni vhod na STM32. Levi zatič tega potenciometra dobi vhodno pozitivno napetost od STM32 (3,3 V), desni zatič pa je povezan z maso, sredinski zatič potenciometra pa z analognim vhodnim zatičem (PA7) STM32. Drugi potenciometer se uporablja za spreminjanje kontrasta LCD zaslona. Vir napajanja za STM32 zagotavlja USB napajanje iz osebnega ali prenosnega računalnika.
Programiranje STM32 za branje vrednosti ADC
V prejšnji vadnici smo izvedeli o programiranju plošče STM32F103C8T6 z uporabo vrat USB. Torej zdaj ne potrebujemo programerja FTDI. Preprosto ga povežite z računalnikom prek vrat USB STM32 in začnite programirati z ARDUINO IDE. Programiranje vašega STM32 v ARDUINO IDE za branje analogne napetosti je zelo preprosto. To je enako kot arduino plošča. Ni potrebe po menjavi mostičnih nožic STM32.
V tem programu bo odčitala analogno vrednost in izračunala napetost s to vrednostjo ter nato na LCD zaslonu prikazala tako analogne kot digitalne vrednosti.
Najprej določite zatiče LCD. Ti določajo, na kateri pin STM32 so priključeni zatiči LCD. Lahko spremenite glede na vaše zahteve.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // omenimo imena pinov, s katerimi je povezan LCD
Nato vključimo datoteko z glavo za LCD zaslon. To pokliče knjižnico, ki vsebuje kodo, kako naj STM32 komunicira z LCD-jem. Prepričajte se tudi, da je funkcija Liquid Crystal poklicana z imeni pinov, ki smo jih pravkar določili zgoraj.
#include
Znotraj funkcije setup () bi dali samo uvodno sporočilo, ki se prikaže na LCD zaslonu. Izvedete lahko več o povezovanju LCD-ja s STM32.
lcd.begin (16, 2); // Uporabljamo LCD LCD 16 * 2 LCD (); // počistite zaslon lcd.setCursor (0, 0); // V prvi vrstici prvi stolpec lcd.prin t ("CIRCUITDIGEST"); // Natisni ta lcd.setCursor (0, 1); // V drugi vrstici prvega stolpca n lcd.print ("STM32F103C8"); // Natisni to zamudo (2000); // čakamo dve sekundi na lcd.clear (); // počistite zaslon lcd.setCursor (0, 0); // V prvi vrstici prvi stolpec lcd.print ("USING ADC IN"); // Natisni ta lcd.setCursor (0,1); // V stolpcu vrstice v prvem stolpcu lcd.print ("STM32F103C8"); // Natisni to zamudo (2000); // čakamo dve sekundi na lcd.clear (); // Počistite zaslon
Nazadnje v naši funkciji neskončne zanke () začnemo odčitavati analogno napetost, ki se napaja na pin PA7 s potenciometra. Kot smo že razpravljali, je mikrokrmilnik digitalna naprava in napetosti ne more neposredno odčitati. S tehniko SAR se nivo napetosti preslika od 0 do 4096. Te vrednosti se imenujejo vrednosti ADC, da dobite to vrednost ADC, preprosto uporabite naslednjo vrstico
int val = analogRead (A7); // preberemo vrednost ADC iz zatiča PA 7
Tu se funkcija analogRead () uporablja za branje analogne vrednosti zatiča. Na koncu to vrednost shranimo v spremenljivko, imenovano " val ". Tip te spremenljivke je celo število, ker bomo v tej spremenljivki shranili le vrednosti od 0 do 4096.
Naslednji korak bi bil izračun vrednosti napetosti iz vrednosti ADC. Za to imamo naslednje formule
Napetost = (vrednost ADC / ločljivost ADC) * Referenčna napetost e
V našem primeru že vemo, da je ločljivost ADC našega mikrokrmilnika 4096. Vrednost ADC se nahaja tudi v prejšnji vrstici in shrani spremenljivko, imenovano val. Referenčna napetost je enako napetostjo, s katero se mikrokrmilnik, ki deluje. Ko je STM32 svet napaja preko USB kabla potem obratovalna napetost je 3.3V. Delovno napetost lahko izmerite tudi z uporabo multimetra na Vcc in ozemljitvenem zatiču na plošči. Torej zgornja formula ustreza našemu primeru, kot je prikazano spodaj
plavajoča napetost = (plovec (val) / 4096) * 3,3; // formule za pretvorbo vrednosti ADC v voltag e
Morda vas bo zamenjala vrstica float (val). To se uporablja za pretvorbo spremenljivke “val” iz podatkovnega tipa int v podatkovni tip “float”. Ta pretvorba je potrebna, ker jo lahko pomnožimo le, če dobimo rezultat val / 4096 v float 3.3. Če je vrednost prejeta v celoštevilskem številu, bo vedno 0, rezultat pa bo tudi nič. Ko izračunamo vrednost in napetost ADC, ostane le prikaz rezultata na LCD zaslonu, kar lahko storimo z uporabo naslednjih vrstic
lcd.setCursor (0, 0); // kurzor nastavimo na stolpec 0, vrstica 0 lcd.print ("ADC Val:"); lcd.tis (val); // Prikaži vrednost ADC lcd.setCursor (0, 1); // kurzor nastavimo na stolpec 0, vrstica 1 lcd.print ("Voltage:"); lcd.print (napetost); // Prikaz napetosti
Popolna koda in predstavitveni video sta podana spodaj.