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"?
A/D omvandling till serieport (pic)
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: A/D omvandling till serieport (pic)
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?
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)
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? =)
Kan du förklara var du får "multiplicera med 4" ifrån? =)
Re: A/D omvandling till serieport (pic)
> 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...
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)
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.
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.