ADC räkna ut binärt tal?
ADC räkna ut binärt tal?
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?
delar man då 1024 med 5000mv och multipliserar det värdet med säg 1500mv = 307.2 = b100110011
eller är jag helt fel ute?
Re: ADC räkna ut binärt tal?
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.
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.
Re: ADC räkna ut binärt tal?
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.
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.
Re: ADC räkna ut binärt tal?
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!
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!
- 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?
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...
Så 1,5V blir då 1500/4,88 = ~307, eller binärt 0100110011
Edit: Så ja, du räknade rätt...

Re: ADC räkna ut binärt tal?
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...
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...
Re: ADC räkna ut binärt tal?
Frågan va helt änkelt om jag hadde tänkt rätt! Och det hadde jag ju då!!
Re: ADC räkna ut binärt tal?
Vill du ha ut ett tal som motsvarar spänningen i millivolt så kan du räkna så här:
// 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...
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;
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...
Re: ADC räkna ut binärt tal?
vad är det där skrivet i för språk då fattar nada 
kan bara asseembly

kan bara asseembly
Re: ADC räkna ut binärt tal?
C, men jag skulle nog valt en annan algoritm, för att slippa multiplikationen.
Re: ADC räkna ut binärt tal?
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.
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.
Re: ADC räkna ut binärt tal?
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.
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 */
Re: ADC räkna ut binärt tal?
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!?
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!?
Re: ADC räkna ut binärt tal?
> 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.
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.