www.mikrocontroller.net

Forum: Analoge Elektronik und Schaltungstechnik ADC auf Spannungsdifferenz beziehen


Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joachim (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Die Brücke sollte eigentlich klar sein, hie habe ich mal einen 
Schaltplan angehängt. Bitte nur die Brücke unten links beachten.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ?

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
**auf die schulter klopf**

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.