- Materiale necesare
- ADC pe STM8S103F3P6
- Schema circuitului pentru citirea valorilor ADC pe STM8S și afișarea pe LCD
- Biblioteca ADC pentru STM8S103F3P6
- Program STM8S pentru citirea tensiunii și afișajului analogic pe LCD
- Citirea tensiunii analogice de la două potențiometre folosind STM8S
Dacă sunteți un cititor obișnuit care urmărește tutorialele noastre pentru microcontrolerele STM8S, ați ști că în ultimul nostru tutorial am învățat cum să interfațați un LCD 16x2 cu STM8s. Acum, continuând cu acest tutorial, vom învăța cum să folosim caracteristica ADC pe microcontrolerul nostru STM8S103F3P6. Un ADC este un periferic foarte util pe un microcontroler care este adesea folosit de programatorii încorporați pentru a măsura unitățile aflate în continuă schimbare, cum ar fi tensiunea, curentul, temperatura, umiditatea, etc.
După cum știm „Trăim într-o lume analogică cu dispozitive digitale”, adică tot ceea ce ne înconjoară, cum ar fi viteza vântului, intensitatea luminii, temperatura și tot ceea ce avem de-a face cu viteza, viteza, presiunea etc. sunt de natură analogică. Dar microcontrolerele și microprocesoarele noastre sunt dispozitive digitale și nu vor putea măsura acești parametri fără un periferic important numit Convertoare analogice la digitale (ADC). Deci, în acest articol, să învățăm cum să folosim ADC pe microcontrolerul STM8S cu compilator COMIC C.
Materiale necesare
În acest articol, vom citi două valori analogice de tensiune de la două potențiometre și vom afișa valoarea sa ADC pe un ecran LCD de 16x2. Pentru a face acest lucru, vom avea nevoie de următoarele componente.
- STM8S103F3P6 Placă de dezvoltare
- Programator ST-Link V2
- 16x2 LCD
- Potențiometre
- Conectarea firelor
- 1k rezistor
ADC pe STM8S103F3P6
Există multe tipuri de ADC și fiecare microcontroler are propriile sale specificații. Pe STM8S103F3P6, avem un ADC cu 5 canale și rezoluție de 10 biți; cu o rezoluție de 10 biți, vom putea măsura valoarea digitală de la 0 la 1024 și un ADC cu 5 canale indică faptul că avem 5 pini pe microcontroler care pot suporta ADC, acești 5 pini sunt evidențiați în imaginea de mai jos.
După cum puteți vedea, toți acești cinci pini (AIN2, AIN3, AIN4, AIN5 și AIN6) sunt multiplexați cu alte periferice, ceea ce înseamnă că, în afară de faptul că acționează doar ca pin ADC, acești pini pot fi folosiți și pentru efectuarea altor comunicații, de exemplu, pinii 2 și 3 (AIN5 și AIN 6) nu pot fi folosiți doar pentru ADC, dar pot fi folosiți și pentru comunicarea serială și funcțiile GPIO. Rețineți că nu va fi posibil să utilizați același pin în toate cele trei scopuri, deci dacă folosim acești doi pini pentru ADC, atunci nu vom putea efectua comunicații seriale. Alte caracteristici ADC importante pentru STM8S103P36 pot fi găsite în tabelul de mai jos preluat din fișa tehnică.
În tabelul de mai sus, Vdd reprezintă tensiunea de funcționare și Vss reprezintă solul. Deci, în cazul nostru de pe placa noastră de dezvoltare, avem microcontrolerul care funcționează pe 3.3V, puteți verifica schema circuitului plăcii de dezvoltare de la începutul tutorialului STM8S. Cu 3,3 V ca tensiune de funcționare, frecvența noastră de ceas ADC poate fi setată între 1 și 4 MHz și gama noastră de tensiune de conversie este între 0 V și 3,3 V. Aceasta înseamnă că ADC-ul nostru pe 10 biți va citi 0 atunci când este furnizat 0V (Vss) și va citi maximum 1024 când este furnizat 3,3V (Vdd). Putem schimba cu ușurință acest 0-5V schimbând tensiunea de funcționare a MCU, dacă este necesar.
Schema circuitului pentru citirea valorilor ADC pe STM8S și afișarea pe LCD
Schema completă a circuitului utilizată în acest proiect este dată mai jos, este foarte asemănătoare cu tutorialul STM8S LCD despre care am discutat anterior.
După cum puteți vedea, singurele componente suplimentare, în afară de LCD, sunt două potențiometre POT_1 și POT_2 . Aceste pot-uri sunt conectate la porturile PC4 și PD6, care sunt pinii ANI2 și ANI6, așa cum s-a discutat mai sus pe imaginea pinout.
Potențiometrele sunt conectate în așa fel încât, atunci când îl vom varia, vom obține 0-5 V pe pinii noștri analogici. Vom programa programatorul nostru pentru a citi această tensiune analogică în valoare digitală (0-1024) și a o afișa pe ecranul LCD. Apoi vom calcula și valoarea echivalentă a tensiunii și o vom afișa pe ecranul LCD, nu uitați că controlerul nostru este alimentat de 3,3 V, deci chiar dacă furnizăm 5V pinului ADC, acesta va putea citi numai de la 0V la 3,3V.
Odată ce conexiunile sunt terminate, hardware-ul meu arată așa cum se arată mai jos. Puteți vedea cele două potențiometre în dreapta și programatorul ST-link în stânga.
Biblioteca ADC pentru STM8S103F3P6
Pentru a programa funcționalitățile ADC pe STM8S, vom folosi compilatorul Cosmic C împreună cu bibliotecile SPL. Dar pentru a facilita procesele, am făcut un alt fișier de antet care poate fi găsit pe GitHub cu linkul de mai jos.
Biblioteca ADC pentru STM8S103F3P6
Dacă știți ce faceți, puteți crea un fișier antet folosind codul de mai sus și îl puteți adăuga în directorul „includeți fișiere” de pe pagina proiectului. Altfel, urmați inițierea cu tutorialul STM8S pentru a ști cum să vă configurați mediul de programare și compilatorul. Odată ce configurarea este gata, IDE-ul dvs. ar trebui să conțină următoarele fișiere antet, cel puțin cele înconjurate cu roșu.
Fișierul antet de mai sus constă dintr-o funcție numită ADC_Read () . Această funcție poate fi apelată în programul dvs. principal pentru a obține valoarea ADC la orice pin. De exemplu, ADC_Read (AN2) va returna valoarea ADC pe pinul AN2 ca rezultat. Funcția este prezentată mai jos.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {nesemnat int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (ENABLE); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALS); result = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
După cum vedeți, putem transmite opt parametri acestei funcții și aceasta definește modul în care este configurat ADC. În codul nostru de bibliotecă de mai sus, am setat modul de conversie la continuu și apoi am obținut numărul canalului trecut un parametru. Și atunci trebuie să setăm frecvența CPU a controlerului nostru, în mod implicit (dacă nu ați conectat un cristal extern), STM8S dvs. va funcționa cu un oscilator intern de 16Mhz. Deci, am menționat „ ADC1_PRESSEL_FCPU_D18 ” ca valoare pre-scaler. În interiorul acestei funcții, folosim alte metode definite de fișierul antet SPL stm8s_adc1.h . Începem prin dezinicializarea pinilor ADC și apoi ADC1_Init () pentru a inițializa perifericul ADC. Definiția acestei funcții din manualul de utilizare SPL este prezentată mai jos.
Apoi, setăm declanșatorul extern folosind un temporizator și dezactivăm declanșatorul extern, deoarece nu îl vom folosi aici. Și apoi avem alinierea setată la dreapta și ultimii doi parametri sunt utilizați pentru a seta declanșatorul Schmitt, dar îl vom dezactiva pentru acest tutorial. Deci, pentru a rezuma, vom folosi ADC-ul nostru în modul de conversie continuă pe pinul ADC necesar cu declanșator extern și declanșator Schmitt dezactivat. Puteți verifica foaia de date dacă aveți nevoie de mai multe informații despre cum să utilizați declanșatorul extern sau opțiunea de declanșare Schmitt, nu vom discuta acest lucru în acest tutorial.
Program STM8S pentru citirea tensiunii și afișajului analogic pe LCD
Codul complet utilizat în fișierul main.c poate fi găsit în partea de jos a acestei pagini. După adăugarea fișierelor antet necesare și a fișierelor sursă, ar trebui să puteți compila direct fișierul principal. Explicația codului din fișierul principal este următoarea. Nu voi explica programul LCD STM8S, deoarece am discutat deja acest lucru în tutorialul anterior.
Scopul codului va fi de a citi valorile ADC de la doi pini și de a-l converti într-o valoare de tensiune. De asemenea, vom afișa atât valoarea ADC, cât și valoarea tensiunii pe ecranul LCD. Deci, am folosit o funcție numită LCD_Print Var care preia o variabilă în format întreg și o convertește într-un caracter pentru a o afișa pe LCD. Am folosit operatorii de modul simplu (%) și divide (/) pentru a obține fiecare cifră din variabilă și a introduce variabile precum d1, d2, d3 și d4 așa cum se arată mai jos. Apoi putem folosi funcția LCD_Print_Char pentru a afișa aceste caractere pe ecranul LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
În continuare, sub funcția principală, avem patru variabile declarate. Două dintre ele sunt folosite pentru a salva valoarea ADC (0-1024), iar celelalte două sunt utilizate pentru a obține valoarea reală a tensiunii.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltaj_2 = 0;
Apoi, trebuie să pregătim pinii GPIO și configurația ceasului pentru a citi tensiunea analogică. Aici vom citi tensiunea analogică de la pinii AIN2 și AIN6, care sunt pinii PC4 și respectiv PD6. Trebuie să definim acești știfturi într-o stare plutitoare, așa cum se arată mai jos. De asemenea, vom activa perifericul de ceas pentru ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Activați ceasul periferic pentru ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Acum, când pinii sunt gata, trebuie să intrăm în bucla infinită de timp pentru a citi tensiunea analogică. Deoarece avem fișierul antet, putem citi cu ușurință tensiunea analogică de la pinii AIN2 și AIN 6 folosind liniile de mai jos.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Următorul pas este de a converti această citire ADC (0-1023) la o tensiune analogică. În acest fel, putem afișa valoarea exactă a tensiunii date pinului AIN2 și AIN6. Formulele pentru calcularea tensiunii analogice pot fi date de-
Tensiune analogică = citire ADC * (3300/1023)
În cazul nostru cu controlere STM8S103F3, avem un ADC cu rezoluție de 10 biți, așa că am folosit 1023 (2 ^ 10) . De asemenea, dezvoltarea noastră alimentează controlerul cu 3.3V, care este 3300, deci am împărțit 3300 la 1023 în formulele de mai sus. Aproximativ 3300/1023 ne va oferi 3.226, deci, în programul nostru, avem următoarele linii pentru a măsura tensiunea ADC reală utilizând tensiunea ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) converti valoarea ADC 1 la 0 la 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // convertiți valoarea ADC 1 la 0 la 3300mV
Partea rămasă a codului este utilizată doar pentru a afișa aceste patru valori pe ecranul LCD. De asemenea, avem o întârziere de 500 ms, astfel încât ecranul LCD să fie actualizat pentru fiecare 500mS. Puteți reduce acest lucru în continuare dacă aveți nevoie de actualizări mai rapide.
Citirea tensiunii analogice de la două potențiometre folosind STM8S
Compilați codul și încărcați-l pe placa de dezvoltare. Dacă aveți vreo eroare de compilare, asigurați-vă că ați adăugat toate fișierele antet și fișierele sursă, așa cum am discutat mai devreme. Odată ce codul este încărcat, ar trebui să vedeți un mic mesaj de bun venit care să spună „ADC pe STM8S” și apoi să vedeți ecranul de mai jos.
Valoarea D1 și D2 indică valoarea ADC de la pinul Ain2 și respectiv AIN6. În partea dreaptă avem afișate și valorile echivalente ale tensiunii. Această valoare trebuie să fie egală cu tensiunea care apare pe pinul AIN2 și respectiv AIN6. Putem verifica același lucru folosind un multimetru, putem varia și potențiometrele pentru a verifica dacă și valoarea tensiunii se schimbă corespunzător.
Funcționarea completă poate fi găsită și în videoclipul de mai jos. Sper că ți-a plăcut tutorialul și ai învățat ceva util, dacă ai întrebări, lasă-le în secțiunea de comentarii de mai jos. De asemenea, puteți utiliza forumurile noastre pentru a începe o discuție sau pentru a posta alte întrebări tehnice.