Sida 1 av 1
Hjälp med lite matte
Postat: 11 juli 2012, 09:53:16
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'.
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?
Re: Hjälp med lite matte
Postat: 11 juli 2012, 09:57:24
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.
Re: Hjälp med lite matte
Postat: 11 juli 2012, 10:04:41
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.
Re: Hjälp med lite matte
Postat: 11 juli 2012, 10:19:27
av Icecap
Det är väl bara att mäta drivspänningen också och låta den ingå i formeln.
Re: Hjälp med lite matte
Postat: 11 juli 2012, 10:48:47
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.
Re: Hjälp med lite matte
Postat: 11 juli 2012, 14:56:57
av blueint
Vad är lämplig interpolering mellan värdena? S-plines är ju lite jobbigt för en MCU..
Re: Hjälp med lite matte
Postat: 11 juli 2012, 15:13:38
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;
}
Re: Hjälp med lite matte
Postat: 11 juli 2012, 15:19:12
av PHermansson
Hmm fanns lite fel i koden, fixat nu.
Re: Hjälp med lite matte
Postat: 11 juli 2012, 15:19:59
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".

Re: Hjälp med lite matte
Postat: 11 juli 2012, 15:51:15
av blueint
Kanske en logaritm e^x kan fungera annars istället för tabell om man vågar sig på det?
Re: Hjälp med lite matte
Postat: 12 juli 2012, 07:40:46
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.