- Materials necessaris
- ADC a STM8S103F3P6
- Diagrama de circuits per llegir els valors ADC a STM8S i mostrar-los a la pantalla LCD
- Biblioteca ADC per a STM8S103F3P6
- Programa STM8S per llegir la tensió i la pantalla analògiques a la pantalla LCD
- Lectura de tensió analògica des de dos potenciòmetres mitjançant STM8S
Si sou un lector habitual que seguiu els nostres tutorials sobre microcontroladors STM8S, sabríeu que al nostre últim tutorial vam aprendre a relacionar una pantalla LCD de 16x2 amb STM8s. Ara, continuant amb aquest tutorial, aprendrem a utilitzar la funció ADC del nostre microcontrolador STM8S103F3P6. Un ADC és un perifèric molt útil en un microcontrolador que sovint és utilitzat pels programadors incrustats per mesurar unitats que estan en constant canvi com el voltatge, el corrent, la temperatura, la humitat, etc.
Com sabem, "Vivim en un món analògic amb dispositius digitals", és a dir, tot el que ens envolta, com ara la velocitat del vent, la intensitat de la llum, la temperatura i tot el que tractem, com ara la velocitat, la velocitat, la pressió, etc., són de naturalesa analògica. Però els nostres microcontroladors i microprocessadors són dispositius digitals i no podran mesurar aquests paràmetres sense un perifèric important anomenat convertidors analògics a digitals (ADC). Així doncs, en aquest article, aprendrem a utilitzar ADC al microcontrolador STM8S amb el compilador COMIC C.
Materials necessaris
En aquest article, llegirem dos valors de tensió analògica de dos potenciòmetres i mostrarem el seu valor ADC en una pantalla LCD de 16x2. Per fer-ho, necessitarem els components següents.
- Taula de desenvolupament STM8S103F3P6
- Programador ST-Link V2
- LCD de 16x2
- Potenciòmetres
- Connexió de cables
- 1k resistència
ADC a STM8S103F3P6
Hi ha molts tipus d’ADC i cada microcontrolador té les seves pròpies especificacions. Al STM8S103F3P6, tenim un ADC amb resolució de 5 canals i 10 bits; amb una resolució de 10 bits, podrem mesurar el valor digital de 0 a 1024 i un ADC de 5 canals indica que tenim 5 pins al microcontrolador que poden suportar ADC, aquests 5 pins es ressalten a la imatge següent.

Com podeu veure, tots aquests cinc pins (AIN2, AIN3, AIN4, AIN5 i AIN6) es multiplexen amb altres perifèrics, és a dir, a part d’actuar com a pin ADC, aquests pins també es poden utilitzar per realitzar altres comunicacions com, el pin 2 i 3 (AIN5 i AIN 6) no només es poden utilitzar per a ADC, sinó que també es poden utilitzar per a comunicacions en sèrie i funcions GPIO. Tingueu en compte que no serà possible utilitzar el mateix pin per als tres propòsits, de manera que si fem servir aquests dos pins per ADC, no podrem realitzar cap comunicació en sèrie. Altres característiques ADC importants per a STM8S103P36 es poden trobar a la taula següent extreta del full de dades.

A la taula anterior, Vdd representa el voltatge de funcionament i Vss representa la terra. Així doncs, en el nostre cas, a la nostra placa de desenvolupament, tenim el microcontrolador que funciona a 3,3 V, podeu comprovar el diagrama del circuit de la placa de desenvolupament des del primer tutorial STM8S. Amb 3,3 V com a tensió de funcionament, la nostra freqüència de rellotge ADC es pot establir entre 1 i 4 MHz i el nostre rang de voltatge de conversió és entre 0 V i 3,3 V. Això vol dir que el nostre ADC de 10 bits llegirà 0 quan es proporciona 0V (Vss) i llegirà un màxim de 1024 quan es proporcionarà 3,3V (Vdd). Podem canviar fàcilment aquest 0-5V canviant el voltatge de funcionament de la MCU si és necessari.
Diagrama de circuits per llegir els valors ADC a STM8S i mostrar-los a la pantalla LCD
El diagrama de circuits complet utilitzat en aquest projecte es dóna a continuació, és molt similar al tutorial STM8S LCD que hem comentat anteriorment.

Com podeu veure, els únics components addicionals a part de la pantalla LCD són dos potenciòmetres POT_1 i POT_2 . Aquests pots estan connectats als ports PC4 i PD6, que són els pins ANI2 i ANI6 tal com es va comentar anteriorment a la imatge pinout.
Els potenciòmetres estan connectats de manera que, quan el variem, obtindrem 0-5 V als nostres pins analògics. Programarem el nostre controlador per llegir aquest voltatge analògic en valor digital (de 0 a 1024) i mostrar-lo a la pantalla LCD. A continuació, també calcularem el valor de voltatge equivalent i el mostrarem a la pantalla LCD. Recordeu que el nostre controlador funciona amb 3,3 V, de manera que fins i tot si proporcionem 5 V al pin ADC, només podrà llegir de 0 V a 3,3 V.
Un cop fetes les connexions, el meu maquinari té aquest aspecte com es mostra a continuació. Podeu veure els dos potenciòmetres a la dreta i el programador ST-link a l’esquerra.

Biblioteca ADC per a STM8S103F3P6
Per programar funcionalitats ADC a STM8S, utilitzarem el compilador Cosmic C juntament amb les biblioteques SPL. Però per facilitar els processos, he creat un altre fitxer de capçalera que es pot trobar a GitHub amb l'enllaç següent.
Biblioteca ADC per a STM8S103F3P6
Si sabeu què feu, podeu crear un fitxer de capçalera amb el codi anterior i afegir-lo al directori "incloure fitxers" de la pàgina del projecte. Seguiu els passos inicials amb el tutorial STM8S per saber com configurar l'entorn de programació i el compilador. Un cop la configuració estigui llesta, el vostre IDE hauria de tenir els fitxers de capçalera següents, com a mínim aquells encerclats en vermell.

El fitxer de capçalera anterior consisteix en una funció anomenada ADC_Read () . Aquesta funció es pot trucar al programa principal per obtenir el valor ADC a qualsevol pin. Per exemple, ADC_Read (AN2) retornarà el valor ADC al pin AN2 com a resultat. La funció es mostra a continuació.
int signat ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {resultat int signat = 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 (HABILITAT); ADC1_StartConversion (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALS); result = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Com veieu, podem passar vuit paràmetres a aquesta funció i això defineix com es configura l'ADC. Al nostre codi de biblioteca anterior, hem definit el mode de conversió a continu i, a continuació, obtenim un número de canal que passi un paràmetre. I després hem d’establir la freqüència de la CPU del nostre controlador, per defecte (si no heu connectat cap cristall extern), el vostre STM8S funcionarà amb un oscil·lador intern de 16 MHz. Per tant, hem esmentat " ADC1_PRESSEL_FCPU_D18 " com a valor de preescalador. Dins d'aquesta funció, estem utilitzant altres mètodes definits pel fitxer de capçalera SPL stm8s_adc1.h . Comencem desinicialitzant els pins ADC i després ADC1_Init () per inicialitzar el perifèric ADC. A continuació es mostra la definició d’aquesta funció a partir del manual de l’usuari SPL.

A continuació, configurem el disparador extern mitjançant un temporitzador i inhabilitem el disparador extern, ja que no el farem servir aquí. I després tenim l'alineació establerta a la dreta i els dos darrers paràmetres s'utilitzen per configurar el disparador de Schmitt, però el desactivarem per a aquest tutorial. Per tant, per resumir-ho, farem que el nostre ADC funcioni en mode de conversió contínua al pin ADC requerit amb activador extern i activador Schmitt desactivat. Podeu consultar el full de dades si necessiteu més informació sobre com utilitzar l’activador extern o l’opció d’activador de Schmitt, no en parlarem en aquest tutorial.
Programa STM8S per llegir la tensió i la pantalla analògiques a la pantalla LCD
El codi complet utilitzat al fitxer main.c es troba a la part inferior d’aquesta pàgina. Després d'afegir els fitxers de capçalera i fitxers font necessaris, hauríeu de poder compilar directament el fitxer principal. L’explicació del codi al fitxer principal és la següent. No explicaré el programa LCD STM8S, ja que ja ho hem comentat al tutorial anterior.
El propòsit del codi serà llegir els valors ADC de dos pins i convertir-lo en un valor de tensió. També mostrarem tant el valor ADC com el valor de tensió a la pantalla LCD. Per tant, he utilitzat una funció anomenada LCD_Print Var que pren una variable en format enter i la converteix en un caràcter per mostrar-la a la pantalla LCD. Hem utilitzat els operadors de mòdul simple (%) i divideix (/) per obtenir cada dígit de la variable i introduir variables com d1, d2, d3 i d4 com es mostra a continuació. A continuació, podem utilitzar la funció LCD_Print_Char per mostrar aquests caràcters a la pantalla 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); }
A continuació, sota la funció principal, tenim quatre variables declarades. Dos d'ells s'utilitzen per guardar el valor ADC (0 a 1024) i els altres dos s'utilitzen per obtenir el valor de tensió real.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
A continuació, hem de preparar els pins GPIO i la configuració del rellotge per llegir la tensió analògica. Aquí llegirem la tensió analògica dels pins AIN2 i AIN6 que són els pins PC4 i PD6 respectivament. Hem de definir aquests pins en un estat flotant tal com es mostra a continuació. També habilitarem el perifèric de rellotge per ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, HABILITAT); // Activa el rellotge perifèric per a ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Ara que els pins estan llestos, hem d’entrar al bucle while infinit per llegir la tensió analògica. Com que tenim el fitxer de capçalera, podem llegir fàcilment la tensió analògica dels pins AIN2 i AIN 6 mitjançant les línies següents.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
El següent pas és convertir aquesta lectura ADC (0 a 1023) a una tensió analògica. D'aquesta manera, podem mostrar el valor de tensió exacte que es dóna als pins AIN2 i AIN6. Les fórmules per calcular el voltatge analògic es poden donar per-
Voltatge analògic = Lectura ADC * (3300/1023)
En el nostre cas amb els controladors STM8S103F3, tenim un ADC amb resolució de 10 bits, de manera que hem utilitzat 1023 (2 ^ 10) . També el nostre desenvolupament potencia el controlador amb 3,3 V, que és 3300, de manera que hem dividit 3300 per 1023 en les fórmules anteriors. Aproximadament 3300/1023 ens donaran 3.226, de manera que en el nostre programa disposem de les línies següents per mesurar la tensió ADC real mitjançant la tensió ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) converteix el valor ADC 1 a 0 a 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // converteix el valor ADC 1 a 0 a 3300mV
La part restant del codi només s’utilitza per mostrar aquests quatre valors a la pantalla LCD. També tenim un retard de 500 ms perquè la pantalla LCD s’actualitzi per cada 500 ms. Podeu reduir-ho encara més si necessiteu actualitzacions més ràpides.
Lectura de tensió analògica des de dos potenciòmetres mitjançant STM8S
Compileu el codi i pengeu-lo al tauler de desenvolupament. Si teniu algun error de compilació, assegureu-vos d'haver afegit tots els fitxers de capçalera i fitxers font, tal com s'ha comentat anteriorment. Un cop carregat el codi, haureu de veure un petit missatge de benvinguda que diu "ADC a STM8S" i, a continuació, hauríeu de veure la pantalla següent.

El valor D1 i D2 indiquen el valor ADC del pin Ain2 i AIN6 respectivament. A la part dreta, també es mostren els valors de voltatge equivalents. Aquest valor hauria de ser igual al voltatge que apareix al pin AIN2 i AIN6 respectivament. Podem comprovar el mateix mitjançant un multímetre, també podem variar els potenciòmetres per comprovar si el valor de la tensió també canvia en conseqüència.

També es pot trobar un treball complet al vídeo següent. Espero que hagueu gaudit del tutorial i hàgiu après alguna cosa útil, si teniu cap pregunta, deixeu-los a la secció de comentaris a continuació. També podeu fer servir els nostres fòrums per iniciar un debat o publicar altres preguntes tècniques.
