Forum: Analoge Elektronik und Schaltungstechnik Bascom aus ADC-Wert Spannung errechnen


von Daniel (Gast)


Lesenswert?

Hallo zusammen,

ich lese mit Bascom einen ADC-Kanal meines Tiny26 in einem Loop aus:

$crystal = 1000000
$regfile = "at26def.dat"
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 ,
Db7 = Portb.3 , Rs = Porta.4 , E = Porta.5
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto
Dim Temp_adc_spannung As Word
Start Adc

Do
Temp_adc_spannung = Getadc(0)
Cls
Lcd Temp_adc_spannung
Waitms 20
Loop

End

Klappt auch problemlos.
Die Spannung wir errechnet mit Spannung = ADC * Vref / 1024  Richtig
??
Welche Datentyp muss ich der Variablen Spannung zuordnen um nachher
z.B. 3,68 V ins LCD schreiben zu können.
Wichtig ist jedoch, dass ich Programmspeicher spare. Worauf muss ich
achten ??
Vielen Dank!!!

Daniel

von Werner Hoch (Gast)


Lesenswert?

Hi,

eins vorweg, ich hab keine Ahnung von Basic.

Damit möglichst wenig gerechnet werden muß würde ich Festkomma-Rechnung
verwenden.

1. Möglichkeit:
Spannung= ADC *(vref*10000/1024);

Damit erhälst du einen Wert der in 2 Byte passt.
Anstatt 3,68 erhälst du 36800.
Die Kommasetzung erfolg erst bei der Ausgabe. Der geklammerte Ausdruck
wird vom Kompiler ermittelt und benötigt keinen Speicher.

2. Möglichkeit
Spannung= ADC* (vref*6400/1024)/64;

Anstatt 3,68 erhälst du 368, die Berechnung benötigt wieder nur einen 2
Byte großen Zwischenspeicher. Den Divisor 64 kann der Kompiler mit
Shiftbefehlen realisieren.
Kommasetztung erfolg wiederum erst bei der Ausgabe.

HTH
Werner

von harry (Gast)


Lesenswert?

hi,

wie werner schon schreibt, die kommasetzung erst bei der ausgabe.
nicht gerade superelegant aber geht bestens:

Anzeige = Format(str(DRUCK) , "0.0") + " bar"

hab ich so bei einer drucksteuerung gemacht wobei z.B. der wert 25 als
2,5 bar ausgegeben wird.
Anstatt dem format-befehl kannst du auch den 'fusing' verwenden, das
programm ist aber mit format am kleinsten.

gruss, harry

von Daniel (Gast)


Lesenswert?

Hallo Werner, hallo Harry,

vielen Dank für eure Antworten.
Leider komme ich jedoch noch nicht so ganz weiter und hab da noch ein
zwei Fragen:
a=b*c*d/e    Kann Bascom das nicht ?? Bekomme da immer einen Fehler.
Welchen Datentyp muss ich wählen ?? Hab da ein echtes Platzproblem im
Tiny26. Ich lese einen 10Bit-ADC mit einer Vref von 5V.

Vielen Dank !!

Daniel

von Stephan Titz (Gast)


Lesenswert?

Hallo Daniel!
Mit dem Problem habe ich mich bei Bascom auch schon rumgeschlagen...
Würde das Problem so lösen:

a=b*c
a=a*d
a=a/e

Wenn mir einer erklären kann, wie es anders geht, wäre ich ihm verdammt
dankbar!!!
Würde nämlich auch ganz geren größere Formel rechnen können!

mfg

Stephan

von AxelR (Gast)


Lesenswert?

ganzleiserufend FastAvr...
ist zwar an anderen Stellen blöd, aber sowas kann er echt gut


Gruß Axel

von Profi (Gast)


Lesenswert?

Kommt wie immer darauf an, welche Werte die Variablen haben.

Theoretisch ist die Multiplikation kommutativ, aber in der Praxis
sieht's wie immer anders aus:
Wenn es bei den Zwischenergebnissen Underflows, Overflows, Rundungen
... gibt, stimmt hernach nichts mehr.
Es kommt also meist doch auf die richtige Reihenfolge an.

Gib doch mal ein paar Beispiele von flaschen Variablen und Ergebnissen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.