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:
  1. 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.

  2. Aprire STM32CubeIDE e creare un nuovo progetto. Settare il clock alle impostazioni massime, seguendo il tutorial e generare il programma;
  3. 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.
  4.  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.

  5.  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.

  6. 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.

  7. 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;
La figura 6 mostra il codice finale, includendo la funzione di trasmissione dei dati al terminale UART2.
Figura 6: ciclo while(1).
codice copiabile:

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

Post popolari in questo blog

Conversione analogico - digitale (ADC) e digitale - analogico (DAC) con amplificatori operazionali

Tempo di propagazione nella logica pass-transistor - legge di Elmore (39)

Modello di Ebers & Moll delle correnti nel BJT - Guadagni di corrente (15)