- Sammenligning af ADC i Arduino og STM32F103C8
- ADC i STM32
- Hvordan et analogt signal konverteres til digitalt format
- ADC-stifter i STM32F103C8T6
- Komponenter, der kræves
- Kredsløbsdiagram og forklaringer
- Programmering STM32 til aflæsning af ADC-værdier
Et almindeligt træk, der bruges i næsten alle indlejrede applikationer, er ADC-modulet (Analog til Digital Converter). Disse analoge til digitale konvertere kan aflæse spænding fra analoge sensorer som temperaturføler, vippesensor, strømføler, fleksføler og meget mere. Så i denne vejledning lærer vi, hvordan man bruger ADC i STM32F103C8 til at læse analoge spændinger ved hjælp af Energia IDE. Vi vil interface et lille potentiometer til STM32 Blue Pill-kort og levere en varierende spænding til en analog pin, læse spændingen og vise den på 16x2 LCD-skærmen.
Sammenligning af ADC i Arduino og STM32F103C8
På Arduino-kort indeholder den en 6-kanals (8 kanaler på Mini og Nano, 16 på Mega), 10-bit ADC med et indgangsspændingsområde på 0V – 5V. Det betyder, at det vil kortlægge indgangsspændinger mellem 0 og 5 volt i heltalsværdier mellem 0 og 1023. Nu i tilfælde af STM32F103C8 har vi 10 kanaler, 12-bit ADC med et inputområde 0V -3,3V. Det vil kortlægge indgangsspændinger mellem 0 og 3,3 volt i heltalsværdier mellem 0 og 4095.
ADC i STM32
ADC indlejret i STM32 mikrokontrollere bruger SAR-princippet (successive approximation register), hvorved konverteringen udføres i flere trin. Antallet af konverteringstrin er lig med antallet af bits i ADC-konverteren. Hvert trin drives af ADC-uret. Hvert ADC-ur producerer en bit fra resultat til output. ADC's interne design er baseret på teknikken med tændt kondensator. Hvis du er ny på STM32, skal du tjekke vores Kom godt i gang med STM32-vejledning.
12-bit opløsning
Denne ADC er en 10-kanals 12-bit ADC. Her betyder udtrykket 10-kanal, at der er 10 ADC-ben, hvor vi kan måle analog spænding. Udtrykket 12-bit indebærer opløsningen af ADC. 12-bit betyder 2 til styrken på ti (2 12), hvilket er 4096. Dette er antallet af eksempletrin for vores ADC, så området for vores ADC-værdier vil være fra 0 til 4095. Værdien stiger fra 0 til 4095 baseret på værdien af spænding pr. Trin, som kan beregnes ved hjælp af formlen
SPÆNDING / TRIN = REFERENCESPÆNDING / 4096 = (3,3 / 4096 = 8,056 mV) pr. Enhed.
Hvordan et analogt signal konverteres til digitalt format
Da computere kun gemmer og behandler binære / digitale værdier (1 og 0). Så analoge signaler som sensorens output i volt skal konverteres til digitale værdier til behandling, og konverteringen skal være nøjagtig. Når en indgangsanalogspænding gives til STM32 ved sine analoge indgange, læses den analoge værdi og lagres i et heltal variabel. Den lagrede analoge værdi (0-3.3V) konverteres til heltalværdier (0-4096) ved hjælp af nedenstående formel:
INPUT VOLTAGE = (ADC Value / ADC Resolution) * Reference Voltage
Opløsning = 4096
Reference = 3.3V
ADC-stifter i STM32F103C8T6
Der er 10 analoge ben i STM32 fra PA0 til PB1.
Kontroller også, hvordan du bruger ADC i andre mikrocontrollere:
- Hvordan bruges ADC i Arduino Uno?
- Interfacing ADC0808 med 8051 Microcontroller
- Brug af ADC-modul fra PIC Microcontroller
- Raspberry Pi ADC vejledning
- Sådan bruges ADC i MSP430G2 - Måling af analog spænding
Komponenter, der kræves
- STM32F103C8
- LCD 16 * 2
- Potentiometer 100k
- Brødbræt
- Tilslutning af ledninger
Kredsløbsdiagram og forklaringer
Kredsløbsdiagrammet til interface 16 * 2 LCD og analog indgang til et STM32F103C8T6- kort er vist nedenfor.
Forbindelserne, der foretages for LCD, er angivet nedenfor:
LCD-stift nr |
LCD-pin-navn |
STM32 Pin-navn |
1 |
Jord (GND) |
Jord (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin fra Center of Potentiometer |
4 |
Registrer Vælg (RS) |
PB11 |
5 |
Læs / skriv (RW) |
Jord (G) |
6 |
Aktivér (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen forbindelse (NC) |
8 |
Databit 1 (DB1) |
Ingen forbindelse (NC) |
9 |
Databit 2 (DB2) |
Ingen forbindelse (NC) |
10 |
Databit 3 (DB3) |
Ingen forbindelse (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Databit 5 (DB5) |
PB1 |
13 |
Databit 6 (DB6) |
PC13 |
14 |
Databit 7 (DB7) |
PC14 |
15 |
LED Positiv |
5V |
16 |
LED negativ |
Jord (G) |
Forbindelserne foretages i henhold til ovenstående tabel. Der er to potentiometre til stede i kredsløbet, den første bruges til spændingsdeler, som kan bruges til at variere spænding og levere analog indgang til STM32. Venstre stift på dette potentiometer får positiv indgangsspænding fra STM32 (3.3V), og højre stift er forbundet til jord, midterstiften på potentiometeret er forbundet til den analoge indgangsstift (PA7) på STM32. Det andet potentiometer bruges til at variere LCD-displayets kontrast. Strømkilden til STM32 leveres ved hjælp af USB-strømforsyning fra en pc eller bærbar computer.
Programmering STM32 til aflæsning af ADC-værdier
I vores tidligere tutorial lærte vi om programmering af STM32F103C8T6-kort ved hjælp af USB-port. Så vi har ikke brug for en FTDI-programmør nu. Du skal bare slutte den til pc via USB-porten på STM32 og starte programmeringen med ARDUINO IDE. Programmering af din STM32 i ARDUINO IDE til at læse analog spænding er meget enkel. Det er det samme som arduino board. Der er ikke behov for at udskifte stifterne på STM32.
I dette program læser den analoge værdi og beregner spændingen med den værdi og viser derefter både analoge og digitale værdier på LCD-skærmen.
Definér først LCD-ben. Disse definerer, hvilken stift af STM32 LCD-stifterne er tilsluttet. Du kan ændre alt efter dine krav.
konst int rs = PB11, da = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // nævne de pinnavne, som med LCD er forbundet til
Dernæst inkluderer vi headerfilen til LCD-skærmen. Dette kalder biblioteket, som indeholder koden til, hvordan STM32 skal kommunikere med LCD'et. Sørg også for, at funktionen Liquid Crystal kaldes med de pinnavne, som vi lige har defineret ovenfor.
#omfatte
Inde i opsætningsfunktionen () giver vi bare en introduktionsmeddelelse, der skal vises på LCD-skærmen. Du kan lære om grænseflade mellem LCD og STM32.
lcd.begin (16, 2); // Vi bruger en 16 * 2 LCD lcd.clear (); // Ryd skærmen lcd.setCursor (0, 0); // I første række første kolonne lcd.prin t ("CIRCUITDIGEST"); // Udskriv denne lcd.setCursor (0, 1); // Ved sekundær række første søjle n lcd.print ("STM32F103C8"); // Udskriv thi s forsinkelse (2000); // vent på to sekunder lcd.clear (); // Ryd skærmen lcd.setCursor (0, 0); // I første række første kolonne lcd.print ("BRUGER ADC IN"); // Udskriv denne lcd.setCursor (0,1); // Ved sekundær række første kolonne lcd.print ("STM32F103C8"); // Udskriv denne forsinkelse (2000); // vent på to sekunder lcd.clear (); // Ryd skærmen
Endelig begynder vi inden i vores uendelige loop () -funktion at læse den analoge spænding, der leveres til PA7-stiften fra potentiometer. Som vi allerede har diskuteret, er mikrokontrolleren en digital enhed, og den kan ikke læse spændingsniveauet direkte. Ved hjælp af SAR-teknik kortlægges spændingsniveauet fra 0 til 4096. Disse værdier kaldes ADC-værdierne, for at få denne ADC-værdi skal du blot bruge følgende linje
int val = analogRead (A7); // læs ADC-værdien fra pin PA 7
Her bruges funktionen analogRead () til at læse pinens analoge værdi. Endelig gemmer vi denne værdi i en variabel kaldet " val ". Typen af denne variabel er heltal, fordi vi kun får værdier fra 0 til 4096, der skal gemmes i denne variabel.
Det næste trin ville være at beregne spændingsværdien ud fra ADC-værdien. For at gøre dette har vi følgende formler
Spænding = (ADC-værdi / ADC-opløsning) * Reference Voltag e
I vores tilfælde ved vi allerede, at ADC-opløsningen på vores mikrocontroller er 4096. ADC-værdien findes også i den forrige linje og lagrede variablen kaldet val. Den referencespænding er lig med spændingen, ved hvilken microcontroller er i drift. Når STM32 bord får strøm via USB-kabel så driftsspændingen er 3.3V. Du kan også måle driftsspændingen ved hjælp af et multimeter på tværs af Vcc og jordstift på tavlen. Så ovenstående formel passer ind i vores sag som vist nedenfor
floatspænding = (float (val) / 4096) * 3.3; // formler til at konvertere ADC-værdien til voltag e
Du kan blive forvekslet med line float (val). Dette bruges til at konvertere variablen "val" fra int-datatypen til "float" -datatypen. Denne konvertering er nødvendig, fordi kun hvis vi får resultatet af val / 4096 i float, kan vi gange det 3.3. Hvis værdien modtages i heltal, vil den altid være 0, og resultatet bliver også nul. Når vi først har beregnet ADC-værdien og spændingen, er alt der er tilbage at vise resultatet på LCD-skærmen, hvilket kan gøres ved hjælp af følgende linjer
lcd.setCursor (0, 0); // sæt markøren til kolonne 0, linje 0 lcd.print ("ADC Val:"); lcd.print (val); // Vis ADC-værdi lcd.setCursor (0, 1); // sæt markøren til kolonne 0, linje 1 lcd.print ("Voltage:"); lcd.print (spænding); // Display spænding
Komplet kode og demonstrationsvideo er angivet nedenfor.