- Confronto tra ADC in Arduino e STM32F103C8
- ADC in STM32
- Come un segnale analogico viene convertito in formato digitale
- Perni ADC in STM32F103C8T6
- Componenti richiesti
- Schema del circuito e spiegazioni
- Programmazione di STM32 per la lettura dei valori ADC
Una caratteristica comune utilizzata in quasi tutte le applicazioni integrate è il modulo ADC (convertitore da analogico a digitale). Questi convertitori da analogico a digitale possono leggere la tensione da sensori analogici come sensore di temperatura, sensore di inclinazione, sensore di corrente, sensore di flessione e molto altro. Quindi in questo tutorial impareremo come utilizzare l'ADC in STM32F103C8 per leggere le tensioni analogiche utilizzando l'IDE di Energia. Vi interfacciare un piccolo potenziometro per pillola bordo STM32 blu e fornire una tensione variabile a un pin analogico, leggere la tensione e visualizzarlo sullo schermo LCD 16x2.
Confronto tra ADC in Arduino e STM32F103C8
Nella scheda Arduino, contiene un ADC a 6 canali (8 canali su Mini e Nano, 16 su Mega) a 10 bit con un intervallo di tensione di ingresso di 0V – 5V. Ciò significa che mapperà le tensioni di ingresso tra 0 e 5 volt in valori interi compresi tra 0 e 1023. Ora, nel caso di STM32F103C8, abbiamo 10 canali, ADC a 12 bit con un intervallo di ingresso 0V -3,3V. Mapperà le tensioni di ingresso tra 0 e 3,3 volt in valori interi compresi tra 0 e 4095.
ADC in STM32
L'ADC integrato nei microcontrollori STM32 utilizza il principio SAR (registro di approssimazione successiva), in base al quale la conversione viene eseguita in più passaggi. Il numero di passi di conversione è uguale al numero di bit nel convertitore ADC. Ogni passo è guidato dall'orologio dell'ADC. Ogni clock ADC produce un bit dal risultato all'output. Il design interno dell'ADC si basa sulla tecnica del condensatore commutato. Se non conosci STM32, dai un'occhiata al nostro tutorial Introduzione a STM32.
Risoluzione a 12 bit
Questo ADC è un ADC a 12 bit a 10 canali. Qui il termine 10 canali implica che ci sono 10 pin ADC con cui possiamo misurare la tensione analogica. Il termine 12 bit implica la risoluzione dell'ADC. 12 bit significa 2 alla potenza di dieci (2 12) che è 4096. Questo è il numero di passi campione per il nostro ADC, quindi la gamma dei nostri valori ADC sarà da 0 a 4095. Il valore aumenterà da 0 a 4095 in base al valore della tensione per passo, che può essere calcolato dalla formula
TENSIONE / PASSO = TENSIONE DI RIFERIMENTO / 4096 = (3,3 / 4096 = 8,056 mV) per unità.
Come un segnale analogico viene convertito in formato digitale
Poiché i computer memorizzano ed elaborano solo valori binari / digitali (1 e 0). Quindi i segnali analogici come l'uscita del sensore in volt devono essere convertiti in valori digitali per l'elaborazione e la conversione deve essere accurata. Quando una tensione analogica di ingresso viene fornita a STM32 ai suoi ingressi analogici, il valore analogico viene letto e memorizzato in una variabile intera. Il valore analogico memorizzato (0-3,3 V) viene convertito in valori interi (0-4096) utilizzando la formula seguente:
TENSIONE DI INGRESSO = (Valore ADC / Risoluzione ADC) * Tensione di riferimento
Risoluzione = 4096
Riferimento = 3,3 V.
Perni ADC in STM32F103C8T6
Ci sono 10 pin analogici in STM32 da PA0 a PB1.
Controlla anche come utilizzare ADC in altri microcontrollori:
- Come utilizzare ADC in Arduino Uno?
- Interfacciamento ADC0808 con Microcontrollore 8051
- Utilizzo del modulo ADC del microcontrollore PIC
- Tutorial ADC Raspberry Pi
- Come utilizzare l'ADC in MSP430G2 - Misurazione della tensione analogica
Componenti richiesti
- STM32F103C8
- LCD 16 * 2
- Potenziometro 100k
- Breadboard
- Cavi di collegamento
Schema del circuito e spiegazioni
Di seguito è mostrato lo schema del circuito per interfacciare LCD 16 * 2 e ingresso analogico a una scheda STM32F103C8T6.
Di seguito sono riportati i collegamenti effettuati per l'LCD:
N. pin LCD |
Nome pin LCD |
Nome pin STM32 |
1 |
Terra (Gnd) |
Terra (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dal centro del potenziometro |
4 |
Seleziona registro (RS) |
PB11 |
5 |
Lettura / scrittura (RW) |
Terra (G) |
6 |
Abilita (EN) |
PB10 |
7 |
Bit di dati 0 (DB0) |
Nessuna connessione (NC) |
8 |
Bit di dati 1 (DB1) |
Nessuna connessione (NC) |
9 |
Bit di dati 2 (DB2) |
Nessuna connessione (NC) |
10 |
Bit di dati 3 (DB3) |
Nessuna connessione (NC) |
11 |
Bit di dati 4 (DB4) |
PB0 |
12 |
Bit di dati 5 (DB5) |
PB1 |
13 |
Bit di dati 6 (DB6) |
PC13 |
14 |
Bit di dati 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
16 |
LED negativo |
Terra (G) |
I collegamenti vengono effettuati secondo la tabella sopra riportata. Ci sono due potenziometri presenti nel circuito, il primo è utilizzato per il partitore di tensione che può essere utilizzato per variare la tensione e fornire un ingresso analogico a STM32. Il pin sinistro di questo potenziometro riceve la tensione positiva in ingresso da STM32 (3,3 V) e il pin destro è collegato a massa, il pin centrale del potenziometro è collegato al pin di ingresso analogico (PA7) di STM32. L'altro potenziometro viene utilizzato per variare il contrasto del display LCD. La fonte di alimentazione per STM32 è fornita tramite alimentazione USB da un PC o laptop.
Programmazione di STM32 per la lettura dei valori ADC
Nel nostro tutorial precedente, abbiamo imparato a programmare la scheda STM32F103C8T6 utilizzando la porta USB. Quindi non abbiamo bisogno di un programmatore FTDI ora. Basta collegarlo al PC tramite la porta USB di STM32 e avviare la programmazione con ARDUINO IDE. Programmare il tuo STM32 in ARDUINO IDE per leggere la tensione analogica è molto semplice. È lo stesso della scheda Arduino. Non è necessario modificare i pin jumper di STM32.
In questo programma leggerà il valore analogico e calcolerà la tensione con quel valore e quindi visualizzerà entrambi i valori, analogici e digitali, sullo schermo LCD.
Per prima cosa definire i pin LCD. Questi definiscono a quale pin dell'STM32 sono collegati i pin LCD. Puoi modificare secondo le tue esigenze.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // menziona i nomi dei pin a cui LCD è connesso
Successivamente, includiamo il file di intestazione per il display LCD. Ciò chiama la libreria che contiene il codice per come l'STM32 dovrebbe comunicare con l'LCD. Assicurati inoltre che la funzione Liquid Crystal venga chiamata con i nomi dei pin che abbiamo appena definito sopra.
#includere
All'interno della funzione setup () , diamo solo un messaggio di introduzione da visualizzare sullo schermo LCD. Puoi imparare come interfacciare LCD con STM32.
lcd.begin (16, 2); // Stiamo usando un LCD 16 * 2 lcd.clear (); // Cancella lo schermo lcd.setCursor (0, 0); // Nella prima riga prima colonna lcd.prin t ("CIRCUITDIGEST"); // Stampa questo lcd.setCursor (0, 1); // Alla seconda riga, prima colonna n lcd.print ("STM32F103C8"); // Stampa Thi s di ritardo (2000); // aspetta due secondi lcd.clear (); // Cancella lo schermo lcd.setCursor (0, 0); // Nella prima riga della prima colonna lcd.print ("USING ADC IN"); // Print this lcd.setCursor (0,1); // Alla seconda riga della prima colonna lcd.print ("STM32F103C8"); // Stampa questo ritardo (2000); // aspetta due secondi lcd.clear (); // Cancella lo schermo
Infine, all'interno della nostra funzione loop infinito () , iniziamo a leggere la tensione analogica fornita al pin PA7 dal potenziometro. Come abbiamo già discusso, il microcontrollore è un dispositivo digitale e non può leggere direttamente il livello di tensione. Utilizzando la tecnica SAR il livello di tensione viene mappato da 0 a 4096. Questi valori sono chiamati valori ADC, per ottenere questo valore ADC è sufficiente utilizzare la riga seguente
int val = analogRead (A7); // legge il valore ADC dal pin PA 7
Qui la funzione analogRead () viene utilizzata per leggere il valore analogico del pin. Infine salviamo questo valore in una variabile chiamata “ val ”. Il tipo di questa variabile è intero perché otterremo solo valori compresi tra 0 e 4096 da memorizzare in questa variabile.
Il prossimo passo sarebbe calcolare il valore di tensione dal valore ADC. Per fare questo abbiamo le seguenti formule
Tensione = (ADC Valore / ADC risoluzione) * Voltag di riferimento e
Nel nostro caso sappiamo già che la risoluzione ADC del nostro microcontrollore è 4096. Il valore ADC si trova anche nella riga precedente e memorizza la variabile chiamata val. La tensione di riferimento è uguale alla tensione alla quale funziona il microcontrollore. Quando la scheda STM32 è alimentato tramite cavo USB quindi la tensione di funzionamento è 3.3V. È inoltre possibile misurare la tensione di esercizio utilizzando un multimetro tra il Vcc e il pin di terra sulla scheda. Quindi la formula sopra si adatta al nostro caso come mostrato di seguito
tensione flottante = (float (val) / 4096) * 3,3; // formule per convertire il valore ADC per voltag e
Potresti essere confuso con la riga float (val). Viene utilizzato per convertire la variabile "val" dal tipo di dati int al tipo di dati "float". Questa conversione è necessaria perché solo se otteniamo il risultato di val / 4096 in float possiamo moltiplicarlo 3.3. Se il valore viene ricevuto in numero intero sarà sempre 0 e anche il risultato sarà zero. Una volta calcolato il valore e la tensione dell'ADC, non resta che visualizzare il risultato sullo schermo LCD che può essere fatto utilizzando le seguenti righe
lcd.setCursor (0, 0); // imposta il cursore sulla colonna 0, riga 0 lcd.print ("ADC Val:"); lcd.print (val); // Visualizza il valore ADC lcd.setCursor (0, 1); // imposta il cursore sulla colonna 0, riga 1 lcd.print ("Voltage:"); lcd.print (voltaggio); // Visualizza la tensione
Di seguito vengono forniti il codice completo e il video dimostrativo.