Lettura dell'intensità luminosa con ADC (STM32xxxxxx)
Un semplice e rapido progetto di lettura analogica dell'intensità luminosa può essere realizzato con la scheda di sviluppo Nucleo della ST. La realizzazione di questo progetto richiede, oltre alla scheda nucleo, il fotoresistore e una resistenza da 1kΩ. Prima di partire con la realizzazione del firmware, è necessario creare l'ambiente hardware necessario alla lettura.
Attenzione: verificare la tensione di funzionamento del convertitore AD della scheda posseduta. La F401RE ha un ADC che lavora a 3.3 V, altre possono avere lo stesso elemento a 5 V.
Il progetto si svolge in questo modo:
- Creare il circuito di condizionamento necessario alla lettura del valore di intensità luminosa. Si pone in serie al fotoresistore LDR1 la resistenza R1, come mostrato in figura 1.
Figura 1: circuito di condizionamento del segnale. - Aprire STM32CubeIDE e creare un nuovo progetto. Settare il clock alle impostazioni massime, seguendo il tutorial e generare il programma;
- Dopo aver settato, nella finestra Pinout & Configuration -> Analog -> ADC1 l'ingresso per la conversione (es. IN0) come rappresentato in figura 2, e la configurazione della risoluzione dell'ADC (figura 3) e generare nuovamente il programma. Importare la funzione di lettura analogica ADC_Read(...) seguendo il tutorial necessario;
Figura 2:attivazione del canale IN0 ADC1. Figura 3: configurazione dell'ADC1. - si passa alla scrittura vera e propria del firmware. Se si intende configurare la lettura dei dati ottenuti tramite terminale TeraTerm, prima di scrivere il main.c seguire i passaggi del tutorial di comunicazione tramite terminale. Generare quindi il programma, con l'apposito pulsante "ingranaggio" nella barra superiore (figura 3B).
Figura 3B: generazione del programma. - nel file main.c includere due librerie standard del linguaggio C: #include <stdio.h> #include <string.h>, come mostrato in figura 4;
Figura 4: inclusione delle librerie C. - dichiarare all'interno della funzione int main(void) due elementi, uint16_t light per il valore dell'intensità luminosa, e char signal[24] per la "frase" da trasmettere a terminale contenente il valore dell'intensità lumonosa (figura 5). Per il suddetto valore, basta un intero a 16 bit senza segno (uint16_t appunto);
Figura 5: dichiarazione delle variabili. - Nel ciclo del programma, while(1), proseguire così: effettuare la lettura del valore analogico (con 10 bit di risoluzione, varia tra 0 e 1023). Poiché l'intensità luminosa viene rappresentata in percentuale, occorre dividere i 1024 valori possibili per 100: 1024/100 = 1.024. Allora può stabilirsi una relazione: 1024 : 100 = ADC_Val : light_val -> light_val = ADC_Val : 1.024. In virtù di ciò, viene effettuata la lettura e convertita secondo la relazione appena citata;
![]() |
Figura 6: ciclo while(1). |
uint16_t prevalue = (uint16_t)(ADC_Read(ADC_CHANNEL_0));
light_value = prevalue/1.024;
sprintf(signal, "Luminosità %d", light_value);
HAL_UART_Transmit(&huart2, (uint8_t*) signal, sizeof(signal), 10);
HAL_Delay(1000);
Commenti
Posta un commento