Forum: Mikrocontroller und Digitale Elektronik ADC Vergleichen und Variable ändern


von G. M. (knut89)


Angehängte Dateien:

Lesenswert?

Hallo alle zusammen,

hab da so ein Problem ich arbeite mit Bascom an dem  Abschlussprojekt 
meiner Ausbildung und Zwar einer digitalen temperatur regelnden 
Lüftersteuerung mit einstellbaren Hysterese werten.
die werte dollen über eine LCD ausgegeben werden.
Ich verwende einen LM235 um die Temperatur zu Messen die Spg des LM 
halbiere ich über einen Spgteiler und Wandle ihn über den ADC Wandler 
des Atmegas 8 um.
die Messung und die Ausgabe funktioniert auch wunder bar nur muss ich um 
die Temperatur anzuzeigen muss ich den Binärwert durch einen wert teilen 
nur ändert sich der Faktor durch den ich Teilen muss und ich weiß nur 
nicht so recht wie ich das anstellen soll. Programm lade ich mit hoch 
sowie das Datenblatt des LM235.

Danke schon mal Knut

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

G. Matthias schrieb:
> Hallo alle zusammen,
>
> hab da so ein Problem ich arbeite mit Bascom an dem  Abschlussprojekt
>...
> die Temperatur anzuzeigen muss ich den Binärwert durch einen wert teilen
> nur ändert sich der Faktor durch den ich Teilen muss und ich weiß nur
> nicht so recht wie ich das anstellen soll...
>
>
Hallo,

ich bin jetzt etwas verwirrt, Teilen => Faktor.
Im Kopf habe ich noch
Divident dividiert durch Divisor gleich Wert des Quotienten.
Hoffe dennoch wir beide meinen das gleiche.

Egal, da gibt es doch so Sachen wie IF... THEN.
Ich meine, wenn die Bedingung ( IF ) für diesen ?Faktor?
gegeben ist,( THEN ) dann lädst Du halt die Variable mit diesem Faktor.

ldi Divisor,Wert_1 ;Das ist Asssembler von Bascom habe ich keine Ahnung.

Also, im THEN Programmabschnitt für diesen Faktor - lädst Du halt die 
Variable die ich Divisor genannt habe, mit dem Wert_1.

Falls der Divisor ein anderer sein soll, dann wird halt die nächste
IF... THEN... Sache abgearbeitet. Sprich

ldi Divisor,Wert_2 usw.

Bernd_Stein

von G. M. (knut89)


Lesenswert?

moin


>Hallo,

>ich bin jetzt etwas verwirrt, Teilen => Faktor.
>Im Kopf habe ich noch
>Divident dividiert durch Divisor gleich Wert des Quotienten.
>Hoffe dennoch wir beide meinen das gleiche.
hass ja recht

das hab ich auch schon ausprobiert hab den binären wert genommen wollte 
es eigendlich so machen das ich den wert wann das if losgehen soll 
ändere und den Wert durch den die Binärzahl geteilt wird. hab ein 
Temperatur bereich von ca 70° C das heist 700 if befehle(wenn ich bei 
jedem ° den divisor ändere,was erforderlichwäre)  das ist bissi viel 
find ich.
Ne idee wie der IF befehlt aus sehen könnte
B=606

If A > B Them
   D=D /1,14
   B=B + 5

aber dann wird B ja oben wieder zurück gesetzt auf 606
Gruß knut

von Karl H. (kbuchegg)


Lesenswert?

G. Matthias schrieb:
> moin
>
>
>>Hallo,
>
>>ich bin jetzt etwas verwirrt, Teilen => Faktor.
>>Im Kopf habe ich noch
>>Divident dividiert durch Divisor gleich Wert des Quotienten.
>>Hoffe dennoch wir beide meinen das gleiche.
> hass ja recht
>
> das hab ich auch schon ausprobiert hab den binären wert genommen wollte
> es eigendlich so machen das ich den wert wann das if losgehen soll
> ändere und den Wert durch den die Binärzahl geteilt wird. hab ein
> Temperatur bereich von ca 70° C das heist 700 if befehle(wenn ich bei
> jedem ° den divisor ändere,was erforderlichwäre)  das ist bissi viel
> find ich.

Find ich auch.
Es wird doch irgendeinen mathematischen Zusammenhang geben!

> Ne idee wie der IF befehlt aus sehen könnte

Nein.
AUs deinem Gestammel kann man noch nicht einmal erkennen warum 
eigentlich durch immer irgendetwas anderes dividiert werden soll.
Noch nicht mal dann, wenn ich deinen anderen Thread mit dazu nehme.

Formuliere deine Frage erst einmal ordentlich und gib alle relevanten 
Details

von G. M. (knut89)


Lesenswert?

na dann

also an meinem LM fallen bei 20° 2,932V ab über den Spg teiler wird sie 
halbiert 1,466 Vref = ",485

ADC= VIn * 1024 /2,485 = 604

SO 604 ist mein wert für 20 ° ich will auf meinem Display auch 20 ° 
stehen haben nicht 604 604 /20 = 30,2 .

für 21° ist mein binäre wert  V in = 2,942/2 =1,471V   Vin * 1024 / 
2,485 = ADC = 606  jetzt brauch ich wieder den Temp wert durch 30,2 sind 
das ?

Richtig 20,066
also 606 / 21 =28,86 dieser wert ist  also um 95,55% kleiner das ist die 
Änderung die ich in dem Divisor habe ?

ist mein Gestammel jetzt einleuchtend??

von G. M. (knut89)


Lesenswert?

Meine Frage ist jetzt wie ich das um setztn kann das ich den faktro 
änder ohne jeden einzelnen binären wert in einer If Verknüpfung 
abzufragen braucht  ganz schön viel Rechen zeit 700 if befehle ab zu 
arbeiten.

von Karl H. (kbuchegg)


Lesenswert?

G. Matthias schrieb:

> also an meinem LM fallen bei 20° 2,932V ab über den Spg teiler wird sie
> halbiert 1,466 Vref = ",485
>
> ADC= VIn * 1024 /2,485 = 604
>
> SO 604 ist mein wert für 20 ° ich will auf meinem Display auch 20 °
> stehen haben nicht 604 604 /20 = 30,2 .
>
> für 21° ist mein binäre wert  V in = 2,942/2 =1,471V   Vin * 1024 /
> 2,485 = ADC = 606  jetzt brauch ich wieder den Temp wert durch 30,2 sind
> das ?
>
> Richtig 20,066
> also 606 / 21 =28,86 dieser wert ist  also um 95,55% kleiner das ist die
> Änderung die ich in dem Divisor habe ?
>
> ist mein Gestammel jetzt einleuchtend??

Nein.
Aber ich denke du bist auf der Suche nach einer linearen Gleichung und 
nicht einfach nur nach einer Division.


   Temp = ADC_Wert * Konstante + Offset

Du kennst 2 Wertepaare
  Bei einem Messwert von 604   müssen 20 rauskommen
  Bei einem Messwert von 606   müssen 21 rauskommen

Also

  20 = 604 * k + d
  21 = 606 * k + d

das sind 2 Gleichungen in 2 Unbekannte und das kann man lösen und so die 
Konstante k und den Offset d bestimmen. (Und wenn deine Kalibrierwerte 
weiter auseinander liegen würden, wäre es noch besser. Einen 
Wertepärchen für 0° [Eiswasser] und eines bei 100° [Kochendes Wasser] 
wäre besser)

Und da das deine Abschlussarbeit ist, werde ich dir das hier nicht 
vorrechnen.

von G. M. (knut89)


Lesenswert?

Also 100° sind 3,732
also ist mein Binärer wert 768,92 = 769 da es keine Kommastellen gibt
0° sind 2,732
also 562,89 = 563

100° = 769 * k + d   (-d
100-d = 769*k          (/100
- d = 769*k / 100


100 = 769 *k - 769*k/100 ( *100
10000=769*k*100-769*k    (/k
10000/k = 769*100-769
10000/k=  76131          (/ 10000
1/k    = 76,131          (^-1
 k     =  0,0131
100    = 769*k+d
100    = 10,07+d         ( - 10,07
89,3   = d


0° = 563 *k + d
0  = 7,375 +d
d= -7,375

Meintest du das so ja das heißt bei 100° Temperatur Änderung wird d um 
96,67
größer oder kleiner

von Michael U. (amiga)


Lesenswert?

Hallo,

die Dinger liefern 10mV pro Grad Kelvin...

Messwert z.B. 2,73V = 273 Grad Kelvin - 273 = 0 Grad Celsius.
3,73 Volt = 373 grad Kelvin - 273 = 100 Grad Celsius.

Wo ist das Problem?

PS: Kommastellenkram habe ich mal weggelassen.

Gruß aus Berlin
Michael

von g_ast (Gast)


Lesenswert?

G. Matthias schrieb:
> Meine Frage ist jetzt wie ich das um setztn kann das ich den faktro
> änder ohne jeden einzelnen binären wert in einer If Verknüpfung
> abzufragen braucht  ganz schön viel Rechen zeit 700 if befehle ab zu
> arbeiten.
Oh Mann! Hast du in Deutsch gefehlt oder bist du besoffen? Du willst 
doch was von uns, dann formulier deine Anfrage gefälligst vernünftig!

von G. M. (knut89)


Lesenswert?

Mh will die werte von binär in Dezimal umwandeln und dafür brauche ich 
eine Divisor der sich für jedes Grad mehr verkleinert für jedes Grad 
weniger erhört.
Geb die Temperatur auf einem LC-Display aus und da brauche ich den 
dezimalen Wert .

von G. M. (knut89)


Lesenswert?

Wie Schreibe ich eine If Verknüpfung die es schaft den Divisor und sich 
selbst in Abhängigkeit der Temperatur hoch oder runter zu setzten?

@g_ast
Vernünftig genug??
Wenn wir jetzt kleinlich werden es heißt es formuliere und nicht 
formulier  also erst mal an die eigene Nase packen bevor man jemanden 
anderen wegen etwas verurteilen will .

von Bastler (Gast)


Lesenswert?

Ich verstehe nicht was du dauernd mit der if-Verknüpfung willst?
(wäre sowieso eine if-Abfrage!)

Bei Temperaturfühlern, welche auch immer, kann man meist eine Gerade 
über die Kennlinie legen.
Also: Geradengleichung für deinen Fühler aufstellen und gut ists!

z.B:

Offset = xxxxx;
Steigung = yyyy;

Temperatur = (ADU_Wert * Steigung) + Offset;

von g_ast (Gast)


Lesenswert?

G. Matthias schrieb:
> @g_ast
> Vernünftig genug??
> Wenn wir jetzt kleinlich werden es heißt es formuliere und nicht
> formulier  also erst mal an die eigene Nase packen bevor man jemanden
> anderen wegen etwas verurteilen will .

Sei froh dass ich hier kein Mod. bin!

Darf ich mal entschlüsseln? Der Mensch hat keine Ahnung und schreibt 
jetzt so lange wirres Zeug bis ihm jemand eine fertige Lösung serviert.

plonk

von Michael U. (amiga)


Lesenswert?

Hallo,

vielleicht habe ich oben zu undeutlich geschrieben:
der LM235 ist misst LINEAR mit 10mV/Grad Kelvin!

mit seinem Spannungsteiler (wozu???) bekommt er dann eben 10mV/2 Grad 
Kelvin.

Also ohne Teiler (U lm235 - 2732mV) = Temperatur in 1/10 Grad Celsius.
Mit seinem Teiler dann eben (U lm235 - (2732/2)) = Temperatur in 1/5 
Grad Celsius.

Gruß aus Berlin
Michael

von G. M. (knut89)


Lesenswert?

Weil ich seit 2 Wochen mit Bascom arbeite und noch nie was von Offset 
gehört habe.
Was gibt Offset an ,
die Steigung ist mir schon klar die Steigung die ich habe von Grad zu 
Grad.
 und der ADU_wert meinst du welchen wert Binär oder Dezimal.

von verzweifelt (Gast)


Lesenswert?

> Weil ich seit 2 Wochen mit Bascom arbeite und noch nie was von Offset
> gehört habe.

> und der ADU_wert meinst du welchen wert Binär oder Dezimal.

Das muss man sich mal auf der Zunge zergehen lassen...

:-(

von Bastler (Gast)


Lesenswert?

>ADU_wert meinst du welchen wert Binär oder Dezimal.

Ich glaube dir fehlt noch einiges an Verständnis.


Mit Offset meinte ich, dass du vermutlich nicht 0V bei 0°C hast.
Wenn du eh 10mV/°C hast ist das Ding ja linear!

Also wo ist das Problem?
Das hat nichts mit BASCOM zu tun, sondern mit y= mx +b .
9. Klasse mal gelernt...

von Bastler (Gast)


Lesenswert?

>ADU_wert meinst du welchen wert Binär oder Dezimal.

Erinnert mich an die aktuelle Ausgabe von COM.

Auf der Titelseite steht: IPv6 : Kann Ihr Rechner das hexadezimale 
Zahlenformat?

von G. M. (knut89)


Lesenswert?

Wie man eine Linearen Grafen berechnet ist mir klar nur die Befehle 
waren unklar okay.

Es tut mir leid das ich ein unwissender kleiner dummer Azubi bin möchte 
mich dafür entschuldigen das ich eure Zeit beanspruche.

von G. M. (knut89)


Lesenswert?

@Michael:
Der Spannungsteiler ist dafür da das ich die interne Referenzspannung 
benutzen kann diese beträgt 2,485 V.

von Bastler (Gast)


Lesenswert?

>Wie man eine Linearen Grafen berechnet ist mir klar nur die Befehle
>waren unklar okay.

Befehle?
Du brauchst eine Addition und eine Multiplikation.


Aber mach dir nichts draus, es gibt viele Erstsemestler die keine 
Geradengleichung aufstellen können.

von Justus S. (jussa)


Lesenswert?

G. Matthias schrieb:
> und der ADU_wert meinst du welchen wert Binär oder Dezimal.

sowas tut immer wieder weh...

von G. M. (knut89)


Lesenswert?

Es geht nur um den Befehl den ich in Bascom brauche wie ich einen 
Gottverdammten Linearen Grafen berechne weiß ich F (x) = mx + b

B ist der Punkt an dem der Graf die y schneidet m die Steigung und X 
der wert auf der X Achse  ,soll ich auch noch erklären wie man eine 
Parabel berechnet bevor ihr mich weiter für blöd verkauft.

von grrr (Gast)


Lesenswert?

G. Matthias schrieb:
> Es geht nur um den Befehl den ich in Bascom brauche wie ich einen
> Gottverdammten Linearen Grafen berechne weiß ich F (x) = mx + b
Dann guck in die gottverdammte Doku oder frag Google und belästige uns 
nicht weiter! RTFM

Kann das mal einer zumachen? Ist ja nicht zu glauben!

von G. M. (knut89)


Lesenswert?

Und ich weiß auch das meine Steigung also m = 2,0604 ist und b mein 
Offset = 2,732 ist.

von G. M. (knut89)


Lesenswert?

Naja das erste mal das in diesem Forum fast nur bessere Menschen als ich 
es bin antworten  Michael danke für deine Hilfe dem Rest auch danke fürs 
Augen öffnen.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Justus Skorps schrieb:
> G. Matthias schrieb:
>> und der ADU_wert meinst du welchen wert Binär oder Dezimal.
>
> sowas tut immer wieder weh...

Hallo,

da hast Du recht.
Aber ich meine deine Antwort und nicht seine Frage.




Okay,
die Experten hier im Forum dürften erkannt haben, was er vor hat und wo 
im Moment sein Problem liegt. Für die anderen, will ich es mal mit 
meinen Worten versuchen zu formulieren.

Mit einem ATMega8, LM235, LC-Display und noch anderen Hardwarezutaten 
möchte oder muß G. Mattias alias knut89
eine Lüftersteuerung realisieren. Der Temperaturbereich für den Fühler 
liegt zwischen 0° Celsius und 70° Celsius.

Im Moment hat er ein Problem damit, die vom AD-Wandler eingelesene 
Spannung als Grad Celsius auf dem LC-Display korrekt anzuzeigen.

Der LM235 erzeugt z.B. bei 20°C eine Spannung von 2,932 Volt.
Über einen Spannungsteiler, welcher diese Spannung halbiert bekommt der 
interne AD-Wandler des ATmega8 deshalb an seinem Analogeingang Vin eine 
Spannung von 1,466 Volt ( Spannung des LM234 dividiert durch zwei ).

Die Eingangsspannung Vin am AD-Wandler wird in folgender Gleichung als 
Zahlenwert umgewandelt.

ADC = Vin * 1024/2,485

Als Zahlenwert erhält man nun 604.
Zum Beispiel soll dieser Zahlenwert 604 nun in die Temperatur überführt 
werden und dann auf dem LC-Display als   " 20°C " erscheinen.


Schade das ich da von zu wenig Ahnung habe,
aber für einige Experten hier im Forum dürfte das mit Leichtigkeit zu 
machen sein. Nur ist hier das Problem, es einem anderen auch Vermitteln 
zu können, wie man so etwas macht.

Ich klinke mich jetzt hier aus, da ich weder das eine, noch das andere 
behersche.

Bernd_Stein

von G. M. (knut89)


Lesenswert?

Danke Bernd

von G. M. (knut89)


Lesenswert?

Also Lösung für dieses Problem ist wie oben schon von vielen gesagt die 
Formel y=mx+b.

Nur muss
y der Bit wert sein
m die Steigung
X die Temperatur
b Der Offset (der y-Wert an dem X=0 ist)

Um die Temperatur zu berechnen muss ich also nach X umstellen lautet die 
Formel also

X = (y-b)/m
und das ist es

Lb1 = Adcl                               'Abfrage des Lowbits
Hb1 = Adch                                     'Abfrage des Highbits
Hb1 = Hb1 And &B00000011
'Highbit mit 3 und verknüpfen um eventuele Störsignale ich ein zu 
Beziehen
Hb1 = Hb1 * 256                   'High bit * 256 um  1023 bit zu 
bekommen

A = Lb1 + Hb1                    'Variable A = Gesamt bit High- und 
Lowbit
D = A * 100          'Umwandlung von A für die Berechnung der Temperatur
Y = D - C

X = Y / B

Wenn noch fragen bestehen fragen.

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.