- Potřebné materiály
- ADC na STM8S103F3P6
- Schéma zapojení pro čtení hodnot ADC na STM8S a zobrazení na LCD
- Knihovna ADC pro STM8S103F3P6
- Program STM8S pro čtení analogového napětí a zobrazení na LCD
- Čtení analogového napětí ze dvou potenciometrů pomocí STM8S
Pokud jste pravidelným čtenářem, který sleduje naše výukové programy pro mikrokontroléry STM8S, víte, že v našem posledním výukovém programu jsme se naučili, jak propojit 16x2 LCD s STM8s. Nyní s tímto návodem se naučíme, jak používat funkci ADC na našem mikrokontroléru STM8S103F3P6. ADC je velmi užitečná periferie na mikrokontroléru, kterou často používají vestavění programátoři k měření jednotek, které se neustále mění, jako je měnící se napětí, proud, teplota, vlhkost atd.
Jak víme „Žijeme v analogovém světě s digitálními zařízeními“, což znamená, že vše kolem nás, jako je rychlost větru, intenzita světla, teplota, a vše, co řešíme, jako je rychlost, rychlost, tlak atd., Jsou analogické povahy. Naše mikroprocesory a mikroprocesory jsou ale digitální zařízení a nebudou moci měřit tyto parametry bez důležité periferie zvané Analog to Digital Converters (ADC). V tomto článku se tedy naučíme používat ADC na mikrokontroléru STM8S s kompilátorem COMIC C.
Potřebné materiály
V tomto článku budeme číst dvě analogové hodnoty napětí ze dvou potenciometrů a zobrazovat jejich hodnotu ADC na 16x2 LCD displeji. K tomu budeme potřebovat následující komponenty.
- Vývojová deska STM8S103F3P6
- Programátor ST-Link V2
- 16x2 LCD
- Potenciometry
- Připojovací vodiče
- 1k rezistor
ADC na STM8S103F3P6
Existuje mnoho typů ADC a každý mikrokontrolér má své vlastní specifikace. Na STM8S103F3P6 máme ADC s 5kanálovým a 10bitovým rozlišením; s 10bitovým rozlišením budeme moci měřit digitální hodnotu od 0 do 1024 a 5kanálový ADC znamená, že máme 5 pinů na mikrokontroléru, které podporují ADC, těchto 5 pinů je zvýrazněno na obrázku níže.
Jak můžete vidět, všech těchto pět pinů (AIN2, AIN3, AIN4, AIN5 a AIN6) je multiplexováno s dalšími periferiemi, což znamená, že kromě toho, že fungují pouze jako pin ADC, lze tyto piny použít také pro provádění jiné komunikace, například „Pin 2 a 3 (AIN5 a AIN 6) lze použít nejen pro ADC, ale také pro sériovou komunikaci a funkce GPIO. Všimněte si, že nebude možné použít stejný pin pro všechny tři účely, takže pokud používáme tyto dva piny pro ADC, nebudeme moci provádět sériovou komunikaci. Další důležité charakteristiky ADC pro STM8S103P36 najdete v následující tabulce převzaté z datového listu.
Ve výše uvedené tabulce Vdd představuje provozní napětí a Vss představuje zem. Takže v našem případě na naší vývojové desce máme mikrokontrolér pracující na 3,3 V, můžete zkontrolovat schéma zapojení vývojové desky od začátku s tutoriálem STM8S. S provozním napětím 3,3 V lze naši frekvenci hodin ADC nastavit mezi 1 až 4 MHz a náš rozsah přepočítacího napětí je mezi 0 V a 3,3 V. To znamená, že náš 10bitový ADC bude číst 0, když je k dispozici 0V (Vss), a bude číst maximálně 1024, když je k dispozici 3,3V (Vdd). Toto 0-5V můžeme snadno změnit změnou provozního napětí MCU, pokud je to požadováno.
Schéma zapojení pro čtení hodnot ADC na STM8S a zobrazení na LCD
Kompletní schéma zapojení použité v tomto projektu je uvedeno níže, je velmi podobné tutoriálu LCD STM8S, který jsme diskutovali dříve.
Jak vidíte, kromě LCD displeje jsou kromě potenciometrů POT_1 a POT_2 jediné další komponenty. Tyto hrnce jsou připojeny k portům PC4 a PD6, což jsou piny ANI2 a ANI6, jak bylo popsáno výše na obrázku pinout.
Potenciometry jsou zapojeny tak, že když je měníme, dostaneme 0-5 V na našich analogových pinech. Budeme programovat náš řadič tak, aby načetl toto analogové napětí v digitální hodnotě (0 až 1024) a zobrazil jej na obrazovce LCD. Pak také vypočítáme ekvivalentní hodnotu napětí a zobrazíme ji na LCD, pamatujte, že náš ovladač je napájen 3,3 V, takže i když poskytneme 5 V na kolík ADC, bude schopen číst pouze od 0 V do 3,3 V.
Po dokončení připojení vypadá můj hardware takto, jak je znázorněno níže. Na pravé straně vidíte dva potenciometry a na levé straně programátor ST-link.
Knihovna ADC pro STM8S103F3P6
K programování funkcí ADC na STM8S budeme používat kompilátor Cosmic C spolu s knihovnami SPL. Ale pro usnadnění procesů jsem vytvořil další hlavičkový soubor, který najdete na GitHubu pomocí odkazu níže.
Knihovna ADC pro STM8S103F3P6
Pokud víte, co děláte, můžete pomocí výše uvedeného kódu vytvořit soubor záhlaví a přidat jej do adresáře „zahrnout soubory“ na stránce projektu. Jinak postupujte podle pokynů v tutoriálu STM8S, abyste věděli, jak nastavit programovací prostředí a kompilátor. Jakmile je vaše nastavení připraveno, vaše IDE by mělo mít následující hlavičkové soubory, alespoň ty, které jsou obklopeny červeně.
Výše uvedený soubor záhlaví se skládá z funkce nazvané ADC_Read () . Tuto funkci lze vyvolat v hlavním programu a získat hodnotu ADC na libovolném pinu. Například ADC_Read (AN2) vrátí jako výsledek hodnotu ADC na pinu AN2. Funkce je uvedena níže.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int výsledek = 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 (POVOLIT); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); result = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Jak vidíte, můžeme této funkci předat osm parametrů a to definuje, jak je nakonfigurován ADC. V našem kódu knihovny výše jsme nastavili režim převodu na kontinuální a poté jsme dostali číslo kanálu předaného parametru. A pak musíme nastavit frekvenci CPU našeho řadiče, ve výchozím nastavení (pokud jste nepřipojili externí krystal) bude váš STM8S pracovat s interním oscilátorem 16Mhz. Jako hodnotu před Scalerem jsme tedy uvedli „ ADC1_PRESSEL_FCPU_D18 “. Uvnitř této funkce používáme další metody definované v hlavičkovém souboru SPL stm8s_adc1.h . Začneme deinicializací pinů ADC a potom ADC1_Init () k inicializaci periferních zařízení ADC. Definice této funkce z uživatelské příručky SPL je uvedena níže.
Dále nastavíme externí spoušť pomocí časovače a deaktivujeme externí spoušť, protože ji zde nebudeme používat. A pak máme zarovnání nastaveno doprava a poslední dva parametry se používají k nastavení Schmittova spouště, ale pro tento výukový program jej deaktivujeme. Stručně řečeno, náš ADC bude pracovat v režimu nepřetržité konverze na požadovaném kolíku ADC s deaktivovaným externím spouštěčem a Schmittovým spouštěčem. Můžete si prohlédnout datový list, pokud potřebujete další informace o tom, jak používat externí spouštěč nebo Schmittův spouštěč, o tom se v tomto kurzu nebudeme bavit.
Program STM8S pro čtení analogového napětí a zobrazení na LCD
Celý kód použitý v souboru main.c najdete ve spodní části této stránky. Po přidání požadovaných záhlaví a zdrojových souborů byste měli být schopni přímo kompilovat hlavní soubor. Vysvětlení kódu v hlavním souboru je následující. Nebudu vysvětlovat program STM8S LCD, protože jsme o tom již diskutovali v předchozím tutoriálu.
Účelem kódu bude načíst hodnoty ADC ze dvou pinů a převést je na hodnotu napětí. Na LCD také zobrazíme hodnotu ADC a hodnotu napětí. Takže jsem použil funkci nazvanou LCD_Print Var, která přijímá proměnnou v celočíselném formátu a převádí ji na znak, aby se zobrazila na LCD. K získání každé číslice z proměnné a vložení proměnných jako d1, d2, d3 a d4 jsme použili operátory jednoduchého modulu (%) a divide (/), jak je znázorněno níže. Pak můžeme použít funkci LCD_Print_Char k zobrazení těchto znaků 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); }
Dále pod hlavní funkcí máme deklarované čtyři proměnné. Dva z nich se používají k uložení hodnoty ADC (0 až 1024) a další dva se používají k získání skutečné hodnoty napětí.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Dále musíme připravit GPIO piny a konfiguraci hodin pro čtení analogového napětí. Zde budeme číst analogové napětí z pinů AIN2 a AIN6, což jsou piny PC4 a PD6. Musíme definovat tyto kolíky v plovoucím stavu, jak je znázorněno níže. Také povolíme periferní hodiny pro ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, POVOLIT); // Povolit periferní hodiny pro ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Nyní, když jsou piny připraveny, musíme se dostat do nekonečné smyčky while, abychom mohli přečíst analogové napětí. Protože máme náš hlavičkový soubor, můžeme snadno číst analogové napětí z pinů AIN2 a AIN 6 pomocí níže uvedených řádků.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Dalším krokem je převod tohoto odečtu ADC (0 až 1023) na analogové napětí. Tímto způsobem můžeme zobrazit přesnou hodnotu napětí danou pinům AIN2 a AIN6. Vzorce pro výpočet analogového napětí mohou být dány -
Analogové napětí = čtení ADC * (3300/1023)
V našem případě na řadičích STM8S103F3 máme ADC s 10bitovým rozlišením, takže jsme použili 1023 (2 ^ 10) . Také na našem vývoji napájíme regulátor s 3,3 V, což je 3300, takže jsme ve výše uvedených vzorcích rozdělili 3300 na 1023. Přibližně 3300/1023 nám dá 3,226, takže v našem programu máme následující řádky pro měření skutečného napětí ADC pomocí napětí ADC.
ADC_voltage_1 = ADC_value_1 * (3,226); // (3300/1023 = ~ 3,226) převést hodnotu ADC 1 na 0 až 3300 mV ADC_voltage_2 = ADC_value_2 * (3,226); // převést hodnotu ADC 1 na 0 až 3300 mV
Zbývající část kódu se používá pouze k zobrazení těchto čtyř hodnot na obrazovce LCD. Máme také zpoždění 500 ms, takže se LCD aktualizuje každých 500 mS. Toto můžete dále snížit, pokud potřebujete rychlejší aktualizace.
Čtení analogového napětí ze dvou potenciometrů pomocí STM8S
Zkompilujte kód a nahrajte jej na vývojovou desku. Pokud se vám vyskytne jakákoli chyba při kompilaci, ujistěte se, že jste přidali všechny soubory záhlaví a zdrojové soubory, jak bylo popsáno výše. Jakmile je kód nahrán, měla by se zobrazit malá uvítací zpráva „ADC na STM8S“ a poté by se měla zobrazit následující obrazovka.
Hodnota D1 a D2 označuje hodnotu ADC z pinu Ain2 a AIN6. Na pravé straně máme také zobrazené ekvivalentní hodnoty napětí. Tato hodnota by se měla rovnat napětí na pinech AIN2 a AIN6. Můžeme to zkontrolovat pomocí multimetru, můžeme také měnit potenciometry, abychom zkontrolovali, zda se odpovídajícím způsobem mění také hodnota napětí.
Kompletní práci najdete také ve videu níže. Doufám, že se vám výukový program líbil a naučili se něco užitečného. Pokud máte nějaké dotazy, nechte je v sekci komentářů níže. Můžete také použít naše fóra k zahájení diskuse nebo zveřejnění dalších technických otázek.