Hallo, ich will uber eine Brücke einen Sensor einlesen. Die Brücke besteht einfach aus je einem Spannungsteiler, wobei der eine Zweig einen festen Spannungswert erzeugt und am anderen Zweig mit dem Sensor wird die Spannung niedriger. Die Differenzspannung, die ich somit verarbeiten will, wird zwischen den beiden Spannungsteilern gemessen und zum MC geführt. (AVR mega8) Mit geeigneter Dimensionierung der Brücke wären das dann ca. 0..1V. Meine Frage ist nun, ob und wie ich am ADC diese Spannungsdifferenz messen kann ? Nach dem Datenblatt habe ich viele ADC-Eingänge, jedoch müssen die alle auf GND bezogen sein.
Der ATMega8 hat keine Differenzeingänge. Du kannst aber auf zwei Kanälen direkt nacheinander messen und die Differenz bilden. Das geht natürlich nur dann wirklich problemlos, wenn Dein zu messendes Signal sich nicht zu schnell ändert. Wenn Du Differenzeingänge haben willst, musst Du ab ATMega16 aufwärts nehmen. Die haben sowas.
Die Brücke sollte eigentlich klar sein, hie habe ich mal einen Schaltplan angehängt. Bitte nur die Brücke unten links beachten.
Der Sensor misst nur die Temperatur und ist sehr träge. Dass sollte dann kein Problem sein die Differenz zu messen. Außerdem werde ich den nur mit wenigen Hz einlesen.
Und noch eine Frage: Ist es eigentlich möglich, dem PWM-Dreieck einen Offset zugeben, sodass es also nicht, z.b. bei 8 Bit von 0 auf 255 steigt, sondern von 100 auf 355 ? Ich denke zwar nicht das sowas geht. Könnte man als Alternative das Dreieck mit einer signed-Zahl vergleichen, also die 0...255 vom Dreieck mit beispielsweise -100...+300 ?
Wenn Dir die Auflösung am Herzen liegt, dann schalte einen
Differenzverstärker vor den µC-Eingang. Solange gewährleistet ist, dass
die Differenz immer dasselbe Vorzeichen hat (bezogen auf den
Referenzzweig der Brücke), sollte das kein Problem sein. Wenn die Brücke
mit den angegebenen 12 V betrieben wird, musst Du sowieso noch
runterteilen. Und das geht in Deinem Fall sowieso nur mit einem
Verstärker, weil Du sonst die Brücke "verstimmst".
> Ist es eigentlich möglich, dem PWM-Dreieck einen Offset zugeben
Ich weiß jetzt nicht wirklich, was Du mit "PWM-Dreieck" meinst. Wenn Du
ein digitales PWM-Signal mit einem 8-Bit-Timer erzeugst, dann hast Du
nur Werte von 0...255 zur Verfügung. Mehr passt in ein
8-Bit-Zählregister nunmal nicht rein.
Die Brücke wird schon so betrieben, dass sie maximal die Referenzspannung ausgibt. PWM-Dreieck hört sich echt bisschen wiedersprüchlich an. Ich meine damit das Dreieck, das vom Timer erzeugt wird. Zum Verständnis: Ich will den Sensorwert (=Temperatur) von 0...Vref (also bei 8 Bit: 0..255) einlesen. Dieser Wert dient dann als Vergleich zum Dreieck. Ich will aber nicht, dass bei niedrigen Ausschlägen (z.B. 0...20) dieser Vergleichsspannung zu irgendeinem Zeitpunkt dieser Wert höher als der Wert des Dreiecks ist. Dies ist aber nicht möglich ohne das Dreieck um 20 nach oben zuschieben, da diese ja immer von 0 bis 255 zählt, bzw. die Vergleichsspannung negativ werden zulassen.
Doch! Dazu subrahierst du zu deinem digitalisierten Wert einen Offset ab. zB in deinem Beispiel 20. Diesen Wert kannst du einfach als OCR-Wert verwenden, und ihn somit mit dem PWM-Timerwert vergleichen. Falls du aber trotzden willst, das bei maximalem AD-Wandler wert die PWM 100% wird, dann begrenzt du den max.Timerwert der PWM auf (max.ADC_Wert-20), das geht bei den meisten PWM-Modes über das OCRxB-Register... digitaler Wert = ADC_Wert - 20; OCRxA = digitaler Wert; OCRxB = ADC_max - 20; // ADC_max = 1023 für 10bit, 255 für 8bit...
Du könntest den Ausgang des festen Brückenzweiges als externe Referenz an den µC anschließen und den Ausgang des Variablen Zweiges an den ADC-Eingang. Das wäre dann eine "Quasi-Differenzmessung". Allerdings kriegst Du den Wert dann nicht auf Null runter, wodurch die Auflösung baden geht. Der Anordnung nach zu urteilen benutzt Du einen PTC-Sensor, sehe ich das richtig? Also wie gesagt: Differenzverstärker an die Brückenausgänge und damit auf den ADC. Und das mit der PWM dürfte ja jetzt klar sein, oder? 8 Bit -> 0...255 und nicht mehr....
Dann habe ich aber das Problem, wenn der ADC-Wert 0 ist, würde der digitale Wert negativ werden und da es sich um ein Unsigned handelt, also einen Underflow (falls man das so nennt) hervorrufen und das PWM somit auf über 90% einstellen.
Dann machst du das so: digitaler Wert = ADC_Wert - 20; if (digitaler Wert < 20) OCRxA = 0; else OCRxA = digitaler Wert; OCRxB = ADC_max - 20; // ADC_max = 1023 für 10bit, 255 für 8bit...
>Du könntest den Ausgang des festen Brückenzweiges als externe Referenz >an den µC anschließen und den Ausgang des Variablen Zweiges an den >ADC-Eingang. Nachdem ich die Brücke nicht abstimmen will, kann ich ja auch einfach im Programmcode einen festen Wert abziehen. Ich benutzt einen KTYxx Sensorm mit positiven Temperaturkoeffizienten. Natürlich würde die Spannung mit steigender Temperatur dann kleiner werden (Spannungsteilerformel), aber den ADC-Werd kann ich ja komplementieren, dann habe ich das Problem nicht. Das mit dem PWM ist mir schon klar, habe allerdings herausgefunden, dass ich bei einem 9Bit PWM das Dreieck mit einer 16Bit Zahl vergleiche kann, die somit die 511 übersteigen kann und das PWM dann auf 100% bleibt und nicht wie bei einem 8Bit PWM einen Overflow verursachen würde und dann wieder bei Null anfängt. Nochmal zu meinem Offset-Problem: Das PWM soll einen Lüfter ansteuern. Bei 20°C wird das ganze initialisiert. Erst bei 25°C soll sich der Lüfter anfangen zu drehen. Ab 35°C und darüber hinaus soll die Lüfterdrehzahl maximal sein. Letzteres ist kein Problem, da die Vergleichsspannung durchaus über das Dreieck steigen kann. Nur das Nicht-Anlaufen zwischen 20 und 25°C wollte ich gerne unterbinden.
digitaler Wert = ADC_Wert - 20; if (digitaler Wert < 20) OCRxA = 0; else OCRxA = digitaler Wert; OCRxB = ADC_max - 20; // ADC_max = 1023 für 10bit, 255 für 8bit... Das müsste eigentlich funktionieren...werds mal ausprobieren...Danke
Du kannst mit dem Timer 1 auch PWM mit beliebigem TOP-Wert erzeugen. Da kannste den "Offset" dann dazuaddieren. Die Frequenz würde sich dann eben geringfügig ändern, aber das tut sie auch, wenn Du anstelle einer 8-Bit- eine 9-Bit-PWM nimmst. Schau Dir mal die WGM-Modi 8-11 und 14-15 an. Die sollten für so was geeignet sein. Dann brauchste mit Deinem Wert nicht großartig rumzurechnen.
Also der Code funktioniert zwar while(1){ if (x < 20) OCR1A = 0; else OCR1A = x; } allerdings steigt die PWM ab dem Vergleichswert 20 relativ hart ein. Ein alernativer Weg wäre vielleicht, den Temperaturkoeffizienten doch negativ zulassen, bei 20°C etwas überhalb des maximalen Dreieckswertes zu initialisieren, also bei 9Bit PWM ist das Dreieck 511 hoch, dann die Vergleichsspannung bei 522 und diese dann runterfahren lassen. Der Wert darf dann natürlich nie auf 0 gehen, bzw darunter, weil das zu einem Underflow führen würde. ABer ich denke, ich kann das hardwaremäßig schon so einstellen und über eine if Anweisung trotzdem ein maximales PWM bei einer gewünschten Temperatur erzeugen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.