ADC räkna ut binärt tal?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

ADC räkna ut binärt tal?

Inlägg av kvaark »

om man ska räkna ut ett binärt tal på en 10 bitars ad omvandlare som är kopplad till 5v

delar man då 1024 med 5000mv och multipliserar det värdet med säg 1500mv = 307.2 = b100110011
eller är jag helt fel ute?
eqlazer
Inlägg: 923
Blev medlem: 22 september 2007, 13:53:45
Ort: Göteborg

Re: ADC räkna ut binärt tal?

Inlägg av eqlazer »

Va? Har du en 10-bitars ADC med referensen 5V?

Om så är fallet så motsvarar varje steg 5V/1024=4.88mV. Så om du vid en omvandling skulle få resultatet 326 motsvarar det 326*4.88mV=1.59V på ADC-ingången.
Sen om man räknar binärt eller decimalt kvittar ju.
Användarvisningsbild
AndLi
Inlägg: 18296
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: ADC räkna ut binärt tal?

Inlägg av AndLi »

kvaark: Ja det är som sagt bara två sätt att presentera samma värde (eller nästan samma då det avrundas från 307.2 till 307)
Men oftare tycker jag att man ser det presenterad i hexadecimalt (0x133) men det är ju fortafarande samma värde som motsvarar dina 1500mV in.
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: ADC räkna ut binärt tal?

Inlägg av kvaark »

Ok om jag säger såhär då!!

Det jag vill kommafram till är hur jag matematikt räknr utt vilket tal ad omvandlaren får fram om det är 1,5v på ad-pinnen!!

Ska bli en temp mätare som startar på en angiven temp!
Användarvisningsbild
Klas-Kenny
Inlägg: 11843
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: ADC räkna ut binärt tal?

Inlägg av Klas-Kenny »

Med 5V referens och 10bit ADC blir det som eqlazer skrev, varje "steg" eller nummer, är 4,88mV.

Så 1,5V blir då 1500/4,88 = ~307, eller binärt 0100110011

Edit: Så ja, du räknade rätt... :)
Användarvisningsbild
AndLi
Inlägg: 18296
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: ADC räkna ut binärt tal?

Inlägg av AndLi »

Men det har du ju redan gjort... Du kom ju själv fram till 307?

1024/5*1.5 = 307.2 eller vill du ha ett sätt som inte använder flyttal?
Vill du räkna fram värdet för en annan spänning är det bara att byta 1.5 till det värde du nu råkar ha...

edit: för långsam, jag tror inte vi fattar frågan...
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: ADC räkna ut binärt tal?

Inlägg av kvaark »

Frågan va helt änkelt om jag hadde tänkt rätt! Och det hadde jag ju då!!
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ADC räkna ut binärt tal?

Inlägg av jesse »

Vill du ha ut ett tal som motsvarar spänningen i millivolt så kan du räkna så här:

Kod: Markera allt

uint16_t  ADC //  data in från ADC , värde 0-1023.
uint16_t volt //  värde i millivolt 0 - 5000

volt = (((uint32_t)ADC*5000)+512) >> 10;
// avrundar till närmaste hela millivolt

I en processor är det sedan lätt att skriva ut värdet i decimalform på vanligt sätt. Vill man ange värdet i volt i stället för millivolt sätter man bara en punkt efter första siffran...
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: ADC räkna ut binärt tal?

Inlägg av kvaark »

vad är det där skrivet i för språk då fattar nada :D

kan bara asseembly
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46998
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: ADC räkna ut binärt tal?

Inlägg av TomasL »

C, men jag skulle nog valt en annan algoritm, för att slippa multiplikationen.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ADC räkna ut binärt tal?

Inlägg av jesse »

som t,ex?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ADC räkna ut binärt tal?

Inlägg av jesse »

Orkade inte skriva i assembler, då det blir ganska mycket kod, om man inte har färdiga rutiner för hantering av 32 bitars tal.

Men man kan översätta C-koden till följande:

multiplicera ADC-resultatet med 5000 (och du får ett tre bytes långt tal)
addera 512 (för att avrunda till närmaste heltal).
rotera 10 bitar åt höger. (vilket innebär division med 1024)
Detta kan du göra i assembler genom att skippa den lägsta byten och rotera de övriga två bitar åt höger.
du har nu ett 16-bitars resultat i millivolt.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: ADC räkna ut binärt tal?

Inlägg av bearing »

Eftersom att både 5000 och 512 är jämnt delbara med 4 går det att förenkla till volt = (((uint32_t)ADC * 1250) + 128) >> 8;. Skiftning 8-bitar till höger går snabbt eftersom att det innebär att då två mittersta bytesen av högerledets 32-bitars-produkt kopieras rakt in i volt.

Ifall det inte gör något att 1V beräknas till 1024mV går det ju att helt enkelt multiplicera med 5, vilket görs med shiftning och addition.

Kod: Markera allt

volt = ADC;  /* volt = ADC*1 */
volt <<= 2;  /* volt = ADC*4 */
volt += ADC; /* volt = ADC*5 */
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: ADC räkna ut binärt tal?

Inlägg av kvaark »

Ok så om jag bygger ihop en opamp som gör så att 2,5v motsvarar 41 grader och 0v -10
Linjär kurva 0,5 volt/grad
Kopplar till 8 bitars adc med reffirensv på 2,5v

Då kommer jag att få 5 tal för varge grad?
Detta vill jag visa på 2x7segments display i heltal!!

Jag programerar i assembly

Ska ag skriva två tabeller en för tiotal och en för entala 255 värden vardera?

Eller fins det något vättigare sätt att göra detta på?
Hoppas någon förstår vad jag är ute och fiskar efter!?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: ADC räkna ut binärt tal?

Inlägg av sodjan »

> Då kommer jag att få 5 tal för varge grad?

Du menar att du får ett binärt tal med upplösningen 0.2 grad C ?
Kan du inte justera opampen o.s.v så att du får 4 "steg" per grad C ?
D.v.s en upplösning på 0.25 grad C. Det blir mycket enklare att hantera.

> Detta vill jag visa på 2x7segments display i heltal!!

Om du har 4 steg per grad C så är det bara att först "kasta"
de två lägsta bitarna (2 steg höger shift). Det du nu har är
grader C som ett heltal.

(Med 5 steg per grad C s behöver du göra en division med 5 vilket
är betydligt trixigare. men inte omöjligt, än en division med 4).

Sen är det bara att dela upp det i en tiotals siffra och ental.
Det är inget större problem. Se hur många gånger du kan dra bort
10 från värdet utan att det går under noll. Det är tiotalet. Resten
är entalet.

Sedan mappar du varje siffra via en tal -> 7-segment tabell
och lägger ut det på respektiva display.
Skriv svar