Sida 1 av 1

A/D omvandling till serieport (pic)

Postat: 4 mars 2010, 20:22:46
av Christian
Hej! Jag håller på med ett projekt där en temperatursensor-signal A/D-omvandlas av en pic som sedan skickar ut resultatet via USART:en.
A/D omvandlaren på pic:en är 10 bitars och resultatet är konfigurerat som Left Justified.
5V motsvarar 1000 digitalt. Usarten är inställd på 8 bitar Asynkron överföring.
Efter omvandlingen skickar jag innehållet i registret ADRESH till Usarten.

Så mitt problem:
I hyperterminalen visas tecknet 'm' alltså decimalt 109, medans mätning av den analoga signalen ger 2,168V.

Det digitala värdet för 2,168V borde vara:
(1000 / 5) * 2,168 = 433,6
Jag vet att detta inte går att representera med en byte, men min fråga är då vad gör pic:en med mitt värde? Den skickar ju 109, är detta nåt trunkerat värde av mitt "för stora tal"?

Re: A/D omvandling till serieport (pic)

Postat: 4 mars 2010, 21:01:45
av victor_passe
Som det är nu antar jag att den slänger dina 2 "första" bitar
alltså, multiplicera ditt tal med 4. 109*4=436 alltså nästan exakt rätt. Din multimeter och pic-adc skiljer ju lite.

Och inte 1000 utan 1024 ska det väl ändå vara?

Re: A/D omvandling till serieport (pic)

Postat: 4 mars 2010, 21:13:25
av Christian
Då antar jag att du menar att jag slänger bort msb och den som är näst msb?
Kan du förklara var du får "multiplicera med 4" ifrån? =)

Re: A/D omvandling till serieport (pic)

Postat: 4 mars 2010, 21:20:32
av sneaky
0b1111111111 = 1023
0b11111111 = 255
1023/255 = 4

Re: A/D omvandling till serieport (pic)

Postat: 4 mars 2010, 21:26:29
av sodjan
> där en temperatursensor

Vilka då ? Modell ? Datablad ?

> ...av en pic...

Vilken PIC (notera versaler) ?

> 5V motsvarar 1000 digitalt.

Vad menar du med "digitalt" ? Decimalt kanske ?
Och varför just 1000 och inte 1023 ?

> och resultatet är konfigurerat som Left Justified.

OK, så alla 8 bitar av ADRESH används och 2 bitar av ADRESL.

> Efter omvandlingen skickar jag innehållet i registret ADRESH till Usarten.

OK, så du "strippar" alltså de två lägsta bitarna från resultetet. Helt OK
om man inte i alla fall behöver den extra upplösningen. Sen får man naturligastvis
ta hänsyn i den andra änden till att man i princip har dividerat mätvärdet med 4,
men det har du väl kläm på, eller hur ?

> Efter omvandlingen skickar jag innehållet i registret ADRESH till Usarten.

Inte speciellt bra. Omvandla först värdet till något som passar för seriell överföring.
T.ex BCD och ASCII eller något liknande. Se vidare nedan.

Sen när det gäller det du faktiskt frågar om så är det ju, som victor_passe redan
har konstaterat, inget problem alls. Allt fungerar som det ska. Dock är det fortfarande
ingen bra lösning att skicka ADRESH "rakt av" över en seriell kommunikationslinje. Du
kan ju bara fundera på vad som händer (eller inte händer) när mätvärdet råkar
sammanfalla med CR, LF eller något annat kontrolltecken som kommunikationsrutinerna
(speciellt i PC'n) kanske hanterar lite speciellt...

Re: A/D omvandling till serieport (pic)

Postat: 5 mars 2010, 09:38:25
av Marta
Mitt råd är att Du använder alla 10 bitarna och konverterar dessa till 3 hexadecimala siffror (enklare manuell tolkning), alternativt bokstäver A till P (enklare program). Skicka sedan dessa med t.ex. mellanslag som separator mellan grupperna, då kan Du även lätt se på terminalen vad som skickas. Ställ om till "right justified", så blir hela proceduren enklare. Låt programmet i PC'n sköta all omräkning o.dyl. som eventuellt behövs för att få ett kalibrerat och färdigt mätvärde.

Har Du inte låst Dig på något sätt vid den nuvarande sensorn och det handlar om "normala" temperaturer bör Du även överväga att byta till DS18B20 som har inbyggd A/D och därmed kommunicerar digitalt utan analoga felkällor samt är fabrikskalibrerad +/- 0.5 grader. Den är dessutom adresserbar, så flera sensorer kan anslutas mycket enkelt om det skulle behövas.