- ADC in Arduino en STM32F103C8 vergelijken
- ADC in STM32
- Hoe een analoog signaal wordt omgezet in een digitaal formaat
- ADC-pinnen in STM32F103C8T6
- Componenten vereist
- Schakelschema en uitleg
- Programmering STM32 voor het lezen van ADC-waarden
Een veelvoorkomend kenmerk dat in bijna elke embedded applicatie wordt gebruikt, is de ADC-module (Analog to Digital Converter). Deze analoog naar digitaal converters kunnen spanning lezen van analoge sensoren zoals temperatuursensor, kantelsensor, stroomsensor, flex-sensor en nog veel meer. Dus in deze tutorial zullen we leren hoe we ADC in STM32F103C8 kunnen gebruiken om analoge spanningen te lezen met behulp van de Energia IDE. We zullen een kleine potentiometer koppelen aan de STM32 Blue Pill-kaart en een variërende spanning leveren aan een analoge pin, de spanning aflezen en deze weergeven op het 16x2 LCD-scherm.
ADC in Arduino en STM32F103C8 vergelijken
Op het Arduino-bord bevat het een 6-kanaals (8 kanalen op de Mini en Nano, 16 op de Mega), 10-bits ADC met een ingangsspanningsbereik van 0V-5V. Dit betekent dat het ingangsspanningen tussen 0 en 5 volt zal omzetten in gehele waarden tussen 0 en 1023. Nu hebben we in het geval van STM32F103C8 10 kanalen, 12-bits ADC met een ingangsbereik van 0V -3,3V. Het zal ingangsspanningen tussen 0 en 3,3 volt omzetten in gehele waarden tussen 0 en 4095.
ADC in STM32
De ADC ingebed in STM32-microcontrollers maakt gebruik van het SAR-principe (successive approximation register), waarbij de conversie in verschillende stappen wordt uitgevoerd. Het aantal conversiestappen is gelijk aan het aantal bits in de ADC-omzetter. Elke stap wordt aangestuurd door de ADC-klok. Elke ADC-klok produceert één bit van resultaat tot uitvoer. Het interne ontwerp van de ADC is gebaseerd op de geschakelde condensatortechniek. Als je nieuw bent bij STM32, bekijk dan onze handleiding Aan de slag met STM32.
12-bits resolutie
Deze ADC is een 10-kanaals 12-bits ADC. Hier houdt de term 10 kanaal in dat er 10 ADC-pinnen zijn waarmee we analoge spanning kunnen meten. De term 12-bit impliceert de resolutie van de ADC. 12-bits betekent 2 tot de macht van tien (2 12), wat 4096 is. Dit is het aantal voorbeeldstappen voor onze ADC, dus het bereik van onze ADC-waarden ligt tussen 0 en 4095. De waarde neemt toe van 0 tot 4095 gebaseerd op de waarde van de spanning per stap, die kan worden berekend met de formule
SPANNING / STAP = REFERENTIESPANNING / 4096 = (3,3 / 4096 = 8,056mV) per eenheid.
Hoe een analoog signaal wordt omgezet in een digitaal formaat
Omdat computers alleen binaire / digitale waarden (enen en nullen) opslaan en verwerken. Dus analoge signalen, zoals de output van de sensor in volt, moeten worden omgezet in digitale waarden voor verwerking en de conversie moet nauwkeurig zijn. Wanneer een analoge ingangsspanning wordt gegeven aan de STM32 op de analoge ingangen, wordt de analoge waarde gelezen en opgeslagen in een integer variabele. Die opgeslagen analoge waarde (0-3,3 V) wordt omgezet in gehele getallen (0-4096) met behulp van de onderstaande formule:
INPUT VOLTAGE = (ADC-waarde / ADC-resolutie) * Referentiespanning
Resolutie = 4096
Referentie = 3.3V
ADC-pinnen in STM32F103C8T6
Er zijn 10 analoge pinnen in STM32 van PA0 tot PB1.
Controleer ook hoe u ADC in andere microcontrollers kunt gebruiken:
- Hoe ADC te gebruiken in Arduino Uno?
- Koppeling tussen ADC0808 met 8051 Microcontroller
- Met behulp van ADC-module van PIC Microcontroller
- Raspberry Pi ADC-zelfstudie
- Hoe ADC te gebruiken in MSP430G2 - Analoge spanning meten
Componenten vereist
- STM32F103C8
- LCD 16 * 2
- Potentiometer 100k
- Breadboard
- Draden aansluiten
Schakelschema en uitleg
Het schakelschema om een 16 * 2 LCD en analoge ingang te koppelen aan een STM32F103C8T6- kaart wordt hieronder weergegeven.
De aansluitingen die zijn gemaakt voor LCD worden hieronder gegeven:
LCD Pin Nr |
Naam LCD-pincode |
STM32 Pin-naam |
1 |
Grond (Gnd) |
Aarde (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin van Center of Potentiometer |
4 |
Registreren Select (RS) |
PB11 |
5 |
Lezen / schrijven (RW) |
Aarde (G) |
6 |
Inschakelen (EN) |
PB10 |
7 |
Gegevensbit 0 (DB0) |
Geen verbinding (NC) |
8 |
Gegevensbit 1 (DB1) |
Geen verbinding (NC) |
9 |
Gegevensbit 2 (DB2) |
Geen verbinding (NC) |
10 |
Gegevensbit 3 (DB3) |
Geen verbinding (NC) |
11 |
Gegevensbit 4 (DB4) |
PB0 |
12 |
Gegevensbit 5 (DB5) |
PB1 |
13 |
Gegevensbit 6 (DB6) |
PC13 |
14 |
Gegevensbit 7 (DB7) |
PC14 |
15 |
LED Positief |
5V |
16 |
LED negatief |
Aarde (G) |
De aansluitingen worden gemaakt volgens de bovenstaande tabel. Er zijn twee Potentiometers aanwezig in het circuit, de eerste wordt gebruikt als spanningsdeler die kan worden gebruikt om de spanning te variëren en analoge input te leveren aan STM32. De linkerpin van deze potentiometer krijgt een positieve ingangsspanning van STM32 (3.3V) en de rechterpin is verbonden met aarde, de middelste pin van de potentiometer is verbonden met de analoge inputpin (PA7) van STM32. De andere potentiometer wordt gebruikt om het contrast van het LCD-scherm te variëren. De stroombron voor STM32 wordt geleverd door middel van USB-voeding vanaf een pc of laptop.
Programmering STM32 voor het lezen van ADC-waarden
In onze vorige tutorial hebben we geleerd over het programmeren van de STM32F103C8T6-kaart met behulp van een USB-poort. Dus we hebben nu geen FTDI-programmeur nodig. Sluit hem eenvoudig aan op de pc via de USB-poort van STM32 en begin met programmeren met ARDUINO IDE. Het programmeren van uw STM32 in ARDUINO IDE om analoge spanning uit te lezen is heel eenvoudig. Het is hetzelfde als een Arduino-bord. Het is niet nodig om de jumperpinnen van STM32 te veranderen.
In dit programma leest de analoge waarde en berekent de spanning met die waarde en geeft vervolgens zowel analoge als digitale waarden weer op het LCD-scherm.
Eerste definiëren out LCD pinnen. Deze bepalen op welke pin van STM32 de LCD-pinnen zijn aangesloten. U kunt wijzigen volgens uw vereisten.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // vermeld de pinnamen waarmee het LCD-scherm is verbonden
Vervolgens voegen we het headerbestand voor het LCD-scherm toe. Dit roept de bibliotheek op die de code bevat voor hoe de STM32 moet communiceren met het LCD-scherm. Zorg er ook voor dat de functie Liquid Crystal wordt aangeroepen met de pinnamen die we zojuist hierboven hebben gedefinieerd.
# omvatten
Binnen de setup () -functie zouden we gewoon een intro-bericht geven dat op het LCD-scherm moet worden weergegeven. U kunt leren over de interfacing van LCD met STM32.
lcd.begin (16, 2); // We gebruiken een 16 * 2 LCD lcd.clear (); // Wis het scherm lcd.setCursor (0, 0); // In eerste rij eerste kolom lcd.prin t ("CIRCUITDIGEST"); // Print deze lcd.setCursor (0, 1); // Op tweede rij eerste kolom n lcd.print ("STM32F103C8"); // Print thi s vertraging (2000); // wacht twee seconden lcd.clear (); // Wis het scherm lcd.setCursor (0, 0); // Op de eerste rij eerste kolom lcd.print ("USING ADC IN"); // Print deze lcd.setCursor (0,1); // Op tweede rij eerste kolom lcd.print ("STM32F103C8"); // Druk deze vertraging af (2000); // wacht twee seconden lcd.clear (); // Wis het scherm
Ten slotte beginnen we in onze infinite loop () -functie de analoge spanning te lezen die wordt geleverd aan de PA7-pin vanaf de potentiometer. Zoals we al hebben besproken, is de microcontroller een digitaal apparaat en kan deze het spanningsniveau niet rechtstreeks lezen. Met behulp van de SAR-techniek wordt het spanningsniveau in kaart gebracht van 0 tot 4096. Deze waarden worden de ADC-waarden genoemd, om deze ADC-waarde te krijgen, gebruikt u gewoon de volgende regel
int val = analogRead (A7); // lees de ADC-waarde van pin PA 7
Hier wordt de functie analogRead () gebruikt om de analoge waarde van de pin uit te lezen. Ten slotte slaan we deze waarde op in een variabele genaamd “ val ”. Het type van deze variabele is een geheel getal, omdat we alleen waarden tussen 0 en 4096 krijgen die in deze variabele worden opgeslagen.
De volgende stap zou zijn om de spanningswaarde te berekenen op basis van de ADC-waarde. Hiervoor hebben we de volgende formules
Voltage = (ADC waarde / ADC resolutie) * Reference Voltag e
In ons geval weten we al dat de ADC-resolutie van onze microcontroller 4096 is. De ADC-waarde staat ook in de vorige regel en slaat de variabele val op. De referentiespanning is gelijk aan de spanning waarop de microcontroller werkt. Als het STM32-bord wordt gevoed via een USB-kabel, is de bedrijfsspanning 3,3V. U kunt ook de bedrijfsspanning meten door een multimeter over de Vcc- en aardingspin op het bord te gebruiken. Dus de bovenstaande formule past in ons geval, zoals hieronder weergegeven
float-spanning = (float (val) / 4096) * 3.3; // formules om de ADC-waarde naar voltag e om te zetten
U bent misschien verward met de line float (val). Dit wordt gebruikt om de variabele "val" om te zetten van het gegevenstype int naar het gegevenstype "float". Deze conversie is nodig omdat we alleen het resultaat van val / 4096 in float kunnen vermenigvuldigen met 3,3. Als de waarde wordt ontvangen in een geheel getal, is deze altijd 0 en is het resultaat ook nul. Nadat we de ADC-waarde en het voltage hebben berekend, hoeven we alleen nog maar het resultaat op het LCD-scherm weer te geven, wat kan worden gedaan door de volgende regels te gebruiken
lcd.setCursor (0, 0); // zet de cursor op kolom 0, regel 0 lcd.print ("ADC Val:"); lcd.print (val); // Geef ADC-waarde lcd.setCursor (0, 1); // zet de cursor op kolom 0, regel 1 lcd.print ("Voltage:"); lcd.print (spanning); // Geef spanning weer
Volledige code en demonstratievideo worden hieronder gegeven.