home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Domanda lettura porta analogia arduino
     
Autore Messaggio opzioni
skylab





postato il:
29.07.2025, alle ore 12:46
Domanda lettura porta analogia arduino 

Buongiorno a tutti,

qualcuno mi può spiegare questo parte di codice di Arduino?

non capisco perchè il dato letto sull'ingresso digitale viene diviso per 32 e successivamente moltiplicato per (5.000 / 16368.000)

 // *********** Measure voltage *************
// measure voltage on an analog pin. We make 512 measures to reduce noise and errors
float GetVoltage(byte pin) {
              float voltage = 0.000;
              unsigned long analog_val = 0;
              int j;
              for (j = 1; j <= 512; j++) {
              //for (j = 1; j <= 1024; j++) {
                analog_val = analog_val + analogRead(pin);    // sensor on analog pin A1; 1024 measurements
              }
              analog_val = analog_val /32 ; // divide by 2 pow 5 = 32 to avoid next divide overflow
              voltage = analog_val;
              voltage = voltage * (5.000 / 16368.000) ; // 16384 = (1024*512)/32
              
              return voltage;  



Grazie a tutti per l'aiuto
ipervale





postato il:
30.07.2025, alle ore 07:25
Ciao skylab,

skylab:

... non capisco perchè il dato letto sull'ingresso digitale ...

normalmente quando si legge una tensione con un µC il relativo pin deputato
allo scopo viene configurato come ingresso dell'ADC: quindi è a tutti gli
effetti un ingresso analogico.

La risposta alla tua domanda è scritta nei commenti apposti nel codice:
vengono fatte 512 letture, questo valore diviso per 32 come primo step e
poi si ottiene il valore della singola misura dividendo il riferimento (5V)
con quello che resta da 512/32 ed il valore di risoluzione ADC (1024).

Il divisore dovrebbe essere 16384 (cioé 1024*512/32), ma l'autore del
codice divide per 16368 (1023*512/32).

Valentino
skylab





postato il:
30.07.2025, alle ore 08:22
Grazie Ipervale,

si ok, ma quello che non capisco è perchè si fa una divisione per 32 e successivamente si ricava il valore della tensione letta invece di ricavarla direttamente moltiplicando il valore letto dall'ADC per (5/1024)

che vantaggi porta questa procedura?

Grazie di nuovo
pippodue




una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli una ogni 10 livelli


postato il:
30.07.2025, alle ore 10:21
Non lo so ma posso presumere che, dovendo convertire un formato long in un formato float, si premuri di ridurre la lunghezza utilizzata del long entro i tradizionali 16 bit (per evitare overflow durante la conversione?).


anche i grandi uomini, come gli uomini comuni, possono talvolta cadere in errore (Voltaire)
ipervale





postato il:
30.07.2025, alle ore 15:30
Ciao skylab,

il motivo è scritto nel commento (come presume pippodue):

analog_val = analog_val /32 ; // divide by 2 pow 5 = 32 to avoid next divide overflow

L'autore del codice probabilmente non conosce bene il 'C'. E forse neanche la matematica.

Valentino
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 







 
 
indietro | homepage | torna su copyright © 2004/2026 GRIX.IT - La community dell'elettronica Amatoriale