calcolo ADC - help

M

Maverickmax

Guest
Salve

Ho fatto un piccolo esperimento, come ottenere la lettura come la 920 dal canale ADC, quando la tensione di ingresso 680V.Poi ho ottenere il valore di - 82, quando la tensione è 0V.

920 - 680V
82 - 0V

Come convertire tra 920 e 82 in 680V e 0V rispettivamente per il mio codice?

Finora ho fatto un piccolo calcolo:

680/920 = 0,739

quindi 0,739 * 920 saranno rese 680V

ma quando cerco di calcolare 0,739 * 82 e mi aspetterei OV ma ho 60.6V

Così ho fatto summat sbagliato con il mio calcolo.Qualsiasi aiuto sarebbe appreicatedMaverickmax

 
Maverickmax ha scritto:

SalveHo fatto un piccolo esperimento, come ottenere la lettura come la 920 dal canale ADC, quando la tensione di ingresso 680V.
Poi ho ottenere il valore di - 82, quando la tensione è 0V.920 - 680V

82 - 0VCome convertire tra 920 e 82 in 680V e 0V rispettivamente per il mio codice?Finora ho fatto un piccolo calcolo:680/920 = 0,739quindi 0,739 * 920 saranno rese 680Vma quando cerco di calcolare 0,739 * 82 e mi aspetterei OV ma ho 60.6VCosì ho fatto summat sbagliato con il mio calcolo.
Qualsiasi aiuto sarebbe appreicatedMaverickmax
 
Si veda la risposta Echo47's.
Innanzitutto è necessario sottrarre l'offset (82), dalla lettura e poi dividere per la pendenza della caratteristica.

 
Salve

Quando ho chiesto l'equazione in i miei codici e testato e la maggior parte del tempo
Ho solo ottenere il 0V quando ho regolare resistore variabile avanti e indietro, ma a volte
I get 680V, ma non ottengo alcun lettura quando ho regolato il votlage tra
0V e 680V.

I escludere da 680 * Temp = (adc_result [6] -82) / (920-82) e ho scoperto che
Io ho soltanto la maggior parte degli 0 e 1 solo.

C'è qualcosa che forse si affacciano o si tratta summat sbagliato con il mio prototipo di funzione?

Codice:int Voltage_measurement (void)

(

int Temp;

Temp = 680 * ((adc_result [6] -82) / (920-82));

return Temp;

)

 
Io ancora non ha potuto ottenere qualsiasi lettura tra 680V e 0V, come io ho soltanto 0V e pochi 680V quando accendo il resistore variabile completa.

È che fare con il mio codice?

Maverick max

Lasciare presumere che adc_result [6] sarebbe 920, la temperatura sarebbe tornato 680 che va bene.Tuttavia il valore di meno di 920 fino a 1 che conduce a 0V.Perché?

Maverick Max

 
La formula è corretta.Sei sicuro che adc_result [6] è il valore corretto all'entrata?
Per eseguire il test, perché non modificare il codice per restituire semplicemente che il valore e vedere se cambia linearmente 82-920 come si variare la tensione.

Temp = adc_result [6]
return Temp

Questo dovrebbe restituire 82 ~ 920, in base alla tensione.
Se così non fosse, allora avete bisogno di cercare la routine di acquisizione, hardware, ecc

 
Salve

Per quanto riguarda la tua domanda, ho controllato molte volte come ho trovato la lettura di ottenere 82-920.

Ho un altro semplice test applicando 920 nell'equazione invece di utilizzare adc_result [6] è 920 e cambiare il mio codice per testare i miei calcoli:

Codice:

int Temp;

Temp = 680 * ((920-82) / (920-82));

return Temp;
 
Perché non si tenta in questo modo:

Codice:int Voltage_measurement (void)

(

int Temp;

Temp = 680 * (adc_result [6] -82) / (920-82);

return Temp;

)

 
Hi Silivo

Ho testato l'equazione: Temp = 680 * (N-82) / (920-82);

dove N è 920, 900, 500 etc

Il risultato non è quello che ho sempre cercato.

Non risolve il mio problema ....

<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Triste" border="0" />
 
Maverickmax ha scritto:Ho testato l'equazione: Temp = 680 * (N-82) / (920-82);dove N è 920, 900, 500 etcIl risultato non è quello che ho sempre cercato.Non risolve il mio problema ....
<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Triste" border="0" />
 
Su mia richiesta inital, ho bisogno di ottenere la lettura di ADC che vanno dal 920-82 e ho bisogno di convertire i 920 e 82 in 680V a 0V

Così

Ho seguito echo47 equazione come temp = 680 * ((adc_result [6] -82) / (920-82)), e io ho soltanto 680 quando il adc_result è 920, ma il numero 920 seguito fino a 83, dare 0.Questo non è ciò che realmente si aspettano, come ho bisogno di lettura, quando un valore compreso tra 919-83.Finora io non riuscivo a ferro il problema ancora out

MaverickMax

 
Compilatore che si utilizza per i quali micro?

Tenta in questo modo:

Codice:int Voltage_measurement (void)

(

int Temp;

Temp = (int) 680 * (adc_result [6] -82) / (920-82);

return Temp;

)

 
Im usando Keil e il microcontrollore è XC161

Come ho modificato il mio codice come da lei richiesto.

Secondo la mia calcolatrice, il risultato sarebbe di circa 307, ma purtroppo il risultato da codici rese -6

MaverickMax

 
OK modifica unsigned int

Codice:unsigned int Voltage_measurement (void)

(

unsigned int Temp;

Temp = (unsigned int) 680 * (adc_result [6] -82) / (920-82);

return Temp;

)
 
Qual è la lunghezza int del compilatore?

Proprio al fine di garantire che il bug anche compilatore non pregiudica la compilazione di codice come

volatile long int temp; / / (32 bit calcolo è un "must" come risultato può superare 0xffff)

temp = 680 * (adc_result [6] -82);

temp = temp / (920-82);e si può scalare la parte divisore per ottenere arrotondate risultato e tenere fonte di matematica galleggianti per raggiungere la precisione necessaria per il vostro compito.Quale compilatore usi e la sua versione?

 
Artem ha scritto:

(32 bit calcolo è un "must" come risultato può superare 0xffff)
 
Ho allegato il mio codice per voi ...

il compilatore - Keil uVision4 IDE

Maverickmax
Ci dispiace, ma è necessario il login per visitare questo allegato

 
Bascially non ho ottimizzato i codici e ho seguito la tua ..... istruzioni

Non è cambiato nulla

Maverick Max

 
a me sembra che qualcosa di sbagliato con l'input da ADC.Check it prima.

Codice:C: \ Borland \ progetti \ test2> bcc32-IC: \ Borland \ BCC55 \ Include \-LC: \ Borland \ BCC55 \ test.c Lib

Borland C 5.5.1 per Win32 Copyright (c) 1993, 2000 Borland

test.c:

Turbo incrementale 5,00 Link Copyright (c) 1997, 2000 BorlandC: \ Borland \ progetti \ test2> test

sizeof int 4

sizeof long int 4

dimensioni di short int 2

prova con 32 bit integer

risultato è 0

risultato è 16

risultato è 32

risultato è di 48

risultato è 64

risultato è 81

risultato è 97

risultato è 113

risultato è 129

risultato è 146

risultato è 162

risultato è 178

risultato è 194

risultato è 210

risultato è 227

risultato è 243

risultato è 259

risultato è 275

risultato è 292

risultato è 308

risultato è 324

risultato è 340

risultato è 357

risultato è 373

risultato è 389

risultato è 405

risultato è 421

risultato è 438

risultato è 454

risultato è 470

risultato è 486

risultato è 503

risultato è 519

risultato è 535

risultato è 551

risultato è 568

risultato è 584

risultato è 600

risultato è 616

risultato è 632

risultato è 649

risultato è 665

prova con 16 bit integer

risultato è 0

risultato è 16

risultato è 32

risultato è di 48

risultato è 64

risultato è 2

risultato è 19

risultato è 35

risultato è 51

risultato è 67

risultato è 5

risultato è 22

risultato è 38

risultato è di 54

risultato è 70

risultato è di 8

risultato è di 25

risultato è 41

risultato è 57

risultato è 73

risultato è 11

risultato è 27

risultato è 44

risultato è 60

risultato è 76

risultato è di 14

risultato è di 30

risultato è 47

risultato è 63

risultato è 1

risultato è 17

risultato è 33

risultato è 50

risultato è 66

risultato è di 4

risultato è di 20

risultato è di 36

risultato è 53

risultato è 69

risultato è 7

risultato è 23

risultato è 39C: \ Borland \ progetti \ test2> test.c tipo

# include <stdio.h>void main (void)

(

volatile unsigned long int temp;

volatile unsigned short int temp1;int tinta;printf ( "sizeof int% d \ n", sizeof (int));

printf ( "sizeof long int% d \ n", sizeof (long int));

printf ( "Dimensione di breve int% d \ n", sizeof (short int));puts ( "prova con 32 bit integer");for (tinta = 82; tinta <920; tinta = 20)

(

temp = 680 * (tinta-82);

temp = temp / (920-82);printf ( "risultato è% d \ n", temp);

)puts ( "prova con 16 bit integer");for (tinta = 82; tinta <920; tinta = 20)

(

temp1 = 680 * (tinta-82);

temp1 = temp1 / (920-82);printf ( "risultato è% d \ n", temp1);

))

 

Welcome to EDABoard.com

Sponsor

Back
Top