- Nødvendig materiale
- ADC på STM8S103F3P6
- Kretsskjema for å lese ADC-verdier på STM8S og vise på LCD
- ADC-bibliotek for STM8S103F3P6
- STM8S Program for å lese analog spenning og display på LCD
- Leser analog spenning fra to potensiometer ved bruk av STM8S
Hvis du er en vanlig leser som følger STM8S Microcontroller-opplæringen, vil du vite at vi i vår siste opplæring lærte hvordan vi kan grensesnitt en 16x2 LCD med STM8s. Nå som vi fortsetter med denne veiledningen, vil vi lære hvordan du bruker ADC-funksjonen på STM8S103F3P6-mikrokontrolleren. En ADC er en veldig nyttig periferiutstyr på en mikrokontroller som ofte brukes av innebygde programmerere for å måle enheter som er i konstant endring, som varierende spenning, strøm, temperatur, fuktighet, etc.
Som vi vet “Vi lever i en analog verden med digitale enheter”, noe som betyr at alt rundt oss som vindhastighet, lysintensitet, temperatur og alt vi håndterer som hastighet, hastighet, trykk osv. Er analogt. Men våre mikrokontrollere og mikroprosessorer er digitale enheter, og de vil ikke være i stand til å måle disse parametrene uten en viktig periferiutstyr som heter Analog to Digital Converters (ADC). Så i denne artikkelen, la oss lære hvordan du bruker ADC på STM8S Microcontroller med COMIC C-kompilator.
Nødvendig materiale
I denne artikkelen vil vi lese to analoge spenningsverdier fra to potensiometere og vise ADC-verdien på en 16x2 LCD-skjerm. For å gjøre dette trenger vi følgende komponenter.
- STM8S103F3P6 Utviklingskort
- ST-Link V2 programmerer
- 16x2 LCD
- Potensiometre
- Koble ledninger
- 1k motstand
ADC på STM8S103F3P6
Det er mange typer ADC, og hver mikrokontroller har sine egne spesifikasjoner. På STM8S103F3P6 har vi en ADC med 5-kanals og 10-biters oppløsning; med en 10-biters oppløsning, vil vi være i stand til å måle den digitale verdien fra 0 til 1024 og en 5-kanals ADC indikerer at vi har 5 pinner på Microcontroller som kan støtte ADC, disse 5 pinnene er fremhevet på bildet nedenfor.
Som du kan se, er alle disse fem pinnene (AIN2, AIN3, AIN4, AIN5 og AIN6) multipleksede med andre eksterne enheter, noe som betyr at bortsett fra bare å fungere som en ADC-pin, kan disse pinnene også brukes til å utføre annen kommunikasjon som for eksempel, pin 2 og 3 (AIN5 og AIN 6) kan ikke bare brukes til ADC, men kan også brukes til seriell kommunikasjon og GPIO-funksjoner. Vær oppmerksom på at det ikke vil være mulig å bruke samme pinne til alle tre formål, så hvis vi bruker disse to pinnene til ADC, vil vi ikke kunne utføre seriell kommunikasjon. Andre viktige ADC-egenskaper for STM8S103P36 finner du i tabellen nedenfor hentet fra databladet.
I tabellen ovenfor representerer Vdd driftsspenning og Vss representerer bakken. Så i vårt tilfelle på utviklingskortet vårt, har vi mikrokontrolleren på 3.3V, du kan sjekke kretsskjemaet for utviklingskortet fra å komme i gang med STM8S-opplæringen. Med 3,3 V som driftsspenning kan vår ADC klokkefrekvens stilles inn mellom 1 og 4 MHz, og vårt konverteringsspenningsområde ligger mellom 0 V og 3,3 V. Dette betyr at vår 10-biters ADC vil lese 0 når 0V (Vss) er gitt og vil lese maksimalt 1024 når 3.3V (Vdd) er gitt. Vi kan enkelt endre denne 0-5V ved å endre driftsspenningen til MCU om nødvendig.
Kretsskjema for å lese ADC-verdier på STM8S og vise på LCD
Det komplette kretsskjemaet som er brukt i dette prosjektet er gitt nedenfor, det ligner veldig på STM8S LCD-opplæringen som vi diskuterte tidligere.
Som du kan se, er de eneste tilleggskomponentene bortsett fra LCD-skjermen to potensiometre POT_1 og POT_2 . Disse pottene er koblet til portene PC4 og PD6, som er ANI2 og ANI6-pinnene som diskutert på pinout-bildet tidligere.
Potensiometrene er koblet på en slik måte at når vi varierer det, vil vi få 0-5 V på våre analoge pinner. Vi programmerer kontrolleren vår til å lese denne analoge spenningen i digital verdi (0 til 1024) og vise den på LCD-skjermen. Så vil vi også beregne ekvivalent spenningsverdi og vise den på LCD-skjermen. Husk at kontrolleren vår drives av 3,3V, så selv om vi leverer 5V til ADC-pinnen, vil den bare kunne lese fra 0V til 3.3V.
Når tilkoblingene er gjort, ser maskinvaren min slik ut som vist nedenfor. Du kan se de to potensiometrene til høyre og ST-link-programmereren til venstre.
ADC-bibliotek for STM8S103F3P6
For å programmere for ADC-funksjonalitet på STM8S, bruker vi Cosmic C-kompilatoren sammen med SPL-bibliotekene. Men for å gjøre prosessene enklere, laget jeg en annen topptekstfil som du finner på GitHub med lenken nedenfor.
ADC-bibliotek for STM8S103F3P6
Hvis du vet hva du gjør, kan du opprette en headerfil ved hjelp av koden ovenfor og legge den til i "inkluder filer" -katalogen på prosjektsiden. Følg med i gang med STM8S-veiledningen for å vite hvordan du konfigurerer programmeringsmiljøet og kompilatoren. Når oppsettet er klart, skal IDE-en din ha følgende overskriftsfiler, i det minste de som er omkranset med rødt.
Toppfilen ovenfor består av en funksjon kalt ADC_Read () . Denne funksjonen kan kalles i hovedprogrammet ditt for å få ADC-verdien når som helst. For eksempel vil ADC_Read (AN2) returnere ADC-verdien på pin AN2 som resultat. Funksjonen er vist nedenfor.
usignert int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {usignert int resultat = 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 (); mens (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); resultat = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Som du ser, kan vi overføre åtte parametere til denne funksjonen, og dette definerer hvordan ADC er konfigurert. I vår bibliotekode ovenfor har vi satt konverteringsmodus til kontinuerlig og deretter får kanalnummeret sendt en parameter. Og så må vi stille CPU-frekvensen til kontrolleren vår, som standard (hvis du ikke har koblet til en ekstern krystall), vil STM8S fungere med en 16 MHz intern oscillator. Så vi har nevnt “ ADC1_PRESSEL_FCPU_D18 ” som forskaleringsverdi . Inne i denne funksjonen bruker vi andre metoder definert av topptekstfilen SPL stm8s_adc1.h . Vi starter med å de-initialisere ADC-pinnene og deretter ADC1_Init () for å initialisere ADC-periferien. Definisjonen av denne funksjonen fra SPL brukerhåndboken er vist nedenfor.
Deretter setter vi den eksterne triggeren ved hjelp av en tidtaker og deaktiverer den eksterne triggeren, siden vi ikke bruker den her. Og så har vi justeringen satt til høyre, og de to siste parameterne brukes til å sette Schmitt-utløseren, men vi vil deaktivere den for denne opplæringen. Så for å si det kort, vil vi ADC arbeide i kontinuerlig konverteringsmodus på den nødvendige ADC-pinnen med ekstern utløser og Schmitt-utløser deaktivert. Du kan sjekke databladet hvis du trenger mer informasjon om hvordan du bruker den eksterne triggeren eller Schmitt trigger-alternativet, vi vil ikke diskutere det i denne opplæringen.
STM8S Program for å lese analog spenning og display på LCD
Den komplette koden som brukes i main.c- filen, finner du nederst på denne siden. Etter å ha lagt til de nødvendige headerfilene og kildefilene, bør du kunne kompilere hovedfilen direkte. Forklaringen på koden i hovedfilen er som følger. Jeg vil ikke forklare STM8S LCD-program siden vi allerede har diskutert det i forrige opplæring.
Hensikten med koden vil være å lese ADC-verdier fra to pinner og konvertere den til en spenningsverdi. Vi vil også vise både ADC-verdien og spenningsverdien på LCD-skjermen. Så jeg har brukt en funksjon kalt LCD_Print Var som tar inn en variabel i heltallformat og konverterer den til et tegn for å vise den på LCD-skjermen. Vi har brukt enkle modulus (%) og divider (/) operatorer for å få hvert siffer fra variabelen og sette inn variabler som d1, d2, d3 og d4 som vist nedenfor. Deretter kan vi bruke LCD_Print_Char- funksjonen til å vise disse tegnene på LCD-skjermen.
ugyldig 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); }
Neste under hovedfunksjonen har vi deklarert fire variabler. To av dem brukes til å lagre ADC-verdien (0 til 1024), og de to andre brukes til å få den faktiske spenningsverdien.
usignert int ADC_value_1 = 0; usignert int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Deretter må vi forberede GPIO-pinnene og klokkonfigurasjonen for å lese analog spenning. Her vil vi lese den analoge spenningen fra pinnene AIN2 og AIN6 som er pinnene PC4 og PD6. Vi må definere disse tappene i flytende tilstand som vist nedenfor. Vi vil også aktivere periferiutstyret for ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Aktiver perifer klokke for ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nå som pinnene er klare, må vi komme inn i den uendelige mens løkken for å lese den analoge spenningen. Siden vi har topptekstfilen vår, kan vi enkelt lese den analoge spenningen fra pinnene AIN2 og AIN 6 ved hjelp av linjene nedenfor.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Det neste trinnet er å konvertere denne ADC-avlesningen (0 til 1023) til en analog spenning. På denne måten kan vi vise den nøyaktige spenningsverdien gitt til pin AIN2 og AIN6. Formlene for å beregne analog spenning kan gis ved-
Analog spenning = ADC-avlesning * (3300/1023)
I vårt tilfelle på STM8S103F3-kontrollere har vi en ADC med 10-biters oppløsning, så vi har brukt 1023 (2 ^ 10) . Også på utviklingen vår driver kontrolleren med 3.3V som er 3300, så vi delte 3300 av 1023 i formlene ovenfor. Omtrent 3300/1023 vil gi oss 3.226, så på programmet vårt har vi følgende linjer for å måle den faktiske ADC-spenningen ved hjelp av ADC-spenningen.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) konverterer ADC-verdi 1 til 0 til 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // konverter ADC-verdi 1 til 0 til 3300mV
Den gjenværende delen av koden brukes bare til å vise disse fire verdiene på LCD-skjermen. Vi har også en forsinkelse på 500 ms slik at LCD-skjermen blir oppdatert for hver 500 ms. Du kan redusere dette ytterligere hvis du trenger raskere oppdateringer.
Leser analog spenning fra to potensiometer ved bruk av STM8S
Kompiler koden og last den opp til utviklingskortet ditt. Hvis du får noen kompileringsfeil, må du sørge for at du har lagt til alle topptekstfiler og kildefiler som diskutert tidligere. Når koden er lastet opp, bør du se en liten velkomstmelding som sier “ADC på STM8S”, og deretter skal du se skjermbildet nedenfor.
Verdien D1 og D2 indikerer ADC-verdien fra henholdsvis pin Ain2 og AIN6. På høyre side har vi også de tilsvarende spenningsverdiene vist. Denne verdien skal være lik spenningen som vises på henholdsvis pin AIN2 og AIN6. Vi kan se etter det samme ved hjelp av et multimeter, vi kan også variere potensiometrene for å sjekke om spenningsverdien også endres tilsvarende.
Komplett arbeid kan også bli funnet i videoen nedenfor. Håper du likte opplæringen og lærte noe nyttig, hvis du har spørsmål, la dem være i kommentarseksjonen nedenfor. Du kan også bruke forumene våre til å starte en diskusjon eller legge ut andre tekniske spørsmål.