PIC 16F870 som voltmätare - designhjälp!

Berätta om dina pågående projekt.
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

PIC 16F870 som voltmätare - designhjälp!

Inlägg av markusb »

Projekt:

Bygga voltmätare med PIC16F870 (som jag har ett gäng liggande) till ett dubbelt (+-) 30V nätaggregat.

Jag behöver hjälp av er som är erfarna av att programmera PICar för att lösa detta.
Kan även tillägga att jag håller på att lära mig assembler och min kunskap inom det så långt är att jag kan få PICen att blinka lite lysdioder, sampla AD converter och skicka det till en port i binärt format osv. Ganska basic egentligen.
Nu vill jag lära mig mer!

Jag hade tänkt följande: EN F870 ska sampla 4 olika analoga ingångar som ska motsvara positiv spänning, negativ spänning, positiv ström och negativ ström i aggregatet.

4 stycken 4-siffrors LED-displayer ska användas för att visa värdena, dvs en 4-siffrors LED-display för spänning på nätaggregatets positiva utgång, en display för strömmen på samma utgång, nästa display visar den negativa utgångens spänning och slutligen en som visar negativ ström.


ex. (+)12.15(V) , 00.35(A) , (-)08.45(V) , 02.30(A)
texten inom parentes ska tryckas på frontpanelen på agget.

Displayerna bör man väl kunna köra på samma portar på PICen och sedan multiplexa matningen till dom så att endast en display är aktiv åt gången?
Samtidigt multiplexar man även dom olika siffrorna i varje display.


Det stora problemet är att jag har inte en aning om hur jag ska omvandla mina AD mätdata (10 bitar =1024 decimala värden) till begriplig displaydata. Att sampla och skicka ut binärt kan jag, men det blir ju ren grekiska på en 7 segments display. Dessutom ska ADns b'1111111111' motsvara 30.00 volt på min display, inte 1024 V ;)


Jag får använda lookup tabeller för att tända rätt segment som motsvarar siffrorna, det är jag med på.
Frågan är hur jag omvandlar mina AD-värden till rätt "nivå" och sedan räknar fram vilka siffror på displayen som ska tändas och vilka data dom ska få.

Jag har lite svårt att ens formulera problemet men jag antar att ni som har programmerat och drivit displayer förstår ändå.

Jag vill inte att någon ska skriva assemblerprogrammet åt mig, jag behöver bara en knuff i rätt riktning och kanske några exempel som visar hur jag ska gå tillväga.

All hjälp uppskattas!
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

Inlägg av markusb »

Kan även tillägga att jag har sökt runt på nätet efter en vettig förklaring till detta men inte hittat något bra.
Det enda jag hittar är hur man tänder siffror med lookup-tabeller, och hur man samplar med AD, men inte hur man KOMBINERAR dessa till något begripligt.
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

För att få 1024 till att motsvara 3000 måste du helt enkelt multiplicera med 2,9296875. Och det är ju inte så himla enkelt ändå.

För att göra det enkelt minskar du en aning på känsligheten så att 1000 på AD'n motsvarar 30,00V, då ska du multiplicera med 3,000 och det är ju mycket enklare.

Nu har du alltså en avläsning som är mellan 0 och 3000.

Sedan måste du visa dessa tal och de måste alltså delas upp i grupper om 1 siffer. Detta görs smidigast vid att dela talet med 10 och ta resten som lägsta talet (ettor), sedan pekar man på 10'or och gör exakt samma sak med talet som ju nu är delad med 10. Utför detta 3 gg, högsta siffran är ju ändå inte över '9' alltså behöver man inte räkna fram den.
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Ett exemepl som gör precis det som Icecap beskriver finns här :
http://www.piclist.com/techref/microchi ... 4d-eag.htm

Här finns en del info om multiplexning av LEDs inkl 7-seg :
http://www.piclist.com/techref/leds.htm

Sen håller jag mer Icecap, "skala" värderna innan ADC'n så att blir
enklare att konvertera ADC'ns värde till det riktiga värdet.

Du kan även om du vill lägga till en "range" switch så att du får bättre
upplösning vid låga värden. Kom också ihåg att det alltid är enklare
att multiplicera och dividera med 2, 4, 8 o.s.v. Nu är multiplikation med
just *3* i och för sig inget stort problem (en shift och en add)...
Eriktronix
Inlägg: 34
Blev medlem: 9 mars 2006, 18:10:46
Ort: Södertälje

Inlägg av Eriktronix »

Hej...
Om du nu skall använda en lookup table, vilket jag anser som lämpligast varför inte "lägga in" alla beräkningar i den. Då kan du med enkelhet multiplicera med 2,9296875. Lookup table kan man göra enkelt i excel tex. På detta sätt kan man tjäna mycke tid i tidskritiska applikationer.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Jo, iofs är LUT rätt smidigt, men i detta fallet hade jag också valt att försöka skala så att man hamnar på lätträknade värden. Behöver man skala spänningar in så är OP- rätt bra att använda. Kom ihåg att om du vill använda mer än 7 bitar så måste du ha en riktig spänningsreferens - Meningslöst att använda de sista tre bitarna då Vdd som Vref inte medger högre noggranhet än ungefär så.
Användarvisningsbild
dar303
Inlägg: 5979
Blev medlem: 17 december 2003, 19:54:56
Ort: Sthlm

Inlägg av dar303 »

Måste det vara LED-displayer, är det inte mycket enklare med en LCD som visar alla värden på en gång?
Användarvisningsbild
Adis
Inlägg: 1373
Blev medlem: 26 augusti 2003, 19:57:03
Skype: adis1987
Ort: Gävle
Kontakt:

Inlägg av Adis »

Om jag inte minns fel så fick jag för ett tag sedan nyhetsbrev från Maxim och där fanns det färdiga lösningar för mätnings av spänningar direkt till en PIC, bla för deras egna varianter.
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

Inlägg av markusb »

Icecap:

Menar du att jag ska dela ner inspänningen till ADns port så att 30.00V blir 1000 ut från ADn i mjukvaran?
Låter rimligt.. sen multiplicera det med 3 innan jag jobbar vidare med datan.
Som bonus så kommer ADn även kunna mäta lite högre än 30.00V då om jag inte har fel?

Sodjan:
Kikade på just dom länkarna innan jag skrev inlägget tidigare. Jag förstår inte riktigt det där. Är kanske lite för grön på µC för att bemästra allt detta.

Bengt-re:
"Kom ihåg att om du vill använda mer än 7 bitar så måste du ha en riktig spänningsreferens - Meningslöst att använda de sista tre bitarna då Vdd som Vref inte medger högre noggranhet än ungefär så. "

Menar du att Vdd inte är stabil nog även om den är reglerad med en 78L05 t.ex? Det är Vdd/Vss jag har tänkt köra som referens för enkelhetens skull.

Jag vill helst inte nöja mig med 7 bitar (127 värden eller 240mV noggranhet) så extern referens kanske det får bli ändå isf.

Dar303: Anledningarna är många. Just 4 siffriga 7segments har jag en hel hög liggande så jag tänkte förbruka några av dom. Sen är det bättre läsbarhet på dom på lite avstånd än en LCD.

Adis: Detta ska gå att göra med en PIC och jag kommer försöka lösa den här utmaningen ;) Färdiga lösningar är inte lika kul som att sitta å slita sig i håret ;)



Som jag skrev tidigare, är ganska grön på µC så jag behöver lite mer hjälp tror jag.

Förklara gärna lite övergripande hur ni skulle lösa det så ska jag söka vidare efter programmeringsexempel.
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

Inlägg av markusb »

Icecap:

"Sedan måste du visa dessa tal och de måste alltså delas upp i grupper om 1 siffer. Detta görs smidigast vid att dela talet med 10 och ta resten som lägsta talet (ettor), sedan pekar man på 10'or och gör exakt samma sak med talet som ju nu är delad med 10. Utför detta 3 gg, högsta siffran är ju ändå inte över '9' alltså behöver man inte räkna fram den."

Att skriva ut ADns binära tal är ju enkelt... men göra om det till decimalt verkar skitknöligt. Förklara gärna lite djupare. Vad menar du med att dela in det i grupper om 1 siffra?
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Att skriva ut ADns binära tal är ju enkelt... men göra om det till decimalt verkar skitknöligt.

Du vill väl knappast läsa binära eller hex värden på dina displayer !?

Och knöligt och knöligt, det är ju processorn som gör jobbet... :-)
Att omvandla ett binärt värde till decimalt (eller BCD) är en ganska
vanlig operation.

> Kikade på just dom länkarna innan jag skrev inlägget tidigare.

Jahaja, hade du sagt det hade jag inte behövt leta upp dom åt dig.
Bortkastad tid. Men hur som helst, då har du ju nästa all exempelkod
som du behöver. www.piclist.com har det mesta i assembler till PIC, det
är bara att läsa och njuta... :-)
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

Inlägg av markusb »

Sodjan:

Vad jag menade var att processen att göra om det till decimalt verkar krånglig när man inte är så van vid matematiken i processorn.
Jag menade inte att det var fel att göra om det till decimalt som du verkade tolka det..


"> Kikade på just dom länkarna innan jag skrev inlägget tidigare.

Jahaja, hade du sagt det hade jag inte behövt leta upp dom åt dig.
Bortkastad tid."

""Kan även tillägga att jag har sökt runt på nätet efter en vettig förklaring till detta men inte hittat något bra. ""

Jo, jag nämnde att jag letat runt innan men inte just vilka sidor kanske.
Det var inte meningen att slösa din tid.

Jag ska läsa lite mer om hur matematiken funkar i det binära så kanske jag kommer en bit längre.

Det som står på piclist var lite för avancerat då jag inte har kunskapen som behövs än.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

78L05 är inte något vidare stabil. +-5% för de vanligaste typerna.... Du behöver en 2,5V spänningsreferens.....
sodjan
EF Sponsor
Inlägg: 43247
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Du behöver en 2,5V spänningsreferens.....

T.ex en sådan här : http://www.tradera.com/auction/aid_37280313
markusb
Inlägg: 243
Blev medlem: 18 september 2005, 17:06:02
Ort: Öland med omnejd
Kontakt:

Inlägg av markusb »

Ok, så med 2.5V referens så är 2.5V max vad jag kan läsa av?
Alltså ska jag skala ner mina 30V till 2.5 och sedan mata in det i ADn.

Kikade lite på piclist förut om olika räknesätt. Jag förstår hur man adderar tal mha carrybiten. Får man en carry så roterar man talet åt vänster bara.

Däremot multiplikation begriper jag mig inte på, iaf inte mha förklaringen på piclist-sidan.

Någon som vill dra det lite snabbt för mig?
Skriv svar