Forum: Analoge Elektronik und Schaltungstechnik ADC auf Spannungsdifferenz beziehen


von Joachim (Gast)


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.

von johnny.m (Gast)


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.

von Joachim (Gast)


Angehängte Dateien:

Lesenswert?

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

von Joachim (Gast)


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.

von Joachim (Gast)


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 ?

von johnny.m (Gast)


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.

von Joachim (Gast)


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.

von Matthias (Gast)


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...

von johnny.m (Gast)


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....

von Joachim (Gast)


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.

von Matthias (Gast)


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...

von Joachim (Gast)


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.

von Joachim (Gast)


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

von johnny.m (Gast)


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.

von Joachim (Gast)


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.

von Matthias (Gast)


Lesenswert?

**auf die schulter klopf**

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.