- Comparând ADC în Arduino și STM32F103C8
- ADC în STM32
- Cum se transformă un semnal analog în format digital
- Pinii ADC în STM32F103C8T6
- Componente necesare
- Diagrama circuitului și explicații
- Programarea STM32 pentru citirea valorilor ADC
O caracteristică comună care este utilizată în aproape fiecare aplicație încorporată este modulul ADC (convertor analogic digital). Aceste convertoare analog-digitale pot citi tensiunea de la senzorii analogici, cum ar fi senzorul de temperatură, senzorul de înclinare, senzorul de curent, senzorul Flex și multe altele. Deci, în acest tutorial vom învăța cum să folosim ADC în STM32F103C8 pentru a citi tensiuni analogice folosind Energia IDE. Vom interfața un mic potențiometru pe placa STM32 Blue Pill și vom furniza o tensiune diferită unui pin analogic, vom citi tensiunea și o vom afișa pe ecranul LCD de 16x2.
Comparând ADC în Arduino și STM32F103C8
În placa Arduino, conține un ADC de 10 biți cu 6 canale (8 canale pe Mini și Nano, 16 pe Mega), cu un interval de tensiune de intrare de 0V – 5V. Aceasta înseamnă că va mapa tensiunile de intrare între 0 și 5 volți în valori între 0 și 1023. Acum, în cazul STM32F103C8 avem 10 canale, ADC pe 12 biți cu un interval de intrare 0V -3,3V. Va mapa tensiunile de intrare între 0 și 3,3 volți în valori între 0 și 4095.
ADC în STM32
ADC încorporat în microcontrolerele STM32 utilizează principiul SAR (registrul de aproximare succesiv), prin care conversia se efectuează în mai mulți pași. Numărul de pași de conversie este egal cu numărul de biți din convertorul ADC. Fiecare pas este condus de ceasul ADC. Fiecare ceas ADC produce un bit de la rezultat la ieșire. Proiectarea internă ADC se bazează pe tehnica condensatorului comutat. Dacă sunteți nou în STM32, consultați tutorialul Noțiuni introductive despre STM32.
Rezoluție pe 12 biți
Acest ADC este un ADC cu 10 canale pe 12 biți. Aici termenul de 10 canale implică existența a 10 pini ADC cu ajutorul cărora putem măsura tensiunea analogică. Termenul de 12 biți implică rezoluția ADC. 12 biți înseamnă 2 la puterea a zece (2 12), care este 4096. Acesta este numărul de pași de eșantionare pentru ADC-ul nostru, deci intervalul valorilor ADC-ului nostru va fi de la 0 la 4095. Valoarea va crește de la 0 la 4095 pe baza valorii tensiunii pe pas, care poate fi calculată prin formulă
TENSIUNE / PAS = TENSIUNE DE REFERINȚĂ / 4096 = (3,3 / 4096 = 8,056mV) pe unitate.
Cum se transformă un semnal analog în format digital
Deoarece computerele stochează și procesează numai valori binare / digitale (1 și 0). Deci, semnalele analogice, cum ar fi ieșirea senzorului în volți, trebuie să fie convertite în valori digitale pentru procesare și conversia trebuie să fie precisă. Când o tensiune analogică de intrare este dată STM32 la intrările sale analogice, valoarea analogică este citită și stocată într-o variabilă întreagă. Această valoare analogică stocată (0-3,3V) este convertită în valori întregi (0-4096) folosind formula de mai jos:
TENSIUNE DE INTRARE = (Valoare ADC / Rezoluție ADC) * Tensiune de referință
Rezoluție = 4096
Referință = 3,3V
Pinii ADC în STM32F103C8T6
Există 10 pini analogici în STM32 de la PA0 la PB1.
De asemenea, verificați cum să utilizați ADC în alte microcontrolere:
- Cum se utilizează ADC în Arduino Uno?
- Interfațarea ADC0808 cu microcontrolerul 8051
- Utilizarea modulului ADC al microcontrolerului PIC
- Tutorial ADC Raspberry Pi
- Cum se utilizează ADC în MSP430G2 - Măsurarea tensiunii analogice
Componente necesare
- STM32F103C8
- LCD 16 * 2
- Potențiometru 100k
- Breadboard
- Conectarea firelor
Diagrama circuitului și explicații
Schema circuitului pentru interfața LCD 16 * 2 și intrarea analogică la o placă STM32F103C8T6 este prezentată mai jos.
Conexiunile care se fac pentru LCD sunt date mai jos:
Pin LCD nr |
Numele pinului LCD |
Numele pinului STM32 |
1 |
Teren (Gnd) |
Teren (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin din Centrul Potențiometrului |
4 |
Selectare înregistrare (RS) |
PB11 |
5 |
Citire / Scriere (RW) |
Teren (G) |
6 |
Activați (EN) |
PB10 |
7 |
Bit de date 0 (DB0) |
Fără conexiune (NC) |
8 |
Bit de date 1 (DB1) |
Fără conexiune (NC) |
9 |
Bit de date 2 (DB2) |
Fără conexiune (NC) |
10 |
Bit de date 3 (DB3) |
Fără conexiune (NC) |
11 |
Bit de date 4 (DB4) |
PB0 |
12 |
Bit de date 5 (DB5) |
PB1 |
13 |
Bit de date 6 (DB6) |
PC13 |
14 |
Bit de date 7 (DB7) |
PC14 |
15 |
LED pozitiv |
5V |
16 |
LED negativ |
Teren (G) |
Conexiunile se fac conform tabelului de mai sus. Există două potențiometre prezente în circuit, primul fiind utilizat pentru divizorul de tensiune, care poate fi utilizat pentru a varia tensiunea și pentru a furniza intrarea analogică la STM32. Pinul stâng al acestui potențiometru primește tensiune pozitivă de intrare de la STM32 (3,3V), iar pinul drept este conectat la masă, pinul central al potențiometrului este conectat la pinul de intrare analogic (PA7) al STM32. Celălalt potențiometru este utilizat pentru a varia contrastul afișajului LCD. Sursa de alimentare pentru STM32 este furnizată prin intermediul unei surse de alimentare USB de la un computer sau laptop.
Programarea STM32 pentru citirea valorilor ADC
În tutorialul nostru anterior, am aflat despre programarea plăcii STM32F103C8T6 folosind portul USB. Deci nu avem nevoie de un programator FTDI acum. Pur și simplu conectați-l la computer prin portul USB al STM32 și începeți programarea cu ARDUINO IDE. Programarea STM32-ului dvs. în ARDUINO IDE pentru a citi tensiunea analogică este foarte simplă. Este la fel ca placa arduino. Nu este nevoie să schimbați pinii jumperului STM32.
În acest program va citi valoarea analogică și va calcula tensiunea cu acea valoare și apoi va afișa ambele valori, analogice și digitale, pe ecranul LCD.
Mai întâi definiți pinii LCD. Acestea definesc la ce pin al STM32 sunt conectați pinii LCD. Puteți modifica conform cerințelor dvs.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // menționați numele pinului cu care este conectat LCD
Apoi, includem fișierul antet pentru afișajul LCD. Aceasta apelează biblioteca care conține codul pentru modul în care STM32 ar trebui să comunice cu ecranul LCD. De asemenea, asigurați-vă că funcția Cristal lichid este apelată cu numele pinilor pe care tocmai le-am definit mai sus.
#include
În interiorul funcției setup () , am da doar un mesaj introductiv pentru a fi afișat pe ecranul LCD. Puteți afla despre interfața LCD cu STM32.
lcd.inceput (16, 2); // Folosim un LCD 16 * 2 lcd.clear (); // Ștergeți ecranul lcd.setCursor (0, 0); // La primul rând prima coloană lcd.prin t ("CIRCUITDIGEST"); // Imprimați acest lcd.setCursor (0, 1); // La rândul secundar prima coloană n lcd.print ("STM32F103C8"); // Print Thi s întârziere (2000); // așteptați două secunde lcd.clear (); // Ștergeți ecranul lcd.setCursor (0, 0); // La primul rând prima coloană lcd.print („UTILIZAREA ADC IN”); // Imprimați acest lcd.setCursor (0,1); // La rândul secundar prima coloană lcd.print ("STM32F103C8"); // Imprimați această întârziere (2000); // așteptați două secunde lcd.clear (); // Ștergeți ecranul
În cele din urmă, în interiorul funcției noastre buclă infinită () , începem să citim tensiunea analogică furnizată pinului PA7 de la potențiometru. După cum am discutat deja, microcontrolerul este un dispozitiv digital și nu poate citi nivelul tensiunilor direct. Folosind tehnica SAR, nivelul de tensiune este mapat de la 0 la 4096. Aceste valori se numesc valori ADC, pentru a obține această valoare ADC pur și simplu utilizați următoarea linie
int val = analogRead (A7); // citiți valoarea ADC de la pinul PA 7
Aici funcția analogRead () este utilizată pentru a citi valoarea analogică a pinului. În cele din urmă, salvăm această valoare într-o variabilă numită „ val ”. Tipul acestei variabile este întreg, deoarece vom obține doar valori cuprinse între 0 și 4096 pentru a fi stocate în această variabilă.
Următorul pas ar fi calcularea valorii tensiunii din valoarea ADC. Pentru a face acest lucru, avem următoarele formule
Tensiune = (valoare ADC / rezoluție ADC) * Tensiune de referință e
În cazul nostru știm deja că rezoluția ADC a microcontrolerului nostru este 4096. Valoarea ADC se găsește și în linia anterioară și stochează variabila numită val. Tensiunea de referință este egală cu tensiunea la care microcontrolerul funcționează. Când placa STM32 este alimentată prin cablu USB, atunci tensiunea de funcționare este de 3,3V. De asemenea, puteți măsura tensiunea de funcționare utilizând un multimetru peste Vcc și pinul de masă de pe placă. Deci formula de mai sus se potrivește cazului nostru așa cum se arată mai jos
tensiune de plutire = (float (val) / 4096) * 3,3; // formule pentru a converti valoarea ADC în tensiunea e
S-ar putea să vă confundați cu linia float (val). Aceasta este utilizată pentru a converti variabila „val” din tipul de date int în tipul de date „float”. Această conversie este necesară deoarece numai dacă obținem rezultatul val / 4096 în float îl putem multiplica 3.3. Dacă valoarea este primită în întreg, va fi întotdeauna 0, iar rezultatul va fi și zero. Odată ce am calculat valoarea și tensiunea ADC, nu mai rămâne decât să afișăm rezultatul pe ecranul LCD, care se poate face folosind următoarele linii
lcd.setCursor (0, 0); // setați cursorul la coloana 0, linia 0 lcd.print ("ADC Val:"); lcd.print (val); // Afișează valoarea ADC lcd.setCursor (0, 1); // setați cursorul la coloana 0, linia 1 lcd.print ("Voltage:"); lcd.print (tensiune); // Tensiunea de afișare
Codul complet și videoclipul demonstrativ sunt prezentate mai jos.