- Materiali richiesti
- ADC su STM8S103F3P6
- Schema del circuito per leggere i valori ADC su STM8S e display su LCD
- Libreria ADC per STM8S103F3P6
- Programma STM8S per leggere la tensione analogica e visualizzare sul display LCD
- Lettura della tensione analogica da due potenziometri utilizzando STM8S
Se sei un lettore regolare che sta seguendo i nostri tutorial sul microcontrollore STM8S, saprai che nel nostro ultimo tutorial abbiamo imparato come interfacciare un LCD 16x2 con STM8. Ora, procedendo con questo tutorial, impareremo come utilizzare la funzione ADC sul nostro microcontrollore STM8S103F3P6. Un ADC è una periferica molto utile su un microcontrollore che viene spesso utilizzata dai programmatori integrati per misurare unità che sono in costante cambiamento come la variazione di tensione, corrente, temperatura, umidità, ecc.
Come sappiamo, "Viviamo in un mondo analogico con dispositivi digitali", il che significa che tutto ciò che ci circonda come la velocità del vento, l'intensità della luce, la temperatura e tutto ciò che trattiamo come velocità, velocità, pressione, ecc. Sono di natura analogica. Ma i nostri microcontrollori e microprocessori sono dispositivi digitali e non saranno in grado di misurare questi parametri senza un'importante periferica chiamata Convertitori da analogico a digitale (ADC). Quindi, in questo articolo, impariamo come utilizzare ADC sul microcontrollore STM8S con il compilatore COMIC C.
Materiali richiesti
In questo articolo, leggeremo due valori di tensione analogica da due potenziometri e visualizzeremo il suo valore ADC su un display LCD 16x2. Per fare ciò, avremo bisogno dei seguenti componenti.
- Scheda di sviluppo STM8S103F3P6
- Programmatore ST-Link V2
- LCD 16x2
- Potenziometri
- Cavi di collegamento
- Resistenza da 1k
ADC su STM8S103F3P6
Esistono molti tipi di ADC e ogni microcontrollore ha le proprie specifiche. Su STM8S103F3P6, abbiamo un ADC con 5 canali e risoluzione a 10 bit; con una risoluzione di 10 bit, saremo in grado di misurare il valore digitale da 0 a 1024 e un ADC a 5 canali indica che abbiamo 5 pin sul microcontrollore che può supportare ADC, questi 5 pin sono evidenziati nell'immagine sotto.
Come puoi vedere, tutti questi cinque pin (AIN2, AIN3, AIN4, AIN5 e AIN6) sono multiplexati con altre periferiche, il che significa che oltre a fungere da pin ADC, questi pin possono essere utilizzati anche per eseguire altre comunicazioni come ad esempio, i pin 2 e 3 (AIN5 e AIN 6) non possono essere utilizzati solo per ADC, ma possono essere utilizzati anche per la comunicazione seriale e le funzioni GPIO. Tieni presente che non sarà possibile utilizzare lo stesso pin per tutti e tre gli scopi, quindi se stiamo usando questi due pin per ADC, non saremo in grado di eseguire la comunicazione seriale. Altre importanti caratteristiche dell'ADC per STM8S103P36 possono essere trovate nella tabella sottostante tratta dal datasheet.
Nella tabella sopra, Vdd rappresenta la tensione di esercizio e Vss rappresenta la massa. Quindi nel nostro caso sulla nostra scheda di sviluppo, abbiamo il microcontrollore che funziona a 3,3 V, puoi controllare lo schema del circuito della scheda di sviluppo dall'inizio con il tutorial STM8S. Con 3,3 V come tensione operativa, la nostra frequenza di clock ADC può essere impostata tra 1 e 4 MHz e il nostro intervallo di tensione di conversione è compreso tra 0 V e 3,3 V. Ciò significa che il nostro ADC a 10 bit leggerà 0 quando viene fornito 0V (Vss) e leggerà un massimo di 1024 quando viene fornito 3,3 V (Vdd). Possiamo facilmente cambiare questo 0-5V cambiando la tensione operativa dell'MCU, se necessario.
Schema del circuito per leggere i valori ADC su STM8S e display su LCD
Lo schema circuitale completo utilizzato in questo progetto è riportato di seguito, è molto simile al tutorial LCD STM8S di cui abbiamo discusso in precedenza.
Come puoi vedere, gli unici componenti aggiuntivi oltre all'LCD sono due potenziometri POT_1 e POT_2 . Questi potenziometri sono collegati alle porte PC4 e PD6, che sono i pin ANI2 e ANI6 come discusso in precedenza nell'immagine di pinout.
I potenziometri sono collegati in modo tale che quando lo cambiamo, otterremo 0-5 V sui nostri pin analogici. Programmeremo il nostro controller per leggere questa tensione analogica in valore digitale (da 0 a 1024) e visualizzarla sullo schermo LCD. Quindi calcoleremo anche il valore di tensione equivalente e lo visualizzeremo sull'LCD, ricorda che il nostro controller è alimentato a 3,3 V, quindi anche se forniamo 5 V al pin ADC, sarà in grado di leggere solo da 0 V a 3,3 V.
Una volta effettuate le connessioni, il mio hardware avrà questo aspetto come mostrato di seguito. Puoi vedere i due potenziometri a destra e il programmatore ST-link a sinistra.
Libreria ADC per STM8S103F3P6
Per programmare le funzionalità ADC su STM8S, utilizzeremo il compilatore Cosmic C insieme alle librerie SPL. Ma per rendere i processi più semplici, ho creato un altro file di intestazione che può essere trovato su GitHub con il collegamento sottostante.
Libreria ADC per STM8S103F3P6
Se sai cosa stai facendo, puoi creare un file di intestazione utilizzando il codice sopra e aggiungerlo alla directory "include file" nella pagina del tuo progetto. Altrimenti, segui le istruzioni per iniziare con il tutorial STM8S per sapere come configurare il tuo ambiente di programmazione e il compilatore. Una volta che la configurazione è pronta, il tuo IDE dovrebbe avere i seguenti file di intestazione, almeno quelli cerchiati in rosso.
Il file di intestazione sopra è costituito da una funzione chiamata ADC_Read () . Questa funzione può essere chiamata nel programma principale per ottenere il valore ADC su qualsiasi pin. Ad esempio, ADC_Read (AN2) restituirà il valore ADC sul pin AN2 come risultato. La funzione è mostrata di seguito.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int risultato = 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 (); while (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); risultato = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Come puoi vedere, possiamo passare otto parametri a questa funzione e questo definisce come è configurato l'ADC. Nel codice della nostra libreria sopra, abbiamo impostato la modalità di conversione su continua e quindi il numero del canale ha passato un parametro. E poi dobbiamo impostare la frequenza della CPU del nostro controller, di default (se non hai collegato un cristallo esterno), il tuo STM8S funzionerà con un oscillatore interno da 16 Mhz. Quindi abbiamo menzionato " ADC1_PRESSEL_FCPU_D18 " come valore pre-scaler. All'interno di questa funzione, stiamo utilizzando altri metodi definiti dal file di intestazione SPL stm8s_adc1.h . Iniziamo de-inizializzando i pin dell'ADC e quindi ADC1_Init () per inizializzare la periferica ADC. La definizione di questa funzione dal manuale utente SPL è mostrata di seguito.
Successivamente, impostiamo il trigger esterno utilizzando un timer e disabilitiamo il trigger esterno poiché non lo useremo qui. E poi abbiamo l'allineamento impostato a destra e gli ultimi due parametri sono usati per impostare il trigger di Schmitt, ma lo disabiliteremo per questo tutorial. Quindi, per farla breve, il nostro ADC funzionerà in modalità di conversione continua sul pin ADC richiesto con trigger esterno e trigger di Schmitt disabilitati. Puoi controllare la scheda tecnica se hai bisogno di maggiori informazioni su come utilizzare il trigger esterno o l'opzione trigger di Schmitt, non ne parleremo in questo tutorial.
Programma STM8S per leggere la tensione analogica e visualizzare sul display LCD
Il codice completo utilizzato nel file main.c si trova in fondo a questa pagina. Dopo aver aggiunto i file di intestazione e di origine richiesti, dovresti essere in grado di compilare direttamente il file principale. La spiegazione del codice nel file principale è la seguente. Non spiegherò il programma LCD STM8S poiché ne abbiamo già discusso nel tutorial precedente.
Lo scopo del codice sarà leggere i valori ADC da due pin e convertirli in un valore di tensione. Visualizzeremo anche il valore ADC e il valore di tensione sull'LCD. Quindi, ho usato una funzione chiamata LCD_Print Var che prende una variabile in formato intero e la converte in un carattere in modo da visualizzarla sull'LCD. Abbiamo utilizzato gli operatori modulo semplice (%) e divide (/) per ottenere ogni cifra dalla variabile e inserire variabili come d1, d2, d3 e d4 come mostrato di seguito. Quindi possiamo usare la funzione LCD_Print_Char per visualizzare questi caratteri sull'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); }
Successivamente, sotto la funzione principale, abbiamo quattro variabili dichiarate. Due di questi vengono utilizzati per salvare il valore ADC (da 0 a 1024) e gli altri due vengono utilizzati per ottenere il valore di tensione effettivo.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Successivamente, dobbiamo preparare i pin GPIO e la configurazione dell'orologio per leggere la tensione analogica. Qui leggeremo la tensione analogica dai pin AIN2 e AIN6 che sono rispettivamente i pin PC4 e PD6. Dobbiamo definire questi pin in uno stato fluttuante come mostrato di seguito. Abiliteremo anche la periferica clock per ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Abilita l'orologio periferico per ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Ora che i pin sono pronti, dobbiamo entrare nel ciclo while infinito per leggere la tensione analogica. Poiché abbiamo il nostro file di intestazione, possiamo facilmente leggere la tensione analogica dai pin AIN2 e AIN 6 utilizzando le righe seguenti.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Il passaggio successivo consiste nel convertire questa lettura ADC (da 0 a 1023) in una tensione analogica. In questo modo, possiamo visualizzare il valore esatto di tensione dato ai pin AIN2 e AIN6. Le formule per calcolare la tensione analogica possono essere fornite da:
Tensione analogica = lettura ADC * (3300/1023)
Nel nostro caso sui controller STM8S103F3, abbiamo un ADC con risoluzione a 10 bit, quindi abbiamo usato 1023 (2 ^ 10) . Anche sul nostro sviluppo alimenta il controller con 3,3 V che è 3300, quindi abbiamo diviso 3300 per 1023 nelle formule sopra. Circa 3300/1023 ci daranno 3.226, quindi nel nostro programma abbiamo le seguenti linee per misurare la tensione effettiva dell'ADC utilizzando la tensione dell'ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) converte il valore ADC 1 in 0 in 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // converte il valore ADC da 1 a 0 in 3300mV
La parte restante del codice viene utilizzata solo per visualizzare questi quattro valori sullo schermo LCD. Abbiamo anche un ritardo di 500 ms in modo che il display LCD venga aggiornato ogni 500 ms. Puoi ridurlo ulteriormente se hai bisogno di aggiornamenti più veloci.
Lettura della tensione analogica da due potenziometri utilizzando STM8S
Compila il codice e caricalo sulla tua scheda di sviluppo. Se si verifica un errore di compilazione, assicurarsi di aver aggiunto tutti i file di intestazione e di origine come discusso in precedenza. Una volta che il codice è stato caricato, dovresti vedere un piccolo messaggio di benvenuto che dice "ADC su STM8S" e quindi dovresti vedere la schermata seguente.
I valori D1 e D2 indicano rispettivamente il valore ADC dal pin Ain2 e AIN6. Sul lato destro abbiamo anche i valori di tensione equivalenti visualizzati. Questo valore dovrebbe essere uguale alla tensione che appare rispettivamente sui pin AIN2 e AIN6. Possiamo verificare lo stesso utilizzando un multimetro, possiamo anche variare i potenziometri per verificare se anche il valore della tensione cambia di conseguenza.
La lavorazione completa si trova anche nel video qui sotto. Spero che il tutorial ti sia piaciuto e abbia imparato qualcosa di utile, se hai domande, lasciale nella sezione commenti qui sotto. Puoi anche utilizzare i nostri forum per avviare una discussione o pubblicare altre domande tecniche.