ADC beregning - hjelp

M

Maverickmax

Guest
Hei

Jeg har gjort et lite eksperiment som jeg får lest som 920 fra ADC kanalen når spenningen er 680V.Så jeg får verdien - 82 når spenningen er 0V.

920 - 680V
82 - 0V

Hvor å konvertere mellom 920 og 82 til 680V og 0V henholdsvis koden min?

Så langt har jeg gjort et lite regnestykke:

680/920 = 0,739

slik 0,739 * 920, vil rentene 680V

men når jeg prøver å beregne 0,739 * 82 og jeg forventer OV men jeg får 60.6V

Så jeg har gjort summat galt med regnestykket.Eventuelle hjelpe ville være appreicatedMaverickmax

 
Maverickmax skrev:

HeiJeg har gjort et lite eksperiment som jeg får lest som 920 fra ADC kanalen når spenningen er 680V.
Så jeg får verdien - 82 når spenningen er 0V.920 - 680V

82 - 0VHvor å konvertere mellom 920 og 82 til 680V og 0V henholdsvis koden min?Så langt har jeg gjort et lite regnestykke:680/920 = 0,739slik 0,739 * 920, vil rentene 680Vmen når jeg prøver å beregne 0,739 * 82 og jeg forventer OV men jeg får 60.6VSå jeg har gjort summat galt med regnestykket.
Eventuelle hjelpe ville være appreicatedMaverickmax
 
Se Echo47 svar.
Du må først trekke forskyvningen (82) fra lesing og deretter deler av skråningen av de karakteristiske.

 
Hei

Da jeg søkte på ligningen i mine koder og testet den og det meste av tiden
Jeg får bare de 0V når jeg justerer variabel motstand frem og tilbake, men en gang
Jeg får 680V, men jeg får ikke noe å lese når jeg justerte votlage mellom
0V og 680V.

Jeg utelukker 680 * fra Temp = (adc_result [6] -82) / (920-82) og jeg fant ut at
Jeg får bare det meste av 0 og 1. bare.

Er det noe som jeg kanskje overser eller er det summat galt med min funksjon prototype?

Code:int Voltage_measurement (void)

(

int Temp;

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

return Temp;

)

 
Jeg kan fortsatt ikke kunne få noe å lese mellom 680V og 0V så jeg får bare 0V og få 680V når jeg slår den variable motstanden til fulle.

Er det gjøre med koden min?

Maverick max

La oss anta at adc_result [6] ville være 920, ville temp returnere 680 som er greit.Men verdien mindre enn 920 ned til 1 som gir 0V.Hvorfor det?

Maverick Max

 
Formelen er riktig.Er du sikker på at adc_result [6] er den riktige verdien ved oppføring?
For å teste, hvorfor ikke endre koden for å bare komme tilbake som verdi og se om det endrer seg lineært 82 til 920 som du variere spenningen.

Temp = adc_result [6]
return Temp

Dette bør returnere 82 ~ 920, avhengig av spenning.
Hvis ikke, må du sjekke oppkjøpet rutine, maskinvare, etc.

 
Hei

I forhold til spørsmålet ditt, jeg har sjekket det mange ganger som jeg får lese 82-920.

Jeg har en enkel test ved å bruke 920 i ligningen i stedet for å bruke adc_result [6] er 920 og endre koden min for å teste min beregning:

Code:

int Temp;

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

return Temp;
 
Hvorfor ikke prøve denne måten:

Code:int Voltage_measurement (void)

(

int Temp;

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

return Temp;

)

 
Hei Silivo

Jeg har testet ligningen: Temp = 680 * (N-82) / (920-82);

der N er 920, 900, 500 osv.

Resultatet er ikke det jeg har vært på jakt etter.

Det løser ikke problemet ....

<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Trist" border="0" />
 
Maverickmax skrev:Jeg har testet ligningen: Temp = 680 * (N-82) / (920-82);der N er 920, 900, 500 osv.Resultatet er ikke det jeg har vært på jakt etter.Det løser ikke problemet ....
<img src="http://www.edaboard.com/images/smiles/icon_sad.gif" alt="Trist" border="0" />
 
On my inital forespørsel, må jeg få lese fra ADC alt 920 til 82, så jeg trenger for å konvertere 920 og 82 til 680V til 0V



Jeg fulgte echo47 likning for eksempel temp = 680 * ((adc_result [6] -82) / (920-82)), og jeg får bare 680 når adc_result er 920, men nedenfor 920 ned til 83, gir 0.Dette er ikke det jeg forventer når jeg trenger å lese når noen verdi mellom 919-83.Så langt jeg kunne ikke klare å jern problemet ute ennå

MaverickMax

 
Hvilken kompilatoren du bruker som micro?

Prøv denne måten:

Code:int Voltage_measurement (void)

(

int Temp;

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

return Temp;

)

 
Im benytter Keil og microcontroller er XC161

Som jeg har endret koden min som du ba om.

Ifølge kalkulatoren min, ville resultatet bli om lag 307, men dessverre resultatet fra kodene gir -6

MaverickMax

 
OK endre til unsigned int

Code:unsigned int Voltage_measurement (void)

(

unsigned int Temp;

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

return Temp;

)
 
Hva er int lengde kompilatoren din?

Bare for å sikre at selv kompilatoren bug påvirker ikke kompilere koden som

volatile long int temp; / / (32 biter beregningen er et must så resultatet kan overskride 0xFFFF)

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

temp = temp / (920-82);og du kan skalere divisoren del for å få unrounded resultat og holde kilde ut av flytende matematikk for å oppnå nødvendig presisjon for oppgaven din.Hva kompilatoren bruker du og dens versjonsnummer?

 
Artem skrev:

(32 bits kalkulasjon er et must så resultatet kan overskride 0xFFFF)
 
Jeg har lagt min kode for deg ...

kompilatoren - uVision4 Keil IDE

Maverickmax
Beklager, men du må logge inn for å vise dette vedlegget

 
Bascially jeg ikke har optimalisert koder og jeg fulgte dine instruksjoner .....

Ingenting forandret

Maverick Max

 
for meg virker det som noe galt med innspill fra ADC.Sjekk det først.

Code:C: \ Borland \ prosjekter \ test2> bcc32-IC: \ Borland \ BCC55 \ Inkluder \-LC: \ Borland \ BCC55 \ Lib test.c

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

test.c:

Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 BorlandC: \ Borland \ prosjekter \ test2> test

sizeof int 4

sizeof long int 4

Størrelsen på korte int 2

test med 32 bits heltall

Resultatet er 0

Resultatet er 16

Resultatet er 32

Resultatet er 48

Resultatet er 64

Resultatet er 81

Resultatet er 97

Resultatet er 113

Resultatet er 129

Resultatet er 146

Resultatet er 162

Resultatet er 178

Resultatet er 194

Resultatet er 210

Resultatet er 227

Resultatet er 243

Resultatet er 259

Resultatet er 275

Resultatet er 292

Resultatet er 308

Resultatet er 324

Resultatet er 340

Resultatet er 357

Resultatet er 373

Resultatet er 389

Resultatet er 405

Resultatet er 421

Resultatet er 438

Resultatet er 454

Resultatet er 470

Resultatet er 486

Resultatet er 503

Resultatet er 519

Resultatet er 535

Resultatet er 551

Resultatet er 568

Resultatet er 584

Resultatet er 600

Resultatet er 616

Resultatet er 632

Resultatet er 649

Resultatet er 665

test med 16-bits heltall

Resultatet er 0

Resultatet er 16

Resultatet er 32

Resultatet er 48

Resultatet er 64

Resultatet er 2

Resultatet er 19

Resultatet er 35

Resultatet er 51

Resultatet er 67

Resultatet er 5

Resultatet er 22

Resultatet er 38

Resultatet er 54

Resultatet er 70

Resultatet er 8

Resultatet er 25

Resultatet er 41

Resultatet er 57

Resultatet er 73

Resultatet er 11

Resultatet er 27

Resultatet er 44

Resultatet er 60

Resultatet er 76

Resultatet er 14

Resultatet er 30

Resultatet er 47

Resultatet er 63

Resultatet er 1

Resultatet er 17

Resultatet er 33

Resultatet er 50

Resultatet er 66

Resultatet er 4

Resultatet er 20

Resultatet er 36

Resultatet er 53

Resultatet er 69

Resultatet er 7

Resultatet er 23

Resultatet er 39C: \ Borland \ prosjekter \ test2> type test.c

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

(

volatile unsigned long int temp;

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

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

printf ( "size of short int% d \ n", sizeof (short int));sier ( "test med 32 bits heltall");for (tint = 82; tint <920; tint = 20)

(

temp = 680 * (tint-82);

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

)sier ( "test med 16 bits heltall");for (tint = 82; tint <920; tint = 20)

(

temp1 = 680 * (tint-82);

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

))

 

Welcome to EDABoard.com

Sponsor

Back
Top