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