- Potrebni materiali
- ADC na STM8S103F3P6
- Shema vezja za branje vrednosti ADC na STM8S in zaslona na LCD
- Knjižnica ADC za STM8S103F3P6
- Program STM8S za branje analogne napetosti in zaslona na LCD
- Odčitavanje analogne napetosti iz dveh potenciometrov s pomočjo STM8S
Če ste redni bralec in sledite našim vadnicam za mikrokrmilnik STM8S, bi vedeli, da smo se v zadnji vadnici naučili, kako povezati LCD 16x2 s STM8. Zdaj, ko nadaljujemo z vajo, se bomo naučili uporabljati funkcijo ADC na našem mikrokrmilniku STM8S103F3P6. ADC je zelo uporabna zunanja naprava na mikrokrmilniku, ki jo vgrajeni programerji pogosto uporabljajo za merjenje enot, ki se stalno spreminjajo, kot so spremenljiva napetost, tok, temperatura, vlaga itd.
Kot vemo "Živimo v analognem svetu z digitalnimi napravami", kar pomeni, da so vse okoli nas, kot so hitrost vetra, jakost svetlobe, temperatura in vse, s čimer imamo opravka, kot so hitrost, hitrost, tlak itd., Analogne narave. Toda naši mikrokrmilniki in mikroprocesorji so digitalne naprave in teh parametrov ne bodo mogli izmeriti brez pomembne zunanje naprave, imenovane Analogno-digitalni pretvorniki (ADC). Torej, v tem članku se naučimo uporabljati ADC na mikrokrmilniku STM8S s prevajalnikom COMIC C.
Potrebni materiali
V tem članku bomo z dveh potenciometrov prebrali dve analogni napetostni vrednosti in prikazali njeno vrednost ADC na 16x2 LCD zaslonu. Za to bomo potrebovali naslednje komponente.
- STM8S103F3P6 Razvojna plošča
- Programer ST-Link V2
- 16x2 LCD
- Potenciometri
- Priključne žice
- 1k upor
ADC na STM8S103F3P6
Obstaja veliko vrst ADC in vsak mikrokrmilnik ima svoje lastne specifikacije. Na STM8S103F3P6 imamo ADC s 5 - kanalno in 10-bitno ločljivostjo; z 10-bitno ločljivostjo bomo lahko izmerili digitalno vrednost od 0 do 1024, petkanalni ADC pa kaže, da imamo na mikrokrmilniku 5 nožic, ki lahko podpirajo ADC, teh 5 nožic je označenih na spodnji sliki.
Kot lahko vidite, je vseh teh pet zatičev (AIN2, AIN3, AIN4, AIN5 in AIN6) multipleksiranih z drugimi zunanjimi napravami, kar pomeni, da poleg tega, da delujejo samo kot ADC zatiči, lahko te zatiče uporabljate tudi za izvajanje drugih komunikacij, na primer, zatiča 2 in 3 (AIN5 in AIN 6) ni mogoče uporabiti samo za ADC, temveč tudi za serijsko komunikacijo in GPIO funkcije. Upoštevajte, da istega zatiča ne bo mogoče uporabiti za vse tri namene, zato, če ta dva zatiča uporabljamo za ADC, potem ne bomo mogli izvajati serijske komunikacije. Druge pomembne značilnosti ADC za STM8S103P36 najdete v spodnji tabeli, vzeti iz podatkovnega lista.
V zgornji tabeli Vdd predstavlja obratovalno napetost, Vss pa tla. Torej, v našem primeru na naši razvojni plošči imamo mikrokrmilnik, ki deluje na 3.3V, diagram vezja razvojne plošče lahko preverite že od začetka z vadnico STM8S. Z 3.3V kot delovno napetostjo lahko našo frekvenco ADC nastavimo med 1 in 4MHz, območje pretvorbene napetosti pa je med 0V in 3,3V. To pomeni, da bo naš 10-bitni ADC prebral 0, če je na voljo 0V (Vss), in največ 1024, če je na voljo 3,3V (Vdd). To 0-5V lahko enostavno spremenimo s spreminjanjem delovne napetosti MCU, če je potrebno.
Shema vezja za branje vrednosti ADC na STM8S in zaslona na LCD
Celoten diagram vezja, uporabljen v tem projektu, je podan spodaj in je zelo podoben tutorialu STM8S LCD, o katerem smo že govorili.
Kot lahko vidite, sta poleg LCD-ja edini dodatni komponenti dva potenciometra POT_1 in POT_2 . Ti lonci so povezani z vrati PC4 in PD6, ki sta zatiča ANI2 in ANI6, kot smo že omenili na sliki pinout.
Potenciometri so povezani tako, da bomo, ko jo spremenimo, dobili 0-5 V na naših analognih zatičih. Naš krmilnik bomo programirali tako, da bo analogno napetost odčitaval v digitalni vrednosti (od 0 do 1024) in jo prikazal na LCD zaslonu. Nato bomo izračunali tudi ekvivalentno vrednost napetosti in jo prikazali na LCD-ju. Ne pozabite, da naš krmilnik napaja 3,3 V, tako da tudi če na vtič ADC vstavimo 5 V, bo lahko bral samo od 0 do 3,3 V..
Ko so povezave končane, je moja strojna oprema videti tako, kot je prikazano spodaj. Na desni si lahko ogledate dva potenciometra, na levi pa programer ST-link.
Knjižnica ADC za STM8S103F3P6
Za programiranje funkcij ADC na STM8S bomo uporabili prevajalnik Cosmic C skupaj s knjižnicami SPL. Toda za lažje procese sem naredil še eno datoteko z glavo, ki jo lahko najdete na GitHub s spodnjo povezavo.
Knjižnica ADC za STM8S103F3P6
Če veste, kaj počnete, lahko z zgornjo kodo ustvarite datoteko glave in jo dodate v imenik »vključi datoteke« na strani projekta. Drugače sledite uvodom v vadnico STM8S, če želite vedeti, kako nastaviti programsko okolje in prevajalnik. Ko je namestitev pripravljena, mora imeti IDE naslednje datoteke z glavo, vsaj tiste, obkrožene z rdečo.
Zgornja datoteka glave je sestavljena iz funkcije, imenovane ADC_Read () . To funkcijo lahko pokličete v glavnem programu, da dobite vrednost ADC na katerem koli zatiču. Na primer, ADC_Read (AN2) bo kot rezultat vrnil vrednost ADC na nožici AN2. Funkcija je prikazana spodaj.
nepodpisan int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int rezultat = 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 (); medtem ko (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); rezultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Kot vidite, lahko tej funkciji posredujemo osem parametrov, kar določa, kako je konfiguriran ADC. V zgornji kodi knjižnice smo način pretvorbe nastavili na neprekinjen in nato dobili številko kanala, ki je posredovala parameter. Nato moramo nastaviti frekvenco procesorja našega krmilnika, privzeto (če niste priključili zunanjega kristala) bo vaš STM8S deloval z 16MHz notranjim oscilatorjem. Tako smo kot vrednost pred- skalatorja omenili » ADC1_PRESSEL_FCPU_D18 «. Znotraj te funkcije uporabljamo druge metode, opredeljene z glavo datoteke SPL stm8s_adc1.h . Začnemo z deinicializacijo zatičev ADC in nato ADC1_Init () za inicializacijo zunanje naprave ADC. Definicija te funkcije iz uporabniškega priročnika SPL je prikazana spodaj.
Nato nastavimo zunanji sprožilec s časovnikom in onemogočimo zunanji sprožilec, saj ga tukaj ne bomo uporabljali. Nato imamo poravnavo nastavljeno na desno in zadnja dva parametra se uporabljata za nastavitev Schmittovega sprožilca, vendar jo bomo v tej vadnici onemogočili. Na kratko, naš ADC bo deloval v načinu neprekinjene pretvorbe na zahtevanem ADC zatiču z onemogočenim zunanjim sprožilcem. Če potrebujete več informacij o tem, kako uporabljati zunanji sprožilec ali Schmittovo možnost sprožilca, lahko preverite v obrazcu, o tem v tej vadnici ne bomo razpravljali.
Program STM8S za branje analogne napetosti in zaslona na LCD
Popolno kodo, uporabljeno v datoteki main.c, najdete na dnu te strani. Po dodajanju zahtevanih datotek glave in izvornih datotek boste lahko neposredno sestavili glavno datoteko. Razlaga kode v glavni datoteki je naslednja. Ne bom razlagal programa STM8S LCD, saj smo o tem že govorili v prejšnji vadnici.
Namen kode bo branje vrednosti ADC z dveh zatičev in pretvorba v vrednost napetosti. Na LCD-prikazovalniku bomo prikazali tudi vrednost ADC in vrednost napetosti. Torej, uporabil sem funkcijo, imenovano LCD_Print Var, ki sprejme spremenljivko v celoštevilčnem formatu in jo pretvori v znak, da se prikaže na LCD-ju. Uporabili smo preproste operatorje modula (%) in deli (/), da dobimo vsako številko iz spremenljivke in vstavimo spremenljivke, kot so d1, d2, d3 in d4, kot je prikazano spodaj. Nato lahko za prikaz teh znakov na LCD-prikazovalniku uporabimo funkcijo LCD_Print_Char .
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); }
Naslednje pod glavno funkcijo imamo deklarirane štiri spremenljivke. Dva od njih se uporabljajo za shranjevanje vrednosti ADC (0 do 1024), druga dva pa za pridobitev dejanske vrednosti napetosti.
nepodpisano int ADC_value_1 = 0; nepodpisano int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Nato moramo pripraviti GPIO nožice in konfiguracijo ure za branje analogne napetosti. Tu bomo brali analogno napetost z zatičev AIN2 in AIN6, ki sta zatiča PC4 oziroma PD6. Te zatiče moramo definirati v plavajočem stanju, kot je prikazano spodaj. Omogočili bomo tudi zunanjo uro za ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // omogoči periferno uro za ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Zdaj, ko so zatiči pripravljeni, moramo priti v neskončno zanko while, da preberemo analogno napetost. Ker imamo svojo glavo, lahko analogno napetost zlahka preberemo iz nožic AIN2 in AIN 6 z uporabo spodnjih vrstic.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Naslednji korak je pretvorba tega odčitka ADC (0 do 1023) v analogno napetost. Na ta način lahko prikažemo natančno vrednost napetosti, podane na pin AIN2 in AIN6. Formule za izračun analogne napetosti lahko podate kot
Analogna napetost = odčitavanje ADC * (3300/1023)
V našem primeru imamo na krmilnikih STM8S103F3 ADC z 10-bitno ločljivostjo, zato smo uporabili 1023 (2 ^ 10) . Tudi na naših razvojnih močeh je krmilnik s 3,3 V, kar je 3300, zato smo 3300 delili z 1023 v zgornjih formulah. Približno 3300/1023 nam bo dalo 3.226, zato imamo v našem programu naslednje vrstice za merjenje dejanske napetosti ADC z uporabo napetosti ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) pretvorimo vrednost ADC 1 v 0 v 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // pretvorimo vrednost ADC 1 v 0 v 3300mV
Preostali del kode se uporablja samo za prikaz teh štirih vrednosti na LCD zaslonu. Imamo tudi zakasnitev 500 ms, tako da se LCD posodablja za vsakih 500 ms. Če potrebujete hitrejše posodobitve, lahko to še zmanjšate.
Odčitavanje analogne napetosti iz dveh potenciometrov s pomočjo STM8S
Sestavite kodo in jo naložite na svojo razvojno ploščo. Če pride do kakršne koli napake pri sestavljanju, dodajte vse glave in izvorne datoteke, kot smo že omenili. Ko je koda naložena, boste videli majhno pozdravno sporočilo z napisom »ADC na STM8S«, nato pa boste videli spodnji zaslon.
Vrednosti D1 in D2 označujeta vrednost ADC iz nožic Ain2 oziroma AIN6. Na desni strani imamo prikazane tudi enakovredne vrednosti napetosti. Ta vrednost mora biti enaka napetosti, ki se pojavlja na zatičih AIN2 oziroma AIN6. Za isto lahko preverimo z multimetrom, lahko tudi spreminjamo potenciometre, da preverimo, ali se tudi vrednost napetosti ustrezno spreminja.
Popolno delo najdete tudi v spodnjem videoposnetku. Upam, da vam je bila vadnica všeč in ste se naučili kaj koristnega. Če imate kakršna koli vprašanja, jih pustite v spodnjem oddelku za komentarje. Na naših forumih lahko tudi začnete razpravo ali objavite druga tehnična vprašanja.