Go Down

Topic: Analogeingang absichern (Read 3798 times) previous topic - next topic

uwefed

Hallo hk007

Da hab ich Dir nicht den besten Ratschlag gegeben. Ich habe den Spannungsabfall durch den Strom der Zenerdiode, wenn sie leitend wird, weil die Zenerspannung erreicht wird nicht bedacht. Entschuldige bitte meinen Fehler.

Die Lösung einen 250 Widerstand zu nehmen fine ich eine gute Lösung.
Da hättest Du 1V bei 0 bar und 2,6V bei 4 bar.
Um den ganzen A/D Bereich auszunutzen könntest Du die interne Referenz von 1,1V, die 3,3V des Spannungsstabilisators oder eine Spannungteiler um die 3,3V auf 2,6V zu bringen, verwenden.

Interne Referenz 1,1V : Widerstand zur Spannungsmessung (R1/R2) 100 Ohm; da hast Du auch noch ein wenig mehr als 4 bar messen (bis 4,375 bar).

Externe Referenz 3,3V: Widerstand zur Spannungsmessung 317 Ohm; weiß jetzt nicht auswendig welcher 1% Widerstandswert am nächsten kommt. Falls Du keine Verbraucher an 3,3V hast solltest Du einen Widerstand hinschalten damit ca 5mA fließen und so der Spannungsstabilisator besser arbeitet.

Bei 2,6V Spannungsteiler braucht Du 250 Ohm. Der Spannungteiler muß aber auch mit 1% Widerstände gemacht werden und kann etwas niederohmig sein damit an den 3,3V etwas Strom fließt und so der Spannungsstabilisator besser arbeitet.

In allen 3 Fällen kann der Analogeingang bei 5V Spannungsversorgung des ATmega ohne Probleme 5V bekommen. Der ADC-Wert wird zwar 1023 sein, aber der Eingang geht nicht kaput. Die Schaltung kann gleich bleiben ( außer anderen Widerstandswert für R1/R2)

Grüße Uwe

fckw

Ein so hochwertiger Sensor hat doch fast schon einen kaufbaren I/U Wandler (4-20mA/0-5V) verdient... :P

hk007

Quote
Da hab ich Dir nicht den besten Ratschlag gegeben. Ich habe den Spannungsabfall durch den Strom der Zenerdiode, wenn sie leitend wird, weil die Zenerspannung erreicht wird nicht bedacht. Entschuldige bitte meinen Fehler.

Du brauchst dich doch dafür nicht entschuldigen. Ich (und auch viele andere) sind um jeden Ratschlag von dir froh. Dafür opferst du auch viel Freizeit.
Hätt auch selber drauf kommen können, bevor ich rumlöte.

Aber nochmal zur Referenz. Das hab ich noch nicht so ganz kapiert. Da ist viel graues Halbwissen bei mir.
In dem AnalogInput-Beispiel wird mit der Referenz gar nix gemacht, und da sieht es aus, als ob mit dem Poti 0-5V eingelesen werden, und die ergeben dann 0-1023 digits

Hab grad den "analogReference(type)" Befehl entdeckt. Jetzt versteh ich wenigstens, wie man dem Mega mitteilt, welche Referenz er verwenden soll

Seh ich das jetzt richtig:
Fall 1:
Code: [Select]
analogReference(INTERNAL2V56): a built-in 2.56V reference (Arduino Mega only)
Würde bedeuten, keine externe Spannung an AREF. Ich verwende einen 250R Widerstand um 1-5V an den Arduino Analogeingang zu bekommen.
Und ich bekomme: 0..2,56V = 0-1023 digits sowie 2,57..5V werden immer als 1023 dargestellt

Fall2:
Code: [Select]
analogReference(default)
Würde bedeuten, keine externe Spannung an AREF. Ich verwende einen 250R Widerstand um 1-5V an den Arduino Analogeingang zu bekommen.
Und ich bekomme: 0..5V = 0-1023 digits

Aber die Referenzeinstellung gilt für alle Kanäle gleich, oder kann man die selektiv einstellen. (Wohl nicht)

Quote
Externe Referenz 3,3V: Widerstand zur Spannungsmessung 317 Ohm

Das haut aber nicht hin oder? WorstCase-Betrachtung: 20mA über 317R sind 6,34V  :smiley-eek-blue:



Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

hk007


Ein so hochwertiger Sensor hat doch fast schon einen kaufbaren I/U Wandler (4-20mA/0-5V) verdient... :P


Ich hab die Widerstände (4x1K) ja auch gekauft. :P
OK,ok damit könnte ich die untere Grenze von 1V nach 0V runterziehen. Aber ehrlich gesagt, ist das mir das Geld nicht wert.

"Hochwertiger Sensor" Ja, mag sein, aber ich hab ihn halt günstig in der Bucht geschossen.
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

#19
Feb 14, 2013, 02:34 am Last Edit: Feb 14, 2013, 02:38 am by uwefed Reason: 1

Quote
Da hab ich Dir nicht den besten Ratschlag gegeben. Ich habe den Spannungsabfall durch den Strom der Zenerdiode, wenn sie leitend wird, weil die Zenerspannung erreicht wird, nicht bedacht. Entschuldige bitte meinen Fehler.

Du brauchst dich doch dafür nicht entschuldigen. Ich (und auch viele andere) sind um jeden Ratschlag von dir froh. Dafür opferst du auch viel Freizeit.
Hätt auch selber drauf kommen können, bevor ich rumlöte.

Danke  ;) ;)

Quote from: hk007

Aber nochmal zur Referenz. Das hab ich noch nicht so ganz kapiert. Da ist viel graues Halbwissen bei mir.
In dem AnalogInput-Beispiel wird mit der Referenz gar nix gemacht, und da sieht es aus, als ob mit dem Poti 0-5V eingelesen werden, und die ergeben dann 0-1023 digits

Standartmäßig sind die 5V Versorgungspannung als Referenzspannung für den AD-Wandler aktiviert. Braucht nicht extra angegeben werden.

Quote from: hk007

Hab grad den "analogReference(type)" Befehl entdeckt. Jetzt versteh ich wenigstens, wie man dem Mega mitteilt, welche Referenz er verwenden soll

Hab nicht mitgekriegt, daß Du einen Mega hast.

Quote from: hk007

Seh ich das jetzt richtig:
Fall 1:
Code: [Select]
analogReference(INTERNAL2V56): a built-in 2.56V reference (Arduino Mega only)
Würde bedeuten, keine externe Spannung an AREF. Ich verwende einen 250R Widerstand um 1-5V an den Arduino Analogeingang zu bekommen.
Und ich bekomme: 0..2,56V = 0-1023 digits sowie 2,57..5V werden immer als 1023 dargestellt

Ja, richtig.

Quote from: hk007

Fall2:
Code: [Select]
analogReference(default)
Würde bedeuten, keine externe Spannung an AREF. Ich verwende einen 250R Widerstand um 1-5V an den Arduino Analogeingang zu bekommen.
Und ich bekomme: 0..5V = 0-1023 digits

Ja, richtig, aber dann kannst Du die Schutzschaltung nicht so verwenden wie beschrieben, da sie ab ca 4V nicht mehr linear ist.

Quote from: hk007

Aber die Referenzeinstellung gilt für alle Kanäle gleich, oder kann man die selektiv einstellen. (Wohl nicht)

Ja, für alle Kanäle gleich, Du kannst sie aber im Programm vor jeder Messung ändern, falls Du nur interne Referenzspannungen verwendest und die ersten 2 ADC-Read nach dem Umschalten verwirfst.

Quote from: hk007

Quote
Externe Referenz 3,3V: Widerstand zur Spannungsmessung 317 Ohm

Das haut aber nicht hin oder? WorstCase-Betrachtung: 20mA über 317R sind 6,34V  :smiley-eek-blue:

Das war für 4 bar maximal gemessener Druck berechnet (4 bar entsprechen 3,3V). Habe ich da wieder etwas falsch verstanden oder wolltest Du nicht nur 4 bar messen?

Grüße Uwe

hk007

Quote
analogReference(default)
Würde bedeuten, keine externe Spannung an AREF. Ich verwende einen 250R Widerstand um 1-5V an den Arduino Analogeingang zu bekommen.
Und ich bekomme: 0..5V = 0-1023 digits
Ja, richtig, aber dann kannst Du die Schutzschaltung nicht so verwenden wie beschrieben, da sie ab ca 4V nicht mehr linear ist.

??? Bei 250R brauch ich doch keine Schutzschaltung, da bei 20mA nicht mehr als 5V am Widerstand abfallen.

Quote
Aber die Referenzeinstellung gilt für alle Kanäle gleich, oder kann man die selektiv einstellen. (Wohl nicht)
Ja, für alle Kanäle gleich, Du kannst sie aber im Programm vor jeder Messung ändern, falls Du nur interne Referenzspannungen verwendest und die ersten 2 ADC-Read nach dem Umschalten verwirfst.

Ja, hab mir gestern auch noch überlegt, ob man die Einstellung im Loop nicht immer wieder änden kann. Aber wieso muss/soll ich die ersten 2 ADC-Read verwerfen? Dauert das Umschalten so lange? Müssen es genau 2 ADC-Read sein?
Die Variante gefällt mir am besten.
An den ersten ADC häng ich meinen Drucksensor mit 250Ohm und ziehe den unteren Messbereich mit interner Ref von 2,56V auf. Wenn der Druck größer als "2,56V" wird, dann lauf ich halt in die Begrenzung des AD-Wandlers. Das ist kein Problem, da dies nicht dem normalen Zustand der Anlage entspricht.
An den zweiten kann ich dann noch ein "normales" 0-5V Signal hängen und da mit der "Standard-5V-Referenz" wandeln.
Es sind eh nur niederfrequente Signale (Druck / Temperatur).

Quote
Externe Referenz 3,3V: Widerstand zur Spannungsmessung 317 Ohm
Das haut aber nicht hin oder? WorstCase-Betrachtung: 20mA über 317R sind 6,34V  smiley-eek-blue
Das war für 4 bar maximal gemessener Druck berechnet (4 bar entsprechen 3,3V). Habe ich da wieder etwas falsch verstanden oder wolltest Du nicht nur 4 bar messen?

Ja richtig. Ich bin aber davon ausgegangen, daß der Sensor max 10bar bei 20mA liefert. Mir war dann der Schutz des ADC wichtiger als die Auflösung. Sonst hätte ich mir das ja alles sparen können, und den Sensor an 500R hängen und hoffen, daß ich nicht über 5bar (=12mA->5V) komme.



Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

uwefed

Quote
An den ersten ADC häng ich meinen Drucksensor mit 250Ohm und ziehe den unteren Messbereich mit interner Ref von 2,56V auf. Wenn der Druck größer als "2,56V" wird, dann lauf ich halt in die Begrenzung des AD-Wandlers. Das ist kein Problem, da dies nicht dem normalen Zustand der Anlage entspricht.

Wenn der Druck zu hoch ist und übersteuert kannst Du immernoch den Druck mit 5V Referenz messen und so den genza Meßbereich haben. Aber Achtung: Die 5V sind nicht so sicher 5V. Je nach Spannungsversorgung kann das ein wenig varieren und zu Meßfehlern führen. Udo Klein hat letzten Monat einen Sketch gepostet um intern die Versorgungsspannung zu messen. Alternativ kannst Du mit einem Spannungsteiler die 5V halbieren und mit einem weiteren analog-Eingang mit 2,56V Referenz messen. So kennst Du dann genau den Wert der 5V Spannung. 

Quote
Aber wieso muss/soll ich die ersten 2 ADC-Read verwerfen? Dauert das Umschalten so lange? Müssen es genau 2 ADC-Read sein?

Sicher ist die erste Messung falsch. Die 2. müßte richtig sein, aber was kostet es dich auch diese zu ignoriern und ein 3. Mal messen. Es ist sowieso zu erwägen mehrere Messungen der Analogwerte zu machen (5 oder 10) und den Mittelwert zu nehmen.
Du kannst ja mal ein kleines Beispiel programmieren und sehen wie es sich verhält.

Quote

??? Bei 250R brauch ich doch keine Schutzschaltung, da bei 20mA nicht mehr als 5V am Widerstand abfallen
.
Vom Meßwert her nicht.

Grüße Uwe


hk007

Hallo,

abschliessende Betrachtung:
Ich habe jetzt die Variante 250Ohm und die interne Referenz von 5V genommen. Das gibt (wie schon von marau prognostiziert) eine Auflösung von 12mbar. Das ist für meine Messaufgabe mehr als ausreichend.
Den Analogeingang hab ich dann an 2 Punkten (1V und 5V) kalibriert.
Um Schwankungen zu vermeiden habe ich eine Art PT-Glied eingebaut (Na ja es ist keine richtige e-Funktion, aber ihr wisst schon was ich meine). Da ich nur alle Sekunden messe und keine schnellen Druckänderungen erwarte ist dies m.E. optimal.
Code: [Select]
void DruckSensor (){
   int val = analogRead (0);
   val = map(val, 200, 1019, 0, 10000); // Normierung in mbar
   Druck = (Druck * 2.0 + (float)val /1000.0) / 3.0; //Umwandlung in bar und Signaldämpfung.
}


Ach ja: Wer mit Analogwertverarbeitung rumbastelt, dem sei der map-Befehl empfohlen. Ich kannte den noch nicht, und habe gerade an einem entsprechenden Skaliertreiber programmiert, als ich ihn zufälligerweise gefunden habe.

Danke noch mal an alle für eure Ideen und Hilfe
Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

OE1KLA

Die Spannung an den Eingängen darf um 0.6V höer als die Betriebsspannung sein, somit ist eine Absicherung ganz einfach zu lösen.
Ein Vorwiderstand und eine Shotkydiode reichen allemal. Der Eingangwiderstand der Analogeingänge ist sehr Hochohmig, also ein Widerstand so zwischen 10k und 100k in serie zum
Eingang und die Diode nach Plus. Vor dem Vorwiderstand kann man so ziemlich alles machen wenn die Spannung nicht sehr zu hoch wird (bis so 15-20V).
Viel Erfolg bei euren Basteleien.

Karl (OE1KLA)

bello12

Habe das mal nachgebaut Software mässig der umgerechnete wert wird aneinen pwm ausgang ausgegben Wenn ich aber am eingang weniger als 2V anlege bekomme ich negativ werte am ausgang.
Wie kann ich das ändern .
Gruß bello12

uwefed

das ist logisch
val = map(val, 200, 1019, 0, 10000); // Normierung in mbar
Sieht keine Werte unter 200 vor ( ca 1V mit spannungsteiler 2V).

oder welchen Sketch verwendest Du?

Grüße Uwe

bello12

Habe noch einen pwm ausgang hinzugfügt. Wenn ich jetzt aber den messunformer abklemme bekomme ich am pwm ausgang eine negtiven wert den kann ich dort nicht gebrauchen. Gibts da noch ein trick.
Gruß bello12

uwefed

Du könntest schreiben
if(val <0) val=0;

grüße Uwe

bello12

Dnke für die Lösung funktioniert.
Gruß bello12

Go Up