- Potrebné materiály
- ADC na STM8S103F3P6
- Okruhový diagram na čítanie hodnôt ADC na STM8S a na displeji na LCD
- Knižnica ADC pre STM8S103F3P6
- Program STM8S na čítanie analógového napätia a zobrazenie na LCD
- Čítanie analógového napätia z dvoch potenciometrov pomocou STM8S
Ak ste pravidelným čitateľom, ktorý sleduje naše výukové programy pre mikrokontroléry STM8S, viete, že v našom poslednom výučbe sme sa naučili, ako prepojiť 16x2 LCD s STM8s. Teraz sa v tomto výučbe naučíme, ako používať funkciu ADC na našom mikrokontroléri STM8S103F3P6. ADC je veľmi užitočná periféria na mikrokontroléri, ktorú často používajú zabudovaní programátori na meranie jednotiek, ktoré sa neustále menia, ako je meniace sa napätie, prúd, teplota, vlhkosť atď.
Ako vieme „Žijeme v analógovom svete s digitálnymi zariadeniami“, čo znamená, že všetko okolo nás, ako je rýchlosť vetra, intenzita svetla, teplota a všetko, s čím narábame, ako je rýchlosť, rýchlosť, tlak atď., Sú svojou povahou analógové. Naše mikroprocesory a mikroprocesory sú ale digitálne zariadenia a nebudú schopné merať tieto parametre bez dôležitej periférie zvanej Analog to Digital Converters (ADC). V tomto článku sa teda naučme používať ADC na mikrokontroléri STM8S s kompilátorom COMIC C.
Potrebné materiály
V tomto článku budeme čítať dve hodnoty analógového napätia z dvoch potenciometrov a zobrazovať ich hodnotu ADC na 16x2 LCD displeji. Aby sme to mohli urobiť, budeme potrebovať nasledujúce komponenty.
- Vývojová doska STM8S103F3P6
- Programátor ST-Link V2
- 16x2 LCD
- Potenciometre
- Pripojovacie vodiče
- 1k rezistor
ADC na STM8S103F3P6
Existuje veľa druhov ADC a každý mikrokontrolér má svoje vlastné technické parametre. Na STM8S103F3P6 máme ADC s 5 kanálovým a 10-bitovým rozlíšením; s 10-bitovým rozlíšením budeme schopní merať digitálnu hodnotu od 0 do 1024 a 5-kanálový ADC naznačuje, že máme 5 pinov na mikrokontroléri, ktoré môžu podporovať ADC, týchto 5 pinov je zvýraznených na obrázku nižšie.
Ako vidíte, všetkých týchto päť kolíkov (AIN2, AIN3, AIN4, AIN5 a AIN6) je multiplexovaných s inými perifériami, čo znamená, že okrem toho, že fungujú iba ako kolíky ADC, je možné tieto kolíky použiť aj na vykonávanie inej komunikácie, napríklad „Pin 2 a 3 (AIN5 a AIN 6) je možné použiť nielen pre ADC, ale tiež pre sériovú komunikáciu a funkcie GPIO. Upozorňujeme, že nebude možné použiť rovnaký pin na všetky tri účely, takže ak používame tieto dva piny pre ADC, nebudeme môcť vykonávať sériovú komunikáciu. Ďalšie dôležité charakteristiky ADC pre STM8S103P36 nájdete v nasledujúcej tabuľke prevzatej z technického listu.
Vo vyššie uvedenej tabuľke Vdd predstavuje prevádzkové napätie a Vss predstavuje zem. Takže v našom prípade na našej vývojovej doske máme mikrokontrolér pracujúci na 3,3 V, môžete si skontrolovať schému zapojenia vývojovej dosky od začiatku používania tutoriálu STM8S. S prevádzkovým napätím 3,3 V je možné nastaviť našu frekvenciu hodín ADC medzi 1 až 4 MHz a náš rozsah konverzného napätia je medzi 0 V a 3,3 V. To znamená, že náš 10-bitový ADC bude čítať 0, keď je k dispozícii 0V (Vss), a bude čítať maximálne 1024, keď je k dispozícii 3,3V (Vdd). Toto 0-5V môžeme ľahko zmeniť zmenou prevádzkového napätia MCU, ak je to potrebné.
Okruhový diagram na čítanie hodnôt ADC na STM8S a na displeji na LCD
Kompletná schéma zapojenia použitá v tomto projekte je uvedená nižšie. Je veľmi podobná tutoriálu LCD STM8S, o ktorom sme hovorili predtým.
Ako vidíte, jedinými ďalšími komponentmi okrem LCD sú iba dva potenciometre POT_1 a POT_2 . Tieto hrnce sú pripojené k portom PC4 a PD6, čo sú kolíky ANI2 a ANI6, ako už bolo spomenuté na obrázku pinout.
Potenciometre sú spojené tak, že keď ich obmeníme, dostaneme na našich analógových pinoch 0-5 V. Budeme programovať náš radič tak, aby čítal toto analógové napätie v digitálnej hodnote (0 až 1024) a zobrazoval ho na obrazovke LCD. Potom tiež vypočítame ekvivalentnú hodnotu napätia a zobrazíme ju na LCD displeji. Pamätajte, že náš ovládač je napájaný 3,3 V, takže aj keď poskytneme 5 V na kolík ADC, bude schopný čítať iba od 0 V do 3,3 V.
Po dokončení pripojenia vyzerá môj hardvér takto, ako je to znázornené nižšie. Na pravej strane sú dva potenciometre a naľavo programátor ST-link.
Knižnica ADC pre STM8S103F3P6
Na programovanie funkcií ADC na STM8S budeme používať kompilátor Cosmic C spolu s knižnicami SPL. Ale pre uľahčenie procesov som vytvoril ďalší hlavičkový súbor, ktorý sa dá nájsť na GitHub s odkazom nižšie.
Knižnica ADC pre STM8S103F3P6
Ak viete, čo robíte, môžete pomocou vyššie uvedeného kódu vytvoriť hlavičkový súbor a pridať ho do adresára „zahrnúť súbory“ na stránke projektu. Ak to nie je potrebné, postupujte podľa pokynov v úvode k tutoriálu STM8S, aby ste vedeli, ako nastaviť programovacie prostredie a kompilátor. Keď je vaše nastavenie pripravené, vaše IDE by malo mať nasledujúce hlavičkové súbory, aspoň tie, ktoré sú obklopené červenou farbou.
Vyššie uvedený súbor hlavičky pozostáva z funkcie nazvanej ADC_Read () . Túto funkciu je možné volať v hlavnom programe a získať hodnotu ADC na ľubovoľnom kolíku. Napríklad ADC_Read (AN2) vráti ako výsledok hodnotu ADC na kolíku AN2. Funkcia je uvedená nižšie.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int výsledok = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (POVOLENÉ); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); výsledok = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Ako vidíte, tejto funkcii môžeme odovzdať osem parametrov, ktoré určujú, ako je nakonfigurovaný ADC. V našom kóde knižnice vyššie sme nastavili režim konverzie na nepretržitý a potom dostaneme číslo kanálu odovzdaného parametru. A potom musíme nastaviť frekvenciu CPU nášho radiča, štandardne (ak ste nepripojili externý kryštál) bude váš STM8S pracovať s 16Mhz interným oscilátorom. Takže sme spomenuli „ ADC1_PRESSEL_FCPU_D18 “ ako hodnotu pred scalerom . Vo vnútri tejto funkcie používame ďalšie metódy definované v hlavičkovom súbore SPL stm8s_adc1.h . Začneme deinicializáciou pinov ADC a potom ADC1_Init () na inicializáciu periférie ADC. Definícia tejto funkcie z užívateľskej príručky SPL je uvedená nižšie.
Ďalej nastavíme externý spúšťač pomocou časovača a deaktivujeme externý spúšťač, pretože ho tu nebudeme používať. A potom máme zarovnanie nastavené vpravo a posledné dva parametre sa používajú na nastavenie Schmittovho spúšťača, ale pre tento tutoriál ho deaktivujeme. Stručne povedané, náš ADC bude pracovať v režime nepretržitej konverzie na požadovanom kolíku ADC s externým spúšťačom a spúšťačom Schmitt deaktivovaným. Ak potrebujete ďalšie informácie o tom, ako používať externý spúšťač alebo možnosť Schmittovho spúšťača, môžete skontrolovať údajový list, o čom v tomto tutoriále nebudeme diskutovať.
Program STM8S na čítanie analógového napätia a zobrazenie na LCD
Celý kód použitý v súbore main.c nájdete v spodnej časti tejto stránky. Po pridaní požadovaných súborov hlavičiek a zdrojových súborov by ste mali byť schopní priamo zostaviť hlavný súbor. Vysvetlenie kódu v hlavnom súbore je nasledovné. Nebudem vysvetľovať program STM8S LCD, pretože sme o tom už hovorili v predchádzajúcom návode.
Účelom kódu bude načítať hodnoty ADC z dvoch pinov a previesť ich na hodnotu napätia. Na LCD tiež zobrazíme hodnotu ADC aj hodnotu napätia. Použil som teda funkciu s názvom LCD_Print Var, ktorá prijíma premennú v celočíselnom formáte a prevádza ju na znak, aby sa zobrazila na LCD. Na získanie každej číslice z premennej a vloženie premenných ako d1, d2, d3 a d4 sme použili operátory jednoduchého modulu (%) a divide (/), ako je uvedené nižšie. Potom môžeme pomocou funkcie LCD_Print_Char tieto znaky zobraziť na LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + 0; d3 = (var / 10)% 10 + 0; d2 = (var / 100)% 10 + 0; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Ďalej pod hlavnou funkciou máme deklarované štyri premenné. Dva z nich sa používajú na uloženie hodnoty ADC (0 až 1024) a ďalšie dva sa používajú na získanie skutočnej hodnoty napätia.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Ďalej musíme pripraviť piny GPIO a konfiguráciu hodín na čítanie analógového napätia. Tu budeme čítať analógové napätie z pinov AIN2 a AIN6, ktoré sú pinmi PC4 a PD6. Tieto kolíky musíme definovať v plávajúcom stave, ako je to znázornené nižšie. Taktiež povolíme perifériu hodín pre ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Povoliť periférne hodiny pre ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Teraz, keď sú kolíky pripravené, musíme sa dostať do nekonečnej while slučky, aby sme mohli načítať analógové napätie. Pretože máme náš hlavičkový súbor, môžeme ľahko prečítať analógové napätie z pinov AIN2 a AIN 6 pomocou nasledujúcich riadkov.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Ďalším krokom je prevádzanie tohto čítania ADC (0 až 1023) na analógové napätie. Týmto spôsobom môžeme zobraziť presnú hodnotu napätia danú pinom AIN2 a AIN6. Vzorce na výpočet analógového napätia môžu byť dané:
Analógové napätie = čítanie ADC * (3300/1023)
V našom prípade na radičoch STM8S103F3 máme ADC s 10-bitovým rozlíšením, takže sme použili 1023 (2 ^ 10) . Aj pri našom vývoji napájame regulátor s 3,3 V, čo je 3 300, takže sme vo vyššie uvedených vzorcoch rozdelili 3 300 na 1023. Približne 3300/1023 nám dá 3,226, takže v našom programe máme nasledujúce riadky na meranie skutočného napätia ADC pomocou napätia ADC.
ADC_voltage_1 = ADC_value_1 * (3,226); // (3300/1023 = ~ 3,226) prevádzať hodnotu ADC 1 na 0 až 3300 mV ADC_voltage_2 = ADC_value_2 * (3,226); // prevádza hodnotu ADC 1 na 0 až 3300 mV
Zvyšná časť kódu sa používa iba na zobrazenie týchto štyroch hodnôt na obrazovke LCD. Máme tiež oneskorenie 500 ms, aby sa LCD aktualizoval každých 500 ms. Toto môžete ešte znížiť, ak potrebujete rýchlejšie aktualizácie.
Čítanie analógového napätia z dvoch potenciometrov pomocou STM8S
Zostavte kód a nahrajte ho na svoju vývojovú dosku. Ak sa vyskytne akákoľvek chyba pri kompilácii, uistite sa, že ste pridali všetky hlavičkové a zdrojové súbory, ako už bolo uvedené. Po načítaní kódu by sa mala zobraziť malá uvítacia správa „ADC na STM8S“ a potom by sa mala zobraziť obrazovka uvedená nižšie.
Hodnota D1 a D2 označuje hodnotu ADC z kolíka Ain2 a AIN6. Na pravej strane máme tiež zobrazené ekvivalentné hodnoty napätia. Táto hodnota by sa mala rovnať napätiu na pinoch AIN2 a AIN6. To isté môžeme skontrolovať pomocou multimetra, môžeme tiež meniť potenciometre, aby sme skontrolovali, či sa podľa toho mení aj hodnota napätia.
Kompletné fungovanie nájdete aj vo videu nižšie. Dúfam, že sa vám tutoriál páčil a dozvedeli ste sa niečo užitočné, ak máte nejaké otázky, nechajte ich v sekcii komentárov nižšie. Môžete tiež použiť naše fóra na začatie diskusie alebo na zverejnenie ďalších technických otázok.