- Porovnání ADC v Arduinu a STM32F103C8
- ADC v STM32
- Jak se analogový signál převádí do digitálního formátu
- Piny ADC v STM32F103C8T6
- Požadované komponenty
- Schéma zapojení a vysvětlení
- Programování STM32 pro čtení hodnot ADC
Společnou funkcí, která se používá téměř ve všech vestavěných aplikacích, je modul ADC (analogově-digitální převodník). Tyto analogově-digitální převodníky umí číst napětí z analogových snímačů, jako jsou teplotní snímače, snímače náklonu, snímače proudu, snímače Flex a mnoho dalšího. V tomto tutoriálu se tedy naučíme používat ADC v STM32F103C8 ke čtení analogových napětí pomocí IDE Energia. Budeme propojovat malý potenciometr s deskou STM32 Blue Pill a dodávat různé napětí na analogový kolík, číst napětí a zobrazovat jej na obrazovce 16x2 LCD.
Porovnání ADC v Arduinu a STM32F103C8
Na desce Arduino obsahuje 6 kanálů (8 kanálů na Mini a Nano, 16 na Mega), 10bitový ADC s rozsahem vstupního napětí 0V – 5V. To znamená, že bude mapovat vstupní napětí mezi 0 a 5 volty na celočíselné hodnoty mezi 0 a 1023. Nyní máme v případě STM32F103C8 10 kanálů, 12bitový ADC se vstupním rozsahem 0V -3,3V. Bude mapovat vstupní napětí mezi 0 a 3,3 volty na celočíselné hodnoty mezi 0 a 4095.
ADC v STM32
ADC zabudovaný do mikrokontrolérů STM32 využívá princip SAR (postupný aproximační registr), kterým se převod provádí v několika krocích. Počet kroků převodu se rovná počtu bitů v převaděči ADC. Každý krok je řízen hodinami ADC. Každé hodiny ADC produkují jeden bit od výsledku k výstupu. Interní design ADC je založen na technice spínaných kondenzátorů. Pokud jste v STM32 nováčkem, podívejte se na náš výukový program Začínáme s STM32.
12bitové rozlišení
Tento ADC je 10kanálový 12bitový ADC. Zde termín 10 kanálů znamená, že existuje 10 pinů ADC, pomocí kterých můžeme měřit analogové napětí. Termín 12 bitů znamená rozlišení ADC. 12bitový znamená 2 až 10 (10), což je 4096. Toto je počet ukázkových kroků pro náš ADC, takže rozsah našich ADC hodnot bude od 0 do 4095. Hodnota se zvýší z 0 na 4095 na základě hodnoty napětí na krok, kterou lze vypočítat podle vzorce
NAPĚTÍ / KROK = REFERENČNÍ NAPĚTÍ / 4096 = (3,3 / 4096 = 8,056 mV) na jednotku.
Jak se analogový signál převádí do digitálního formátu
Protože počítače ukládají a zpracovávají pouze binární / digitální hodnoty (1 a 0). Analogové signály, jako je výstup senzoru ve voltech, musí být pro zpracování převedeny na digitální hodnoty a převod musí být přesný. Když je na analogové vstupy STM32 přivedeno vstupní analogové napětí, je analogová hodnota načtena a uložena do celočíselné proměnné. Uložená analogová hodnota (0-3,3 V) se převede na celočíselné hodnoty (0-4096) pomocí následujícího vzorce:
VSTUPNÍ NAPĚTÍ = (hodnota ADC / rozlišení ADC) * referenční napětí
Rozlišení = 4096
Reference = 3,3 V
Piny ADC v STM32F103C8T6
V STM32 je 10 analogových pinů od PA0 po PB1.
Zkontrolujte také, jak používat ADC v jiných mikrokontrolérech:
- Jak používat ADC v Arduino Uno?
- Propojení ADC0808 s mikrokontrolérem 8051
- Pomocí modulu ADC mikrokontroléru PIC
- Výukový program ADC pro Raspberry Pi
- Jak používat ADC v MSP430G2 - Měření analogového napětí
Požadované komponenty
- STM32F103C8
- LCD 16 * 2
- Potenciometr 100k
- Nepájivá deska
- Připojovací vodiče
Schéma zapojení a vysvětlení
Schéma zapojení rozhraní 16 * 2 LCD a analogového vstupu na desku STM32F103C8T6 je uvedeno níže.
Připojení, která se provádí pro LCD, jsou uvedena níže:
Číslo PIN LCD |
Název PINu LCD |
Název PIN STM32 |
1 |
Ground (GND) |
Zem (G) |
2 |
VCC |
5V |
3 |
VEE |
Kolík ze středu potenciometru |
4 |
Výběr rejstříku (RS) |
PB11 |
5 |
Čtení / zápis (RW) |
Zem (G) |
6 |
Povolit (EN) |
PB10 |
7 |
Datový bit 0 (DB0) |
Žádné připojení (NC) |
8 |
Datový bit 1 (DB1) |
Žádné připojení (NC) |
9 |
Datový bit 2 (DB2) |
Žádné připojení (NC) |
10 |
Datový bit 3 (DB3) |
Žádné připojení (NC) |
11 |
Datový bit 4 (DB4) |
PB0 |
12 |
Datový bit 5 (DB5) |
PB1 |
13 |
Datový bit 6 (DB6) |
PC13 |
14 |
Datový bit 7 (DB7) |
PC14 |
15 |
Pozitivní LED |
5V |
16 |
LED negativní |
Zem (G) |
Připojení se provádí podle výše uvedené tabulky. V obvodu jsou přítomny dva potenciometry, první se používá pro dělič napětí, kterým lze měnit napětí a poskytovat analogový vstup pro STM32. Levý kolík tohoto potenciometru získává vstupní kladné napětí z STM32 (3,3 V) a pravý kolík je připojen k zemi, střední kolík potenciometru je připojen k analogovému vstupnímu kolíku (PA7) STM32. Druhý potenciometr se používá ke změně kontrastu LCD displeje. Zdroj energie pro STM32 je poskytován prostřednictvím USB napájení z PC nebo notebooku.
Programování STM32 pro čtení hodnot ADC
V našem předchozím tutoriálu jsme se dozvěděli o Programování desky STM32F103C8T6 pomocí USB portu. Takže teď nepotřebujeme programátor FTDI. Jednoduše jej připojte k PC přes USB port STM32 a začněte programovat pomocí ARDUINO IDE. Programování vašeho STM32 v ARDUINO IDE pro čtení analogového napětí je velmi jednoduché. Je to stejné jako deska arduino. Není třeba měnit propojovací piny STM32.
V tomto programu načte analogovou hodnotu a vypočítá napětí s touto hodnotou a poté zobrazí jak analogové, tak digitální hodnoty na obrazovce LCD.
Nejprve definujte LCD piny. Ty definují, ke kterému kolíku STM32 jsou piny LCD připojeny. Můžete upravit podle svých požadavků.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // uveďte názvy pinů, ke kterým je připojen LCD
Dále zahrneme soubor záhlaví pro LCD displej. Toto volá knihovnu, která obsahuje kód, jak má STM32 komunikovat s LCD. Také se ujistěte, že je funkce Liquid Crystal volána s názvy pinů, které jsme právě definovali výše.
#zahrnout
Uvnitř funkce setup () bychom dali pouze úvodní zprávu, která se zobrazí na obrazovce LCD. Můžete se dozvědět informace o propojení LCD se STM32.
lcd.begin (16, 2); // Používáme 16 * 2 LCD lcd.clear (); // Vymazání obrazovky lcd.setCursor (0, 0); // V prvním řádku první sloupec lcd.prin t ("CIRCUITDIGEST"); // Vytisknout tento lcd.setCursor (0, 1); // Na druhém řádku první sloupec n lcd.print ("STM32F103C8"); // Tisk Thi y zpoždění (2000); // čekat na dva sekundy lcd.clear (); // Vymazat obrazovku lcd.setCursor (0, 0); // Na prvním řádku první sloupec lcd.print ("USING ADC IN"); // Vytisknout tento lcd.setCursor (0,1); // Na druhém řádku v prvním sloupci lcd.print ("STM32F103C8"); // Tisk tohoto zpoždění (2000); // čekat na dva sekundy lcd.clear (); // Vymazání obrazovky
A konečně, v našem nekonečná smyčka () funkce, jsme začít čtení analogového napětí dodávané do PA7 pin z potenciometru. Jak jsme již diskutovali, mikrokontrolér je digitální zařízení a nedokáže přímo číst úroveň napětí. Pomocí techniky SAR je úroveň napětí mapována od 0 do 4096. Tyto hodnoty se nazývají hodnoty ADC, pro získání této hodnoty ADC jednoduše použijte následující řádek
int val = analogRead (A7); // načte hodnotu ADC z pinu PA 7
Zde se funkce analogRead () používá ke čtení analogové hodnoty pinu. Nakonec tuto hodnotu uložíme do proměnné zvané „ val “. Typ této proměnné je celé číslo, protože do této proměnné dostaneme pouze hodnoty v rozsahu od 0 do 4096, které se mají uložit.
Dalším krokem by byl výpočet hodnoty napětí z hodnoty ADC. K tomu máme následující vzorce
Napětí = (hodnota ADC / rozlišení ADC) * Referenční napětí e
V našem případě již víme, že rozlišení ADC našeho mikrokontroléru je 4096. Hodnota ADC se také nachází v předchozím řádku a ukládá proměnnou nazvanou val. Referenční napětí se rovná napětí, při kterém mikrokontrolér je v provozu. Když je STM32 deska napájena přes USB kabel a pak napájecí napětí je 3,3. Provozní napětí můžete měřit také pomocí multimetru přes Vcc a zemnící kolík na desce. Výše uvedený vzorec tedy zapadá do našeho případu, jak je uvedeno níže
float voltage = (float (val) / 4096) * 3,3; // vzorce pro převod hodnoty ADC na voltag e
Mohli byste být zmateni s line float (val). Slouží k převodu proměnné „val“ z datového typu int na datový typ „float“. Tento převod je nutný, protože pouze pokud dostaneme výsledek val / 4096 v floatu, můžeme ho vynásobit 3.3. Pokud je hodnota přijímána v celých číslech, bude vždy 0 a výsledek bude také nula. Jakmile jsme vypočítali hodnotu a napětí ADC, zbývá jen zobrazit výsledek na LCD obrazovce, což lze provést pomocí následujících řádků
lcd.setCursor (0, 0); // nastavit kurzor na sloupec 0, řádek 0 lcd.print ("ADC Val:"); lcd.print (val); // Zobrazit hodnotu ADC lcd.setCursor (0, 1); // nastavit kurzor na sloupec 0, řádek 1 lcd.print ("Napětí:"); lcd. tisk (napětí); // Zobrazovací napětí
Kompletní kód a ukázkové video jsou uvedeny níže.