Hjälp med lite matte

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Hjälp med lite matte

Inlägg av PHermansson »

Projektet i korta drag: En Arduino kopplad till en tankmätare från en bil. Funktionen analogWrite används för att skriva ett värde till en utgång, som får nålen i mätaren att flytta sig.
Skriver man '100' till mätaren/utgången går nålen till max på skalan. '250' flyttar nålen till min.

Som invärde läser jag in drivspänningen via en spänningsdelare. Detta omvandlas så att jag får ett riktigt värde att skriva ut på LCD/serieport. Sen vill jag visa spänningen på mätaren, så länge den håller sig mellan 10 och 15 volt.

Mitt första(egentligen trettioandra) försök ser ut så här: 'vin' är det omräknade batterispänningen, tex '12.02'.

Kod: Markera allt

vin=vin/0.033;
vin=555-vin;
10 volt drivspänning ger då vin=250, 15 volt ger vin=100. Så långt är allt bra. Problemet är bara att mätarnålen inte rör sig linjärt. För att få nålen att stå rakt upp i mitten på skalan måste vin vara 150. Hur ska man skriva formeln så att det blir rätt, att en drivspänning på 12,5 volt får nålen att stå rakt upp?
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hjälp med lite matte

Inlägg av Icecap »

Om den inte är linjär är lösningen oftast en tabell med kurva. Har man ett antal punkter kan man interpolera mellan dom, detta har jag gjort i ett projekt och det fungerar strålande.

Då kan man enkelt flytta de enstaka punkterna i kurvan och därmed få utläsningen att bli linjär.

En kurva med kanske 16 punkter borde räcka.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Hjälp med lite matte

Inlägg av PHermansson »

Ja det är nog det enklaste. Sen när jag tänker på det är skalan 10-15 volt rätt meningslös. 15 volt kommer man aldrig upp i, inte heller ned till 10 (hoppas man :) )
En bättre skala vore väl egentligen 12.4-12.8 volt, från undre gränsen till vad som är lämpligt till vad man kan räkna med på ett nyladdat batteri. Vid laddning blir det ju högre, men det kan man ju spärra i koden så att nålen bara går strax över max på skalan.
Användarvisningsbild
Icecap
Inlägg: 26652
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hjälp med lite matte

Inlägg av Icecap »

Det är väl bara att mäta drivspänningen också och låta den ingå i formeln.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Hjälp med lite matte

Inlägg av vfr »

Håller med Icecap! Vi har kört interpolerade lineariseringstabeller i många år för att göra om ett mätvärde till riktig enhet. Mycket flexibelt och tillräckligt noggrannt med ganska få segement på dom flesta typer av signaler.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Hjälp med lite matte

Inlägg av blueint »

Vad är lämplig interpolering mellan värdena? S-plines är ju lite jobbigt för en MCU..
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Hjälp med lite matte

Inlägg av PHermansson »

Här finns det ju inga krav på noggrannhet så jag gjorde en enkel "if-tabell". Ändrade också till området 12.4-12.8 volt. Då kommer mätaren att indikera vartåt det lutar, drar den mot rött på tankmätaren är det dags att ladda. Exakt värde får man från LCD (som kommer att vara mer dold).

Kod: Markera allt

       if (vin<12.4) {
          meterout=250;  
       }
       else if (vin>12.4 && vin <12.45) {
          meterout=212;  
       }
       else if (vin>=12.45 && vin <12.49) {
          meterout=175;  
       }       
       else if (vin>=12.5 && vin <12.59) {
          meterout=165;  
       }     
       else if (vin>=12.6 && vin <12.64) {
          meterout=150;  
       }     
       else if (vin>=12.64 && vin <12.69) {
          meterout=137;  
       }     
       else if (vin>=12.7 && vin <12.74) {
          meterout=125;  
       }     
       else if (vin>=12.75 && vin <12.79) {
          meterout=112;  
       }     
       else if (vin>=12.8 && vin <12.9) {
          meterout=100;  
       }     
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Hjälp med lite matte

Inlägg av PHermansson »

Hmm fanns lite fel i koden, fixat nu.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjälp med lite matte

Inlägg av sodjan »

> Vad är lämplig interpolering mellan värdena?

Hela tanken är att man har en tabell med tillräckligt många värden
så att en linjär interpolering blir "good enough". Annars har man ju
så att säga "förlorat på karusellerna vad man vann på gungorna". :-)
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Hjälp med lite matte

Inlägg av blueint »

Kanske en logaritm e^x kan fungera annars istället för tabell om man vågar sig på det?
jappelino_1
Inlägg: 81
Blev medlem: 13 april 2010, 14:40:04
Ort: Stockholm

Re: Hjälp med lite matte

Inlägg av jappelino_1 »

Jag har gjort något liknande för en vattentank till en båt.
Tanken hade en form som gjorde utgången väldigt olinjär.
Jag fyllde tanken och tappade av den med 10 liter åt gången, för varje avtappning noterade jag mätvärdet.

På det här viset kom jag även fram till att tanken var på 170 liter och inte 200.
Fransmän är väl inte alltid så noga.
Skriv svar