- Jämför ADC i Arduino och STM32F103C8
- ADC i STM32
- Hur en analog signal omvandlas till digitalt format
- ADC-stift i STM32F103C8T6
- Komponenter krävs
- Kretsschema och förklaringar
- Programmering STM32 för läsning av ADC-värden
En vanlig funktion som används i nästan alla inbäddade applikationer är ADC-modulen (Analog till Digital Converter). Dessa analoga till digitala omvandlare kan läsa spänningar från analoga sensorer som temperatursensor, lutningssensor, strömgivare, flexsensor och mycket mer. Så i denna handledning lär vi oss hur man använder ADC i STM32F103C8 för att läsa analoga spänningar med Energia IDE. Vi kommer att ansluta en liten potentiometer till STM32 Blue Pill-kortet och leverera en varierande spänning till en analog stift, läsa av spänningen och visa den på 16x2 LCD-skärmen.
Jämför ADC i Arduino och STM32F103C8
På Arduino-kortet innehåller den en 6-kanals (8 kanaler på Mini och Nano, 16 på Mega), 10-bitars ADC med ett ingångsspänningsområde på 0V – 5V. Det betyder att den kommer att mappa ingångsspänningar mellan 0 och 5 volt i heltal mellan 0 och 1023. Nu när det gäller STM32F103C8 har vi 10 kanaler, 12-bitars ADC med ett ingångsområde 0V -3,3V. Det kommer att mappa ingångsspänningar mellan 0 och 3,3 volt i heltal mellan 0 och 4095.
ADC i STM32
ADC inbäddad i STM32-mikrokontroller använder SAR-principen (successive approximation register), genom vilken omvandlingen utförs i flera steg. Antalet konverteringssteg är lika med antalet bitar i ADC-omvandlaren. Varje steg drivs av ADC-klockan. Varje ADC-klocka producerar en bit från resultat till utgång. ADC: s interna design är baserad på teknik med switchad kondensator. Om du är ny på STM32, kolla in vår Kom igång med STM32-handledning.
12-bitars upplösning
Denna ADC är en 10-kanals 12-bitars ADC. Här innebär termen 10-kanal att det finns 10 ADC-stift med vilka vi kan mäta analog spänning. Termen 12-bitar innebär ADC-upplösningen. 12-bitar betyder 2 till kraften av tio (2 12) vilket är 4096. Detta är antalet provsteg för vår ADC, så intervallet för våra ADC-värden kommer att vara från 0 till 4095. Värdet kommer att öka från 0 till 4095 baserat på spänningsvärdet per steg, vilket kan beräknas med formeln
SPÄNNING / STEG = REFERENSSPÄNNING / 4096 = (3,3 / 4096 = 8,056 mV) per enhet.
Hur en analog signal omvandlas till digitalt format
Eftersom datorer lagrar och bearbetar endast binära / digitala värden (1 och 0). Så analoga signaler som sensorns utgång i volt måste omvandlas till digitala värden för bearbetning och omvandlingen måste vara exakt. När en ingångsspänning ges till STM32 vid dess analoga ingångar läses det analoga värdet och lagras i ett heltal variabel. Det lagrade analoga värdet (0-3.3V) omvandlas till helvärden (0-4096) med formeln nedan:
INPUT VOLTAGE = (ADC Value / ADC Resolution) * Referensspänning
Upplösning = 4096
Referens = 3.3V
ADC-stift i STM32F103C8T6
Det finns 10 analoga stift i STM32 från PA0 till PB1.
Kontrollera också hur du använder ADC i andra mikrokontroller:
- Hur man använder ADC i Arduino Uno?
- Gränssnitt ADC0808 med 8051 mikrokontroller
- Använda ADC-modulen i PIC Microcontroller
- Raspberry Pi ADC-handledning
- Hur man använder ADC i MSP430G2 - Mätning av analog spänning
Komponenter krävs
- STM32F103C8
- LCD 16 * 2
- Potentiometer 100k
- Bakbord
- Anslutande ledningar
Kretsschema och förklaringar
Kretsschemat för gränssnitt 16 * 2 LCD och analog ingång till ett STM32F103C8T6- kort visas nedan.
De anslutningar som görs för LCD ges nedan:
LCD-stift nr |
LCD-stiftnamn |
STM32 Pin-namn |
1 |
Mark (GND) |
Mark (G) |
2 |
VCC |
5V |
3 |
VEE |
Stift från Center of Potentiometer |
4 |
Registrera Välj (RS) |
PB11 |
5 |
Läs / skriv (RW) |
Mark (G) |
6 |
Aktivera (EN) |
PB10 |
7 |
Databit 0 (DB0) |
Ingen anslutning (NC) |
8 |
Databit 1 (DB1) |
Ingen anslutning (NC) |
9 |
Databit 2 (DB2) |
Ingen anslutning (NC) |
10 |
Databit 3 (DB3) |
Ingen anslutning (NC) |
11 |
Databit 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 |
Mark (G) |
Anslutningarna görs enligt ovanstående tabell. Det finns två potentiometrar närvarande i kretsen, den första används för spänningsdelare som kan användas för att variera spänningen och tillhandahålla analog ingång till STM32. Vänster stift på denna potentiometer får positiv ingångsspänning från STM32 (3,3 V) och höger stift är ansluten till jord, potentiometerns mittstift är ansluten till analog ingångsstift (PA7) på STM32. Den andra potentiometern används för att variera LCD-skärmens kontrast. Strömkällan för STM32 tillhandahålls med USB-strömförsörjning från en PC eller bärbar dator.
Programmering STM32 för läsning av ADC-värden
I vår tidigare handledning lärde vi oss om programmering av STM32F103C8T6-kort med USB-port. Så vi behöver inte en FTDI-programmerare nu. Anslut bara till PC via USB-port på STM32 och börja programmera med ARDUINO IDE. Det är väldigt enkelt att programmera din STM32 i ARDUINO IDE för att läsa analog spänning. Det är samma som arduino board. Det finns inget behov av att byta bygelstift på STM32.
I detta program läser man det analoga värdet och beräknar spänningen med det värdet och visar sedan både analoga och digitala värden på LCD-skärmen.
Först definierar ut LCD stift. Dessa definierar till vilken stift av STM32 LCD-stiften är ansluten. Du kan ändra enligt dina krav.
konst int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // nämna stiftnamnen till med LCD är ansluten till
Därefter inkluderar vi rubrikfilen för LCD-skärmen. Detta kallar biblioteket som innehåller koden för hur STM32 ska kommunicera med LCD-skärmen. Se också till att funktionen Liquid Crystal anropas med de stiftnamn som vi precis definierade ovan.
#omfatta
Inuti setup () -funktionen skulle vi bara ge ett introduktionsmeddelande som ska visas på LCD-skärmen. Du kan lära dig om gränssnitt mellan LCD och STM32.
lcd.begin (16, 2); // Vi använder en 16 * 2 LCD lcd.clear (); // Rensa skärmen lcd.setCursor (0, 0); // Vid första raden första kolumnen lcd.prin t ("CIRCUITDIGEST"); // Skriv ut denna lcd.setCursor (0, 1); // Vid sekundär rad första kolumn n lcd.print ("STM32F103C8"); // Skriv thi s fördröjning (2000); // vänta på två sekunder lcd.clear (); // Rensa skärmen lcd.setCursor (0, 0); // Vid första raden första kolumnen lcd.print ("ANVÄNDER ADC IN"); // Skriv ut denna lcd.setCursor (0,1); // Vid sekundär rad första kolumn lcd.print ("STM32F103C8"); // Skriv ut denna fördröjning (2000); // vänta på två sekunder lcd.clear (); // Rensa skärmen
Slutligen, inuti vår oändliga loop () -funktion, börjar vi läsa den analoga spänningen som matas till PA7-stiftet från potentiometern. Som vi redan diskuterat är mikrokontrollern en digital enhet och den kan inte läsa spänningsnivån direkt. Med hjälp av SAR-teknik mappas spänningsnivån från 0 till 4096. Dessa värden kallas ADC-värden, för att få detta ADC-värde använder du bara följande rad
int val = analogRead (A7); // läs ADC-värdet från stift PA 7
Här används funktionen analogRead () för att läsa det analoga värdet på stiftet. Slutligen sparar vi detta värde i en variabel som kallas " val ". Typen av denna variabel är heltal eftersom vi bara får värden från 0 till 4096 som ska lagras i denna variabel.
Nästa steg skulle vara att beräkna spänningsvärdet från ADC-värdet. För att göra detta har vi följande formler
Spänning = (ADC-värde / ADC-upplösning) * Referens Voltag e
I vårt fall vet vi redan att ADC-upplösningen för vår mikrokontroller är 4096. ADC-värdet finns också i föregående rad och lagrade variabeln som heter val. Den referensspänningen är lika med den spänning vid vilken mikrostyrenheten är i drift. När STM32 styrelsen drivs via USB-kabel då driftspänningen är 3.3V. Du kan också mäta driftspänningen genom att använda en multimeter över Vcc och jordstiftet på kortet. Så formeln ovan passar in i vårt fall som visas nedan
flottörspänning = (flottör (val) / 4096) * 3,3; // formler för att konvertera ADC-värdet till voltag e
Du kan förväxlas med linjefloat (val). Detta används för att konvertera variabeln "val" från int-datatyp till "float" -datatyp. Denna konvertering behövs för att bara om vi får resultatet av val / 4096 i float kan vi multiplicera det 3.3. Om värdet tas emot i heltal kommer det alltid att vara 0 och resultatet blir också noll. När vi väl har beräknat ADC-värdet och spänningen är allt som återstår att visa resultatet på LCD-skärmen, vilket kan göras med följande rader
lcd.setCursor (0, 0); // ställ in markören till kolumn 0, rad 0 lcd.print ("ADC Val:"); lcd.print (val); // Visa ADC-värde lcd.setCursor (0, 1); // ställ in markören till kolumn 0, rad 1 lcd.print ("Voltage:"); lcd.print (spänning); // Visningsspänning
Komplett kod och demonstrationsvideo ges nedan.