Ta analogt värde och presentera på display

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Ta analogt värde och presentera på display

Inlägg av PaNiC »

Så var det dags igen, ytterligare ett programmeringsproblem som PaNiC har svårt för att lösa. Han har visserligen inte försökt mer än att grubbla på det än, men han har inte kommit fram till något vettigt.
Det hela går ut på att mäta tryck. Sensorn jag har hittat har ett mätområde på 0-20 bar och ger utsignal på 0-5V. Jag har tänkt mig att använda den inbyggda AD-omvandlaren i ATMega8535 eller annan AVR. Har inte riktigt bestämt mig för vilken än.
Saken är den att det analoga värdet ska tas och presenteras som trycket på en display. Dvs om trycket är 10 bar så borde utspänningen vara 2.5V vilket borde ge värdet 512 i en 10-bits AD. Värdet 512 ska så omvandlas till 10 och presenteras som ascii-text på en display. Utöver detta ska trycket omvandlas till kondenseringstemperatur för ett köldmedium och detta ska också presenteras på displayen.
Tanken slog mig att ha alla värden lagrade i EEPROM och sedan bara använda värdet från AD till att leta upp rätt adress i EEPROM och skriva därifrån. Men det är ju lite tråkigt.
Användarvisningsbild
Henrik Kjellberg
Inlägg: 539
Blev medlem: 26 december 2004, 00:59:27
Ort: Lund

Inlägg av Henrik Kjellberg »

tufft! Sitter du och bygger en dykdator eller?`
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Nix, övervaknings/styrsystem till en kylanläggning.
Något som jag inbillar mig kunna tjäna lite pengar på en vacker dag.
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

En sådann lookup-tabell gjorde jag för 4st 256-bitars ingångar, inget roligt när varje rad blir 60 tecken lång och bara massa hextal.

Men det fungerade.

Ett alternativ är att göra en räknare som hela tiden får öka och omvandla ditt tal till ental. Så om du har 0,25bar in så får du ut det som en 0:a en 2:a och en 5:a. Sedan får du skapa dig ett "teckensnitt" och rutiner för att skriva ut detta.


Jag har lyckats med det en gång. Projektet blev däremot nerlagt innan det blev klart.... :(

GL HF som ngn annan skrev i en tråd här :)

Skulle tro att Panic vill ha övervakningsdisplay till kompressorkylningen för datorn.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Ajfyfan. Den lookuptabellen var nog inte så rolig nej :).
Jag förstår inte riktigt hur räknaren skulle fungera. Kan du utveckla det?

Och helt rätt uppfattat vad jag ska ha den till :D.

Edit: Tror att jag förstår nu. Jag kommer att ha tre eller fyra siffror till trycker på displayen. Om vi säger att värdet 512 kommer från ADCn så sätter man exempelvis fyra register till ascii-värdet för 0. Därefter ökar man den minst värda siffran med 1, minskar värdet från ADC, ökar med 1, och ökar nästa siffra när den första hamnar på ascii 9, minskar osv tills värdet från ADC har hamnat på noll.
Var det så du menade?
Toett
Inlägg: 29
Blev medlem: 23 maj 2005, 22:26:06

Inlägg av Toett »

Förutsatt att din sensor är linjär (vilket den med största sannolikhet är) så behöver du ingen "lookup-tabell".

Beräkna: ADin / 51,15
Avrunda till önskat antal decimaler (två?).
Dela upp talet så att du får siffrorna i separata variabler.

Skaffa displaydrivare (ex. ICM7212IPL).
Mata ut och njut... :)

/ Jonas
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Jo det stämmer ju. Men var kommer 51,15 ifrån?
Det tråkiga är att det är lite jobbigt att dela med 51,15 i assembler ;).
Toett
Inlägg: 29
Blev medlem: 23 maj 2005, 22:26:06

Inlägg av Toett »

51,15 kommer ifrån 1023/20.

Det hade nog varit lite lättare om du skrev programmet i C eller basic...
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

Om du ska ha lookup-tabell så skriv ett C-program (till datorn) som spottar ur sig tabellvärdena till en fil du kan #include:a i ditt program. Fast om det bara är en simpel skalning så är det nog inte lönt, mer till för logaritmer och trigonometri och sånt.

En multiplikation = en rad i i valfritt högnivåspråk, eller hundra rader ASM :)
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Alltså: ADC=512 betyder 2,00. Tänk att det blir 200 och sedan petar man in kommat vid utskrift. Du ska alltså dela ADC-värdet med 2,56. Det gör man vid att multiplicera det med 100 först och sedan dela med 256.....som råkar vara att flytta hela klabbet 8 platser till höger. Då kan du alltså bara strunta i den lägsta byten efter multipliceringen.

Omvandla sedan till läsbart tal och sätt in kommat på rätt plats och sen är du glad och nöjd.
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Det är just att omvandla till ett läsbart tal som jag har problem med.
Om jag t.ex. tar en ATMega32 så finns det ju MUL-funktionen. Jag vet dock inte vad skillnaden mellan signed och unsigned-register.

Kom på en liten detalj nu. För att omvandla exempelvis 243 till ett tal som är läsbart på displayen. Tag tre register, ge dem ascii-värdena för siffran 0. Börja med hundratal, öka ett register med ett, dra bort 100 från registret, öka med ett igen, ta bort 100. Gör sedan likadant med 10-tal och ental.
Då skulle man kunna kolla om hundra eller tiotalsplatsen är noll med BRLO-instruktionen och sedan till sist om hela registret är noll när entalssiffran är flyttad till ascii-form.
Jag tycker att detta borde fungera. Tycker någon annorlunda?
Jag behöver egentligen inte mer än 8 bitars upplösning på talet. Det ger tillräcklig noggrannhet ändå.

Toett: Ja, det hade varit enklare att skriva i C eller Basic. Men då måste jag lära mig något av de språken ;).
Kan ju en viss dos VB. Men tycker bättre om att använda assembler.

MUL-instruktionen lägger resultatet i R0(L) och R1(H).

Edit: Nu vet jag vad skillnaden mellan signed och unsigned är.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

En användbar rutin är dela-med-10!

Om du delar talet med 10 och tar resten har du 1-talen (0-9, lägg till '0' och du har '0'-'9')
Dela resultatet med 10 igen och du har tiorna i restvärdet.
Dela igen och du har 100 osv. Kan köra det antal gånger som behövs, man ska bara komma ihåg att den kör bakifrån. Jag har en sån rutin liggande till PIC, mycket smidig att peta in som ett macro.....

När du sedan visar talen kommer du ihåg att peta in kommat på lämplig plats, du kan även peta in det under "dekodningen".
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Angående ditt förra inlägg. Jag får det till att jag ska multiplicera med 0,01955 för att konvertera ADns värde till trycket.

Edit: Same shit, different method ju. Jag och siffror.
Nalle Puh
Inlägg: 5
Blev medlem: 25 april 2005, 23:01:09

Inlägg av Nalle Puh »

Använd räta linjens ekvation och enpunktsformen från MatteA, så är det skitlätt att räkna ett ett linjärt samband. Jag har själv gjort så på avren, då jag skulle omvandla från min hemmagjorda A/D omvandlare till procent.

Svårigheten är bara om du kör assembler, har du en fin mikrocontroller med mul så går det fint. Annars finns det färdiga rutiner för multiplikation att dra hem. I C så skriver man bara gånger, och får kompilatorn att göra någon dumt, men det brukar fungera. Jag själv gjorde så i C.
Skriv svar