- Sammenligning av ADC i Arduino og STM32F103C8
- ADC i STM32
- Hvordan et analogt signal konverteres til digitalt format
- ADC-pinner i STM32F103C8T6
- Komponenter kreves
- Kretsdiagram og forklaringer
- Programmering STM32 for lesing av ADC-verdier
En vanlig funksjon som brukes i nesten alle innebygde applikasjoner er ADC-modulen (Analog til Digital Converter). Disse analoge til digitale omformerne kan lese spenning fra analoge sensorer som temperaturføler, vippesensor, strømføler, flekssensor og mye mer. Så i denne opplæringen vil vi lære hvordan du bruker ADC i STM32F103C8 for å lese analoge spenninger ved hjelp av Energia IDE. Vi vil koble et lite potensiometer til STM32 Blue Pill-kortet og levere en varierende spenning til en analog pin, lese spenningen og vise den på 16x2 LCD-skjermen.
Sammenligning av ADC i Arduino og STM32F103C8
På Arduino-kortet inneholder den en 6-kanals (8 kanaler på Mini og Nano, 16 på Mega), 10-biters ADC med et inngangsspenningsområde på 0V – 5V. Dette betyr at den vil kartlegge inngangsspenninger mellom 0 og 5 volt i heltall mellom 0 og 1023. Nå når det gjelder STM32F103C8 har vi 10 kanaler, 12-biters ADC med et inngangsområde 0V -3,3V. Den vil kartlegge inngangsspenninger mellom 0 og 3,3 volt i heltallverdier mellom 0 og 4095.
ADC i STM32
ADC innebygd i STM32 mikrokontrollere bruker SAR (suksessivt tilnærmelsesregister) -prinsippet, som konverteringen utføres i flere trinn. Antall konverteringstrinn er lik antall bits i ADC-omformeren. Hvert trinn drives av ADC-klokken. Hver ADC-klokke produserer en bit fra resultat til utgang. ADCs interne design er basert på switch-kondensator-teknikken. Hvis du ikke er kjent med STM32, kan du sjekke ut vår Komme i gang med STM32-opplæringen.
12-biters oppløsning
Denne ADC er en 10-kanals 12-biters ADC. Her innebærer begrepet 10-kanal at det er 10 ADC-pinner som vi kan måle analog spenning med. Begrepet 12-bit innebærer oppløsningen til ADC. 12-bit betyr 2 til kraften på ti (2 12) som er 4096. Dette er antall eksempletrinn for ADC, så rekkevidden til ADC-verdiene vil være fra 0 til 4095. Verdien vil øke fra 0 til 4095 basert på verdien av spenningen per trinn, som kan beregnes med formelen
SPENNING / TRINN = REFERANSESPENNING / 4096 = (3,3 / 4096 = 8,056 mV) per enhet.
Hvordan et analogt signal konverteres til digitalt format
Da datamaskiner bare lagrer og behandler binære / digitale verdier (1 og 0). Så analoge signaler som sensorutgang i volt må konverteres til digitale verdier for behandling, og konverteringen må være nøyaktig. Når en inngangsanalog spenning blir gitt til STM32 ved sine analoge innganger, leses den analoge verdien og lagres i et heltallsvariabel.. Den lagrede analoge verdien (0-3.3V) konverteres til heltallverdier (0-4096) ved hjelp av formelen nedenfor:
INPUT VOLTAGE = (ADC Value / ADC Resolution) * Referansespenning
Oppløsning = 4096
Referanse = 3.3V
ADC-pinner i STM32F103C8T6
Det er 10 analoge pinner i STM32 fra PA0 til PB1.
Sjekk også hvordan du bruker ADC i andre mikrokontrollere:
- Hvordan bruke ADC i Arduino Uno?
- Grensesnitt ADC0808 med 8051 mikrokontroller
- Bruker ADC-modulen til PIC Microcontroller
- Raspberry Pi ADC opplæring
- Hvordan bruke ADC i MSP430G2 - Måling av analog spenning
Komponenter kreves
- STM32F103C8
- LCD 16 * 2
- Potensiometer 100k
- Brettbrett
- Koble ledninger
Kretsdiagram og forklaringer
Kretsskjemaet for grensesnitt 16 * 2 LCD og analog inngang til et STM32F103C8T6- kort er vist nedenfor.
Tilkoblingene som gjøres for LCD er gitt nedenfor:
LCD-pinne nr |
LCD-pinnens navn |
STM32 Pin-navn |
1 |
Bakken (GND) |
Bakken (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin fra senter for potensiometer |
4 |
Registrer Velg (RS) |
PB11 |
5 |
Les / skriv (RW) |
Bakken (G) |
6 |
Aktiver (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen tilkobling (NC) |
8 |
Databit 1 (DB1) |
Ingen tilkobling (NC) |
9 |
Databit 2 (DB2) |
Ingen tilkobling (NC) |
10 |
Databit 3 (DB3) |
Ingen tilkobling (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Databit 5 (DB5) |
PB1 |
1. 3 |
Databit 6 (DB6) |
PC13 |
14 |
Databit 7 (DB7) |
PC14 |
15 |
LED-positiv |
5V |
16 |
LED negativ |
Bakken (G) |
Tilkoblingene er laget i henhold til tabellen ovenfor. Det er to potensiometre til stede i kretsen, den første brukes til spenningsdeler som kan brukes til å variere spenning og gi analog inngang til STM32. Venstre stift på dette potensiometeret får inngangspenning fra STM32 (3.3V) og høyre stift er koblet til jord, midtstiften på potensiometeret er koblet til den analoge inngangstappen (PA7) på STM32. Det andre potensiometeret brukes til å variere kontrasten på LCD-skjermen. Strømkilden til STM32 leveres ved hjelp av USB-strømforsyning fra en PC eller bærbar PC.
Programmering STM32 for lesing av ADC-verdier
I vår forrige opplæring lærte vi om programmering av STM32F103C8T6-kort ved hjelp av USB-port. Så vi trenger ikke en FTDI-programmerer nå. Bare koble den til PC via USB-port på STM32 og start programmeringen med ARDUINO IDE. Det er veldig enkelt å programmere STM32 i ARDUINO IDE for å lese analog spenning. Det er det samme som arduino bord. Det er ikke behov for å bytte hoppepinner på STM32.
I dette programmet vil den lese den analoge verdien og beregne spenningen med den verdien og deretter vise både analoge og digitale verdier på LCD-skjermen.
Definere først LCD-pinner. Disse definerer hvilken pin av STM32 LCD-pinnene er koblet til. Du kan endre etter dine behov.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // nevn pinnavnene til med LCD er koblet til
Deretter inkluderer vi toppteksten for LCD-skjermen. Dette kaller biblioteket som inneholder koden for hvordan STM32 skal kommunisere med LCD-skjermen. Forsikre deg også om at funksjonen Liquid Crystal heter med pinnenavnene vi nettopp definerte ovenfor.
#inkludere
Inne i setup () -funksjonen vil vi bare gi en intro-melding som skal vises på LCD-skjermen. Du kan lære om grensesnitt LCD med STM32.
lcd.begin (16, 2); // Vi bruker en 16 * 2 LCD lcd.clear (); // Fjern skjermen lcd.setCursor (0, 0); // På første rad første kolonne lcd.prin t ("CIRCUITDIGEST"); // Skriv ut denne lcd.setCursor (0, 1); // Ved sekund rad første kolonne n lcd.print ("STM32F103C8"); // Skriv ut thi s forsinkelse (2000); // vent på to sekunder lcd.clear (); // Fjern skjermen lcd.setCursor (0, 0); // På første rad første kolonne lcd.print ("BRUKER ADC IN"); // Skriv ut denne lcd.setCursor (0,1); // På sekund rad første kolonne lcd.print ("STM32F103C8"); // Skriv ut denne forsinkelsen (2000); // vent på to sekunder lcd.clear (); // Tøm skjermen
Til slutt, inne i vår uendelige loop () -funksjon, begynner vi å lese den analoge spenningen som leveres til PA7-pinnen fra potensiometeret. Som vi allerede har diskutert, er mikrokontrolleren en digital enhet, og den kan ikke lese spenningsnivået direkte. Ved bruk av SAR-teknikk kartlegges spenningsnivået fra 0 til 4096. Disse verdiene kalles ADC-verdiene, for å få denne ADC-verdien, bruk bare følgende linje
int val = analogRead (A7); // les ADC-verdien fra pin PA 7
Her brukes funksjonen analogRead () for å lese den analoge verdien av pinnen. Til slutt lagrer vi denne verdien i en variabel kalt “ val ”. Typen av denne variabelen er heltall fordi vi bare får verdier fra 0 til 4096 som skal lagres i denne variabelen.
Det neste trinnet vil være å beregne spenningsverdien fra ADC-verdien. For å gjøre dette har vi følgende formler
Spenning = (ADC-verdi / ADC-oppløsning) * Referanse Voltag e
I vårt tilfelle vet vi allerede at ADC-oppløsningen til mikrokontrolleren vår er 4096. ADC-verdien finnes også i forrige linje og lagret variabelen kalt val. Den referansespenning er lik spenningen ved hvilken mikrokontrolleren er i drift. Når STM32-kortet får strøm via USB-kabel, er driftsspenningen 3,3V. Du kan også måle driftsspenningen ved å bruke et multimeter over Vcc og jordpinnen på brettet. Så formelen ovenfor passer inn i vårt tilfelle som vist nedenfor
floatspenning = (float (val) / 4096) * 3.3; // formler for å konvertere ADC-verdien til voltag e
Du kan forveksles med linjefloat (val). Dette brukes til å konvertere variabelen “val” fra int datatype til “float” datatype. Denne konverteringen er nødvendig fordi bare hvis vi får resultatet av val / 4096 i float, kan vi multiplisere den 3.3. Hvis verdien mottas i heltall, vil den alltid være 0 og resultatet vil også være null. Når vi har beregnet ADC-verdien og spenningen, er det bare å vise resultatet på LCD-skjermen, noe som kan gjøres ved å bruke følgende linjer
lcd.setCursor (0, 0); // sett markøren til kolonne 0, linje 0 lcd.print ("ADC Val:"); lcd.print (val); // Vis ADC-verdi lcd.setCursor (0, 1); // sett markøren til kolonne 0, linje 1 lcd.print ("Voltage:"); lcd.print (spenning); // Vis spenning
Fullstendig kode og demonstrasjonsvideo er gitt nedenfor.