- Potrebni materijali
- ADC na STM8S103F3P6
- Kružni dijagram za očitavanje ADC vrijednosti na STM8S i zaslona na LCD-u
- ADC biblioteka za STM8S103F3P6
- STM8S program za očitavanje analognog napona i zaslona na LCD-u
- Očitavanje analognog napona s dva potenciometra pomoću STM8S
Ako ste redoviti čitatelj koji slijedi naše Vodiče za mikrokontrolere STM8S, znali biste da smo u našem posljednjem vodiču naučili kako povezati LCD 16x2 sa STM8. Sada, nastavljajući s ovim vodičem, naučit ćemo kako koristiti značajku ADC na našem mikrokontroleru STM8S103F3P6. ADC je vrlo korisna periferna jedinica na mikrokontroleru koju ugrađeni programeri često koriste za mjerenje jedinica koje su u stalnoj promjeni poput promjenjivog napona, struje, temperature, vlažnosti itd.
Kao što znamo "Živimo u analognom svijetu s digitalnim uređajima", što znači da su sve oko nas poput brzine vjetra, intenziteta svjetlosti, temperature i svega s čime imamo posla poput brzine, brzine, tlaka itd. Analogne prirode. No, naši mikrokontroleri i mikroprocesori digitalni su uređaji i neće moći mjeriti ove parametre bez važne periferne jedinice koja se naziva Analogno-digitalni pretvarači (ADC). Dakle, u ovom članku naučimo kako koristiti ADC na mikrokontroleru STM8S s COMIC C kompajlerom.
Potrebni materijali
U ovom ćemo članku očitavati dvije analogne vrijednosti napona s dva potenciometra i prikazati njegovu ADC vrijednost na LCD zaslonu 16x2. Da bismo to učinili, trebat će nam sljedeće komponente.
- STM8S103F3P6 Razvojna ploča
- ST-Link V2 programer
- LCD 16x2
- Potenciometri
- Spajanje žica
- 1k otpornik
ADC na STM8S103F3P6
Postoji mnogo vrsta ADC-a, a svaki mikrokontroler ima svoje vlastite specifikacije. Na STM8S103F3P6 imamo ADC s 5-kanalnom i 10-bitnom rezolucijom; s 10-bitnom razlučivošću moći ćemo izmjeriti digitalnu vrijednost od 0 do 1024, a 5-kanalni ADC ukazuje da imamo 5 pinova na mikrokontroleru koji mogu podržavati ADC, tih 5 pinova istaknuto je na donjoj slici.

Kao što vidite, svih ovih pet pinova (AIN2, AIN3, AIN4, AIN5 i AIN6) su multipleksirani s ostalim perifernim uređajima, što znači da osim što djeluju kao ADC pinovi, ovi pinovi mogu se koristiti i za obavljanje drugih komunikacija kao što je na primjer, pin 2 i 3 (AIN5 i AIN 6) ne mogu se koristiti samo za ADC, već se mogu koristiti i za serijsku komunikaciju i GPIO funkcije. Imajte na umu da neće biti moguće koristiti isti pin u sve tri svrhe, pa ako koristimo ove dvije igle za ADC, tada nećemo moći izvoditi serijsku komunikaciju. Ostale važne karakteristike ADC-a za STM8S103P36 mogu se naći u donjoj tablici preuzetoj s podatkovnog lista.

U gornjoj tablici Vdd predstavlja radni napon, a Vss tlo. Dakle, u našem slučaju na našoj razvojnoj ploči imamo mikrokontroler koji radi na 3.3V, dijagram sklopa razvojne ploče možete provjeriti od početka s vodičem za STM8S. S 3.3V kao radnim naponom, naša se ADC frekvencija takta može postaviti između 1 i 4MHz, a raspon napona konverzije je između 0V i 3.3V. To znači da će naš 10-bitni ADC očitati 0 kad je 0V (Vss) i maksimalno 1024 kada je osiguran 3,3V (Vdd). Ovih 0-5V možemo lako promijeniti mijenjanjem radnog napona MCU-a ako je potrebno.
Kružni dijagram za očitavanje ADC vrijednosti na STM8S i zaslona na LCD-u
Kompletna shema sklopa korištena u ovom projektu dana je u nastavku, vrlo je slična vodiču za STM8S LCD o kojem smo prethodno razgovarali.

Kao što vidite, jedine dodatne komponente osim LCD-a su dva potenciometra POT_1 i POT_2 . Ti su lonci povezani s priključcima PC4 i PD6, koji su ANI2 i ANI6 pinovi, kao što je prethodno objašnjeno na pinout slici.
Potenciometri su spojeni na takav način da ćemo, kada ga mijenjamo, dobiti 0-5 V na našim analognim pinovima. Programirat ćemo naš kontroler da očita ovaj analogni napon u digitalnoj vrijednosti (0 do 1024) i prikaže ga na LCD zaslonu. Tada ćemo također izračunati ekvivalentnu vrijednost napona i prikazati ga na LCD-u, ne zaboravimo da se naš kontroler napaja od 3,3 V, pa čak i ako na pin ADC damo 5 V, moći će čitati samo od 0 do 3,3 V.
Jednom kada su veze gotove, moj hardver izgleda ovako kako je prikazano u nastavku. Dva potenciometra možete vidjeti s desne strane, a ST-link programer s lijeve strane.

ADC biblioteka za STM8S103F3P6
Za programiranje ADC funkcionalnosti na STM8S, koristit ćemo Cosmic C kompajler zajedno sa SPL knjižnicama. Ali kako bih olakšao procese, izradio sam još jednu zaglavnu datoteku koja se može naći na GitHubu s donjom vezom.
ADC biblioteka za STM8S103F3P6
Ako znate što radite, možete stvoriti datoteku zaglavlja pomoću gornjeg koda i dodati je u direktorij "uključi datoteke" na stranici projekta. Inače pratite početak rada sa tutorijalom za STM8S da biste znali kako postaviti svoje programsko okruženje i kompajler. Nakon što vaše postavljanje bude spremno, vaš IDE trebao bi imati sljedeće datoteke zaglavlja, barem one zaokružene crvenom bojom.

Gornja datoteka zaglavlja sastoji se od funkcije koja se naziva ADC_Read () . Ova se funkcija može pozvati u vašem glavnom programu kako bi se dobila vrijednost ADC na bilo kojem pinu. Na primjer, ADC_Read (AN2) vratit će vrijednost ADC na pin AN2 kao rezultat. Funkcija je prikazana u nastavku.
nepotpisani 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 (OMOGUĆI); ADC1_StartConversion (); dok je (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); rezultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Kao što vidite, ovoj funkciji možemo proslijediti osam parametara i to definira kako je ADC konfiguriran. U našem bibliotečkom kodu iznad postavili smo način pretvorbe na kontinuirani, a zatim dobivamo da broj kanala proslijedi parametar. Zatim moramo postaviti frekvenciju procesora našeg kontrolera, prema zadanim postavkama (ako niste spojili vanjski kristal), vaš STM8S će raditi s unutarnjim oscilatorom od 16 MHz. Tako smo spomenuli “ ADC1_PRESSEL_FCPU_D18 ” kao vrijednost pret skalera . Unutar ove funkcije koristimo druge metode definirane datotekom zaglavlja SPL stm8s_adc1.h . Počinjemo deinicijalizacijom ADC pinova, a zatim ADC1_Init () za inicijalizaciju ADC periferne opreme. Definicija ove funkcije iz korisničkog priručnika SPL prikazana je u nastavku.

Dalje, vanjski okidač postavljamo pomoću tajmera i onemogućujemo vanjski okidač jer ga ovdje nećemo koristiti. A zatim imamo poravnanje postavljeno udesno, a zadnja dva parametra koriste se za postavljanje Schmittova okidača, ali onemogućit ćemo ga za ovaj vodič. Dakle, da skratimo, naš ćemo ADC raditi u načinu kontinuirane pretvorbe na traženom ADC pinu s vanjskim okidačem i onemogućenim Schmittovim okidačem. Možete provjeriti tablicu ako vam trebaju dodatne informacije o tome kako koristiti vanjski okidač ili Schmitt opciju okidača, o tome nećemo raspravljati u ovom vodiču.
STM8S program za očitavanje analognog napona i zaslona na LCD-u
Kompletni kod korišten u datoteci main.c nalazi se na dnu ove stranice. Nakon dodavanja potrebnih datoteka zaglavlja i izvornih datoteka, trebali biste moći izravno sastaviti glavnu datoteku. Objašnjenje koda u glavnoj datoteci je sljedeće. Neću objašnjavati LCD program STM8S jer smo o tome već raspravljali u prethodnom vodiču.
Svrha koda bit će očitavanje ADC vrijednosti s dva pina i pretvaranje u vrijednost napona. Na LCD-u ćemo prikazati i ADC vrijednost i vrijednost napona. Dakle, koristio sam funkciju koja se naziva LCD_Print Var koja uzima varijablu u cjelovitom formatu i pretvara je u znak kako bi je prikazala na LCD-u. Koristili smo jednostavne operatore modula (%) i podijeli (/) za dobivanje svake znamenke iz varijable i stavljanje varijabli poput d1, d2, d3 i d4 kao što je prikazano u nastavku. Tada možemo koristiti funkciju LCD_Print_Char za prikaz tih znakova na LCD-u.
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); }
Sljedeće pod glavnom funkcijom imamo deklarirane četiri varijable. Dvije se koriste za spremanje vrijednosti ADC (0 do 1024), a druge dvije za dobivanje stvarne vrijednosti napona.
nepotpisano int ADC_value_1 = 0; nepotpisano int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Dalje, moramo pripremiti GPIO pinove i konfiguraciju sata za očitavanje analognog napona. Ovdje ćemo čitati analogni napon s pinova AIN2 i AIN6 koji su pinovi PC4 i PD6. Moramo definirati ove pinove u plutajućem stanju kao što je prikazano dolje. Također ćemo omogućiti perifernu opremu za ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Omogući periferni sat za ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Sad kad su pinovi spremni, moramo ući u beskonačnu while petlju kako bismo očitali analogni napon. Budući da imamo datoteku zaglavlja, analogni napon možemo lako očitati s pinova AIN2 i AIN 6 koristeći donje retke.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Sljedeći je korak pretvoriti ovo očitanje ADC-a (0 do 1023) u analogni napon. Na taj način možemo prikazati točnu vrijednost napona dane na pin AIN2 i AIN6. Formule za izračunavanje analognog napona mogu se dati od-
Analogni napon = očitanje ADC-a * (3300/1023)
U našem slučaju na STM8S103F3 kontrolerima imamo ADC s 10-bitnom razlučivosti, pa smo koristili 1023 (2 ^ 10) . Također na našem razvojnom napajanju upravljač ima 3.3V što je 3300, tako da smo 3300 podijelili s 1023 u gornjim formulama. Otprilike 3300/1023 dat će nam 3.226, tako da na našem programu imamo sljedeće redove za mjerenje stvarnog napona ADC pomoću napona ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) pretvori ADC vrijednost 1 u 0 u 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // pretvoriti ADC vrijednost 1 u 0 u 3300mV
Preostali dio koda koristi se samo za prikaz ove četiri vrijednosti na LCD zaslonu. Također imamo kašnjenje od 500 ms, tako da se LCD ažurira za svakih 500 ms. To možete dodatno smanjiti ako su vam potrebna brža ažuriranja.
Očitavanje analognog napona s dva potenciometra pomoću STM8S
Sastavite kod i prenesite ga na svoju razvojnu ploču. Ako dobijete pogrešku u sastavljanju, provjerite jeste li dodali sve datoteke zaglavlja i izvorne datoteke kao što je prethodno rečeno. Jednom kada je kôd prenesen, trebali biste vidjeti malu poruku dobrodošlice u kojoj piše "ADC na STM8S", a zatim biste trebali vidjeti donji zaslon.

Vrijednosti D1 i D2 označavaju vrijednost ADC-a s pina Ain2 i AIN6. Na desnoj strani također imamo prikazane ekvivalentne vrijednosti napona. Ova vrijednost trebala bi biti jednaka naponu koji se pojavljuje na pinovima AIN2 i AIN6. Isto možemo provjeriti pomoću multimetra, također možemo varirati potenciometre kako bismo provjerili mijenja li se i vrijednost napona u skladu s tim.

Kompletni rad također možete pronaći u videozapisu ispod. Nadam se da ste uživali u vodiču i naučili nešto korisno, ako imate bilo kakvih pitanja, ostavite ih u odjeljku za komentare u nastavku. Naše forume također možete koristiti za pokretanje rasprave ili postavljanje drugih tehničkih pitanja.
