- Szükséges anyagok
- ADC az STM8S103F3P6-on
- Áramkör az ADC-értékek leolvasásához az STM8S-en és a kijelzőn az LCD-n
- ADC könyvtár az STM8S103F3P6 számára
- STM8S program analóg feszültség és kijelző olvasására az LCD-n
- Analóg feszültség leolvasása két potenciométerről az STM8S segítségével
Ha Ön rendszeres olvasó, aki követi az STM8S mikrokontroller oktatóprogramjainkat, akkor tudhatja, hogy legutóbbi oktatóanyagunkban megtanultuk, hogyan kell összekapcsolni egy 16x2-es LCD-t az STM8-okkal. Most ezen az oktatóanyagon folytatva megtanuljuk, hogyan kell használni az ADC funkciót az STM8S103F3P6 mikrovezérlőnkön. Az ADC egy nagyon hasznos periféria egy mikrokontrolleren, amelyet a beágyazott programozók gyakran használnak olyan egységek mérésére, amelyek állandóan változnak, például változó feszültség, áram, hőmérséklet, páratartalom stb.
Mint tudjuk: „Analóg világban élünk digitális eszközökkel”, vagyis minden, ami körülöttünk van, például a szél sebessége, a fény intenzitása, a hőmérséklet, és minden, amivel foglalkozunk, például a sebesség, a sebesség, a nyomás stb., Analóg jellegűek. A mikrokontrollereink és mikroprocesszoraink azonban digitális eszközök, és nem lesznek képesek mérni ezeket a paramétereket az analóg-digitális átalakítók (ADC) nevű fontos periféria nélkül. Tehát ebben a cikkben megtanuljuk, hogyan kell használni az ADC-t az STM8S mikrokontrolleren a COMIC C fordítóval.
Szükséges anyagok
Ebben a cikkben két analóg feszültségértéket fogunk olvasni két potenciométerről, és ADC értékét egy 16x2 LCD kijelzőn jelenítjük meg. Ehhez a következő összetevőkre lesz szükségünk.
- STM8S103F3P6 Fejlesztői testület
- ST-Link V2 programozó
- 16x2 LCD
- Potenciométerek
- Csatlakozó vezetékek
- 1k ellenállás
ADC az STM8S103F3P6-on
Sokféle ADC létezik, és mindegyik mikrovezérlő saját specifikációval rendelkezik. Az STM8S103F3P6-on ADC-vel rendelkezünk 5 csatornás és 10 bites felbontással; 10 bites felbontással képesek leszünk megmérni a digitális értéket 0 és 1024 között, és egy 5 csatornás ADC azt jelzi, hogy a mikrokontrolleren 5 érintkezõ van, amelyek támogatni tudják az ADC-t.
Amint láthatja, mind az öt csap (AIN2, AIN3, AIN4, AIN5 és AIN6) multiplexálva van más perifériákkal, vagyis azon kívül, hogy csak ADC tűként működnek, ezek a csapok használhatók más kommunikációk végrehajtására is, például, a 2 és 3 tű (AIN5 és AIN 6) nemcsak ADC-hez használható, hanem soros kommunikációhoz és GPIO funkciókhoz is. Ne feledje, hogy nem lehet ugyanazt a csapot mindhárom célra használni, tehát ha ezt a két csapot használjuk az ADC-hez, akkor nem fogunk tudni soros kommunikációt folytatni. Az STM8S103P36 egyéb fontos ADC-jellemzői megtalálhatók az alábbi táblázatban, az adatlapból.
A fenti táblázatban a Vdd az üzemi feszültséget, a Vss pedig a földet jelenti. Tehát esetünkben a fejlesztői táblánkon a mikrovezérlő 3,3 V-on működik, az STM8S oktatóanyag használatával ellenőrizheti a fejlesztői kártya kapcsolási rajzát a kezdetektől fogva. Ha a működési feszültség 3,3 V, akkor az ADC órajel-frekvenciánk 1 és 4 MHz között állítható, és az átalakítási feszültség tartományunk 0 és 3,3 V között van. Ez azt jelenti, hogy a 10 bites ADC 0-t fog olvasni, ha 0 V (Vss) van megadva, és maximum 1024-et fog olvasni, ha 3,3 V (Vdd) van megadva. Ezt a 0-5V-ot könnyen megváltoztathatjuk az MCU üzemi feszültségének szükség szerinti megváltoztatásával.
Áramkör az ADC-értékek leolvasásához az STM8S-en és a kijelzőn az LCD-n
A projektben használt teljes kapcsolási rajz az alábbiakban található, nagyon hasonlít az STM8S LCD oktatóanyaghoz, amelyet korábban tárgyaltunk.
Mint látható, az LCD-n kívül az egyetlen további alkatrész két potméter, a POT_1 és a POT_2 . Ezek a potok a PC4 és a PD6 portokhoz vannak csatlakoztatva, amelyek az ANI2 és ANI6 érintkezők, amint azt a pinout képen korábban tárgyaltuk.
A potenciométerek úgy vannak csatlakoztatva, hogy ha változtatjuk, 0-5 V-ot kapunk az analóg csapjainkon. Be fogjuk programozni a vezérlőnket, hogy olvassa el ezt az analóg feszültséget digitális értékben (0-1024), és jelenítse meg az LCD képernyőn. Ezután kiszámoljuk az egyenértékű feszültségértéket is, és megjelenítjük az LCD-n, ne feledjük, hogy a vezérlőnk 3,3 V-os tápfeszültséggel működik, így még akkor is, ha 5 V-ot biztosítunk az ADC-tűnek, csak 0 V-ról 3,3 V-ra lesz képes olvasni.
Miután a kapcsolatok elkészültek, a hardverem az alábbiak szerint néz ki. A két potenciométer látható a jobb oldalon, az ST-link programozó pedig a bal oldalon.
ADC könyvtár az STM8S103F3P6 számára
Az ADM funkciók programozásához az STM8S-en a Cosmic C fordítót fogjuk használni az SPL könyvtárakkal együtt. De a folyamatok megkönnyítése érdekében készítettem egy újabb fejlécfájlt, amely megtalálható a GitHubon az alábbi linken.
ADC könyvtár az STM8S103F3P6 számára
Ha tudod, mit csinálsz, létrehozhatsz egy fejlécfájlt a fenti kód felhasználásával, és hozzáadhatod a projektoldal „fájlok belefoglalásához” könyvtárához. Kövesse az első lépéseket az STM8S oktatóanyaggal, hogy megismerje a programozási környezet és a fordító beállítását. Miután elkészült a beállítással, az IDE-nek a következő fejlécfájlokat kell tartalmaznia, legalább azokat, amelyeket piros színnel vesznek körül.
A fenti fejlécfájl az ADC_Read () nevű függvényből áll. Ez a funkció meghívható a fő programban, hogy az ADC értéket bármelyik csapra megkapja. Például az ADC_Read (AN2) eredményül adja az AD2 értéket az AN2 tűn . A funkció alább látható.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {aláíratlan int eredmény = 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 (ENABLE); ADC1_StartConversion (); míg (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == HAMIS); eredmény = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Amint látja, nyolc paramétert adhatunk át ennek a függvénynek, és ez meghatározza az ADC konfigurálását. A fenti könyvtárkódban a konverziós módot folyamatosra állítottuk, majd a csatornaszám átadta a paramétert. Ezután be kell állítanunk a vezérlőnk CPU frekvenciáját, alapértelmezés szerint (ha nem csatlakoztatott külső kristályt), az STM8S egy 16Mhz belső oszcillátorral fog működni. Tehát megemlítettük az “ ADC1_PRESSEL_FCPU_D18 ” értéket a méretezés előtti értékként. Ebben a függvényben más módszereket használunk, amelyeket az SPL stm8s_adc1.h fejlécfájl határoz meg. Az ADC csapok inicializálásával, majd az ADC1_Init () segítségével kezdjük az ADC perifériájának inicializálását. Az SPL felhasználói kézikönyvben a funkció meghatározása az alábbiakban látható.
Ezután időzítővel állítjuk be a külső ravaszt, és letiltjuk a külső ravaszt, mivel nem itt fogjuk használni. Ezután jobbra állítottuk az igazítást, és az utolsó két paramétert használjuk a Schmitt-trigger beállításához, de ezt az oktatóanyagot letiltjuk. Röviden szólva: az ADC-t folyamatos konverziós üzemmódban fogjuk dolgozni a szükséges ADC-csapon, külső triggerrel és Schmitt-triggerrel. Ellenőrizheti az adatlapot, ha további információra van szüksége a külső trigger vagy a Schmitt trigger opció használatáról, ezt nem ebben a bemutatóban tárgyaljuk.
STM8S program analóg feszültség és kijelző olvasására az LCD-n
A main.c fájlban használt teljes kód az oldal alján található. A szükséges fejlécfájlok és forrásfájlok hozzáadása után képesnek kell lennie a fő fájl közvetlen fordítására. A fő fájlban található kód magyarázata a következő. Nem fogom elmagyarázni az STM8S LCD programot, mivel ezt már az előző bemutatón is megvitattuk.
A kód célja az ADC-értékek két csapról történő kiolvasása és feszültségértékekké alakítása. Ezenkívül az ADC értéket és a Feszültség értéket is megjeleníti az LCD-n. Tehát az LCD_Print Var nevű függvényt használtam, amely egy változót egész formátumban vesz be, és karakterré alakítja, hogy megjelenjen az LCD-n. Az egyszerű modulus (%) és osztás (/) operátorokat használtuk arra, hogy minden egyes számjegyet kapjunk a változóból, és olyan változókat tegyünk be, mint d1, d2, d3 és d4, az alábbiak szerint. Ezután az LCD_Print_Char függvény segítségével megjeleníthetjük ezeket a karaktereket az LCD-n.
érvénytelen 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); }
Ezután a fő függvény alatt négy változót deklaráltunk. Közülük kettőt az ADC érték (0-1024) mentésére használnak, a másik kettőt pedig a tényleges feszültségérték megadására használják.
aláíratlan int ADC_érték_1 = 0; aláíratlan int ADC_érték_2 = 0; int ADC_feszültség_1 = 0; int ADC_feszültség_2 = 0;
Ezután elő kell készítenünk a GPIO csapokat és az óra konfigurációt az analóg feszültség leolvasására. Itt leolvassuk az analóg feszültséget az AIN2 és AIN6 csapokról, amelyek rendre a PC4 és a PD6 csapok. Ezeket a csapokat lebegő állapotban kell meghatároznunk az alábbiak szerint. Engedélyezni fogjuk az óra perifériáját is az ADC számára.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Perifériás óra engedélyezése az ADC számára GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Most, hogy a csapok készen vannak, be kell jutnunk a végtelen ciklusba, hogy leolvassuk az analóg feszültséget. Mivel megvan a fejléc fájlunk, az alábbi sorok segítségével könnyen leolvashatjuk az AIN2 és AIN 6 érintkezők analóg feszültségét.
ADC_érték_1 = ADC_Read (AIN2); ADC_érték_2 = ADC_Read (AIN6);
A következő lépés az ADC leolvasásának (0 és 1023 közötti) átalakítása analóg feszültséggé. Így megjeleníthetjük az AIN2 és AIN6 csapok pontos feszültségértékét. Az analóg feszültség kiszámítására szolgáló képletek
Analóg feszültség = ADC leolvasás * (3300/1023)
Az esetünkben az STM8S103F3 vezérlőkön 10 bites felbontású ADC-vel rendelkezünk, ezért 1023-at (2 ^ 10) használtunk . Szintén a fejlesztési teljesítményünkön keresztül vezérli a 3,3 V-os vezérlőt, amely 3300, tehát a fenti képletekben 3300-at osztottunk 1023-mal. Körülbelül 3300/1023 3,226-ot kap, így programunkban a következő sorokat használjuk a tényleges ADC feszültség mérésére az ADC feszültség segítségével.
ADC_feszültség_1 = ADC_érték_1 * (3,226); // (3300/1023 = ~ 3,226) az 1. ADC értéket 0-ról konvertálja 3300mV-ra. ADC_voltage_2 = ADC_érték_2 * (3.226); // konvertálja az 1. ADC értéket 0-ról 3300mV-ra
A kód fennmaradó részét csak e négy érték megjelenítésére használják az LCD képernyőn. 500 ms késéssel is rendelkezünk, így az LCD frissül minden 500 mS-re. Ezt még tovább csökkentheti, ha gyorsabb frissítésekre van szüksége.
Analóg feszültség leolvasása két potenciométerről az STM8S segítségével
Fordítsa le a kódot, és töltse fel a fejlesztői táblára. Ha fordítási hibát észlel, győződjön meg arról, hogy az összes fejlécfájlt és forrásfájlt hozzáadta a korábban tárgyalt módon. Miután feltöltötte a kódot, látnia kell egy kis üdvözlő üzenetet, amely azt írja: „ADC on STM8S”, majd látnia kell az alábbi képernyőt.
A D1 és D2 érték az Ain2 és az AIN6 csapok ADC-értékét jelöli. A jobb oldalon az egyenértékű feszültségértékek is megjelennek. Ennek az értéknek meg kell egyeznie az AIN2 és az AIN6 csapokon megjelenő feszültséggel. Multiméter segítségével ellenőrizhetjük ugyanezt, a potenciométereket is változtathatjuk, hogy ellenőrizzük, a feszültség értéke is ennek megfelelően változik-e.
A teljes munka az alábbi videóban is megtalálható. Remélem, tetszett az oktatóanyag, és valami hasznosat tanult. Ha bármilyen kérdése van, hagyja őket az alábbi megjegyzés részben. Fórumunkat is használhatja vita indításához vagy egyéb technikai kérdések feladásához.