mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Beeinflussung von ADC Messungen


Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo in die Runde,

ich möchte gerne an zwei Kanälen jeweils eine ADC-Messung vornehmen.

1. Kanal PB2 Feuchte der Erde
2. Kanal PB4 Batteriespannung

Jede einzelne Messung für sich funktioniert super gut. Wenn ich jedoch 
beide Messungen hintereinander aufrufe beeinflusst die Messung am PB2 
(Feuchte der Erde) die Messung am PB4 (Batteriespannung). Die Messung am 
PB2 kann unter Umständen einen sehr hohen Wert haben (bis 980). Je höher 
die Messung am Kanal 1 ist je höher auch die Abweichung. Bei einem Wert 
am PB2 von 0 habe ich auch keine Abweichung an PB4 also je geringer die 
Messung desto geringer die Abweichung bei der zweiten Messung.

Ich habe hier schon vieles gefunden jedoch nichts was mein Problem 
gelöst hat.

Ich habe mehrere delay eingebaut um zu warten bis sich der ADC wieder 
eingestellt hat. Auch habe ich mehrere Messungen hintereinander 
ausgeführt jedoch ohne Erfolg.

Ich vermute ich habe einen Fehler im Code und sehe vor lauter Bäumen den 
Wald nicht mehr :-(

Hier mal der Code für den 1 Kanal an PB2
 void sensorlesen() {
  ADC = 0;
  y = 0;
  delay(250);
  ADMUX |= (1 << REFS0) | (1 << MUX0); 
  delay(250);
  ADCSRA |= (1 << ADEN);
  delay(250);
  ADCSRA |= (1 << ADSC) | (1 << ADPS2) | (1 << ADPS1);
  while (bitRead(ADCSRA, ADSC));
  adc_low = ADCL;
  adc_high = ADCH;
  adc_result = (adc_high << 8) | adc_low;
  y = adc_result;
  ADMUX &= ~(1 << REFS0);
  ADMUX &= ~(1 << MUX0);
  ADCSRA &= ~(1 << ADEN);
  
} 
und hier der Code für den 2. Kanal an PB4
void extern1() { //*****geht***** 
  ADC = 0;
  delay(250);
  ADMUX |= (1 << REFS0) | (1 << MUX1);    // Referenzspannung für den AD-Wandler an PB4
  delay(250);                  //warten bis sich die Referenzspannung eingestellt hat
  ADCSRA |= (1 << ADEN);            //ADC aktivieren 
  delay(250);
  for (int i = 0; i < 5; i++) {        //Mehrfachmessung dann verwerfen
    ADCSRA |= (1 << ADSC) | (1 << ADPS2) | (1 << ADPS1);
    while (bitRead(ADCSRA, ADSC));
    adcw = ADC;
  }
  ADCSRA |= (1 << ADSC) | (1 << ADPS2) | (1 << ADPS1);
  while (bitRead(ADCSRA, ADSC));
  adcw = ADC;
  vcc = ADC * 2.46 / 1024 * 11 * 1000;
  ADMUX &= ~(1 << REFS0);
  ADMUX &= ~(1 << MUX1);
  ADCSRA &= ~(1 << ADEN);
  
}

Hier der Aufruf in der loop()
 void loop()
{
  ID = 3;
  digitalWrite(strom, HIGH);
  extern1();
  sensorlesen();
  digitalWrite(strom, LOW);
  //Virtual Wire
  float h = vcc;                      // Wert1 Long in Float wandeln
  h_as_int = h;
  sprintf(daten, "%d,%d, %d", ID, adcw, h_as_int);
  vw_send((uint8_t *)daten, strlen(daten));
  vw_wait_tx();                      // Wait until the whole message is gone
  memset(daten, 0, sizeof daten);              // Inhalt der Variblen (char) löschen
  //Schlafen gehen
  for (int i = 0; i < 1; i++) {              //Hier schläft er jetzt 8 Sekunden 450 ist eine ca Stunde
    goToSleep ();
    
  }
}

Was mache ich hier falsch?

Viele Grüße
Torsten

: Bearbeitet durch User
Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Torsten,

verwende eine niederohmige Quelle, schließe deine Sensoren über (puffer) 
OPV mit vu=1 an.

Oder warte z.b. 1µs nach dem Umschalten des ADC-Eingangs, bevor die 
ADC-Messung angestoßen wird.
Auch hilft eine mehrfach Messung und anschließender Mittelwertbildung 
über 2^n Werte, mit n E {2,..,|N}.

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll der Unsinn mit dem ständigen ADC an und aus und Ref an und aus?
Setze einfach nur den Muxer neu.
Und schreibe ne Unterfunktion, der Du den MUX-Input übergibst und die 
den ADC-Wert returnt. Copy&Paste ist nur unnötig fehlerträchtig.
Die Delays hau alle raus.

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das deaktivieren des ADC und ändern der Referenz
ADCSRA &= ~(1 << ADEN);
ADMUX &= ~(1 << REFS0);
mach keinen Sinn!
Dadurch wird dann nach dem Aktivieren immer eine Dummywandlung notwendig 
!

Stimmt der ADC-Wandlungstakt nach dem Datenblatt ?

Warum schreibst Du da so ?
ADCSRA |= (1 << ADSC) | (1 << ADPS2) | (1 << ADPS1);
Der ADC-Wandlungstakt wird ja nicht geändert und gehört zur ADC-Init.
Schreibt man die ADC-Init neu, so kann man einfach einen neue 
ADC-Messung wie folgt starten:
ADCSRA |= (1 << ADSC);

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das noch der ATtiny85? Wenn ja, dann wird mit
> ADMUX |= (1 << REFS0) | (1 << MUX1);
"External Voltage Reference at PB0 (AREF) pin" benutzt, wie sieht dies 
aus?

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn mich meine mehr als mangelhaften C-Kenntnisse nicht täuschen, kommt 
der Messwert aus sensorlesen nur in loop an, weil "ADC und ADCW sind 
unterschiedliche Bezeichner für das selbe Registerpaar" gilt. Dann wäre 
aber
> adc_low = ADCL;
> adc_high = ADCH;
> adc_result = (adc_high << 8) | adc_low;
> y = adc_result;
in sensorlesen komplett für die Katz und
> adcw = ADC;
in extern1 ziemlich fragwürdig.

Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. Landolt schrieb:
> Ist das noch der ATtiny85? Wenn ja, dann wird mit
>> ADMUX |= (1 << REFS0) | (1 << MUX1);
> "External Voltage Reference at PB0 (AREF) pin" benutzt, wie sieht dies
> aus?

Ja richtig, es ist immer noch der Attiny85. Ich habe an PB0 einen LM336 
für die Referenzspannung zum VCC habe ich einen 2,2KOhm Widerstand nun 
erhalte ich 2,56 Volt. Damit habe ich nicht mehr das Problem bei 
sinkender Versorgungsspannung.

Karl M. schrieb:
> Stimmt der ADC-Wandlungstakt nach dem Datenblatt ?

Der Attiny85 läuft mit 8 MHz Teilungsfaktor ist 64 müsste eigentlich 
stimmen

Peter D. schrieb:
> Setze einfach nur den Muxer neu.
> Und schreibe ne Unterfunktion, der Du den MUX-Input übergibst und die
> den ADC-Wert returnt.

Okay werde das noch mal neu schreiben. Wenn ich zwischen MUX0 und MUX1 
wechsle muss ich dann nicht MUX0 deaktivieren also wieder auf 0 setzen 
oder habe ich dich falsch verstanden?

S. Landolt schrieb:
> Wenn mich meine mehr als mangelhaften C-Kenntnisse nicht täuschen, kommt
> der Messwert aus sensorlesen nur in loop an, weil "ADC und ADCW sind
> unterschiedliche Bezeichner für das selbe Registerpaar" gilt. Dann wäre
> aber
>> adc_low = ADCL;
>> adc_high = ADCH;
>> adc_result = (adc_high << 8) | adc_low;
>> y = adc_result;
> in sensorlesen komplett für die Katz und
>> adcw = ADC;
> in extern1 ziemlich fragwürdig.

Sorry, das verstehe ich leider nicht. adcw ist eine Int Variable der den 
Wert von ADC auslesen soll. Vielleicht bin ich hier total auf dem 
Holzweg?

Gruß
Torsten

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich interpretiere obiges Zitat auf dieser Seite 
http://www.mikrocontroller.net/articles/AVR_16-Bit-Register
so, dass ADCW bereits definiert und identisch zu ADC ist, eine Zuweisung 
an ADCW erscheint mir wenig sinnvoll.
  Und dann ist noch die Frage offen, wie der Messwert aus sensorlesen 
nach loop kommt wenn nicht durch ADCW.

Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. Landolt schrieb:
> dass ADCW bereits definiert und identisch zu ADC ist, eine Zuweisung
> an ADCW erscheint mir wenig sinnvoll.
>   Und dann ist noch die Frage offen, wie der Messwert aus sensorlesen
> nach loop kommt wenn nicht durch ADCW.

Sorry mein Fehler: Ich habe adcw klein geschrieben und als int 
definiert.
Werde aber in der neuen Version einen anderen Namen für die Variable 
nutzen. Nutze ich ADCW (also groß geschrieben)funktioniert es in der Tat 
nicht.

Wenn ich zwischen MUX0 und MUX1
wechsle muss ich dann nicht MUX0 deaktivieren also wieder auf 0 setzen?

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thorsten,

hinter der Kombination der MUXn stehen die verschiedenen ADC-Kanäle.
Wir denken in Kanälen, die einem Multiplex-Eingang aka MUXn entsprechen.

Also ja, Dein C Wissen musst Du um die Bitmanipulationen erweitern.

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl M. schrieb:
> Auch hilft eine mehrfach Messung und anschließender Mittelwertbildung
> über 2^n Werte, mit n E {2,..,|N}.

Das hilft gegen Rauschen, aber nicht gegen falsche Messungen.

Man kann natürlich so viele Messungen mitteln, dass der Fehler niemandem 
mehr auffällt, aber besser ist es, falsche Messungen gar nicht erst zu 
machen bzw. sie zu verwerfen, bevor sie das Endergebnis verfälschen 
können.

Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl M. schrieb:
> hinter der Kombination der MUXn stehen die verschiedenen ADC-Kanäle.
> Wir denken in Kanälen, die einem Multiplex-Eingang aka MUXn entsprechen.

Okay, das habe ich hoffentlich jetzt verstanden. Die Kanäle kann ich mir 
im Datenblatt unter Table 17-4. aussuchen bzw. die richtigen Bits 
setzen.

Ich habe jetzt mal folgendes probiert
void neu1() {
  ADMUX |= (1 << REFS0) | (1 << MUX0);          //Sensor an PB2
  ADCSRA |= (1 << ADPS2) | (1 << ADPS1);          //Teilungsfaktor 64
  ADCSRA |= (1 << ADEN);                  //ADC starten
  ADCSRA |= (1 << ADSC);                   //DUMMY erste Messung an PB2 starten
  while (bitRead(ADCSRA, ADSC));              //warten bis Messung beendet ist
  for (int i = 0; i < 4; i++) {              //Mehrfachmessung starten
    ADCSRA |= (1 << ADSC);
    while (bitRead(ADCSRA, ADSC));
    y += ADC;
  }
  y = y / 5;
  ADMUX &= ~(1 << MUX0);                  //MUX0 deaktivieren
  ADMUX |= (1 << MUX1);                  // Spannungsteiler an PB4
  ADCSRA |= (1 << ADSC);                  //Dummy zweite Messung an PB4 starten
  while (bitRead(ADCSRA, ADSC));              //warten bis Messung beendet ist
  for (int i = 0; i < 4; i++) {              //Mehrfachmessung starten
    ADCSRA |= (1 << ADSC);
    while (bitRead(ADCSRA, ADSC));
    adcwert += ADC;
  }
  adcwert = adcwert / 5;
  vcc = adcwert * 2.46 / 1024 * 3.3 * 1000;        //Umrechnug 
  ADMUX &= ~(1 << MUX1);                  //MUX1 deaktivieren
}

Allerdings ändert sich an meinen Problem nichts. Je höher die Messung an 
MUX0 ist desto schlechter wird das Ergebnis an MUX1.

Ist der Wert der Messung an MUX0 = 0 dann stimmt die Messung an MUX1.

Ich verstehe es nicht wo der Fehler ist?

Gruß
Torsten

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Torsten,

y = 0 !

und trenne die ADC-Init von der ADC-Wandlung.
Wie Peter schon schrieb, nutzen wir dazu eine Funktion mit 
Parameterübergabe des ADC-Kanals und mit Rückgabewert des 
Messergebnisses.

Fehler sonst: siehe meinen ersten Beitrag "OPV".

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten,

jetzt musst du auch einen Schaltplan und einige Bilder vom Aufbau 
posten..

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:
> Ich verstehe es nicht wo der Fehler ist?

Sind deine Signalquellen niederohmig genug?

Da deine Signale offensichtlich eher langsam sind, hilft evtl. auch ein 
Kondensator am jeweiligen Multiplexereingang, der beim Umschalten des 
Mux Ladung zum Umladen parasitäerer Kapazitäten liefert, ohne das die 
Spannung sich zu sehr ändert (aus Sicht des ADC).

Autor: Jobst M. (jobstens-de)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:
> Ich verstehe es nicht wo der Fehler ist?


Karl M. schrieb:
> trenne die ADC-Init von der ADC-Wandlung.


Schalte die MUX Bits bitte nicht einzeln. Wähle einen Kanal aus, indem 
Du ALLE MUX Bits korrekt setzt.

Also:

In der main während der Initialisierungsphase den ADC Konfigurieren. 1 
mal!

In der mainloop eine Funktion für ADC aufrufen mit Übergabe des 
Parameters, welcher Kanal gewandelt werden soll.

Diese Funktion setzt MUX auf den richtigen Kanal, startet eine Messung, 
verwirft diese, macht noch eine Messung und gibt diesen Wert zurück.


Gruß

Jobst

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:
> Ich verstehe es nicht wo der Fehler ist?

Da vor einigen Tagen die Ucc-Messung per interner Referenz auch eine 
unerklärliche Abweichung ergab, liegt die Vermutung nahe, dass die 
Hardware, also Netzteil, Aufbau etc., Probleme bereitet.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for (int i = 0; i < 4; i++) {              //Mehrfachmessung starten
    ADCSRA |= (1 << ADSC);
    while (bitRead(ADCSRA, ADSC));
    y += ADC;
  }
  y = y / 5;

Warum durch 5?

Autor: Torsten W. (toto1975)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen lieben Dank für die vielen Antworten


Karl M. schrieb:
> jetzt musst du auch einen Schaltplan und einige Bilder vom Aufbau
> posten..

Mein Schaltplan ist eventuell ein wenig unübersichtlich, es ist mein 
erster.

S. Landolt schrieb:
> a vor einigen Tagen die Ucc-Messung per interner Referenz auch eine
> unerklärliche Abweichung ergab, liegt die Vermutung nahe, dass die
> Hardware, also Netzteil, Aufbau etc., Probleme bereitet.

Könnte es daran liegen das PB1 den Spannungsteiler, Referenzspannung, 
und den Feuchtigkeitssensor mit Strom versorgt? Ich habe dies etwas 
unschöne Lösung mir ausgedacht da Die Schaltung möglichst Stromsparend 
sein soll.

Jobst M. schrieb:
> In der main während der Initialisierungsphase den ADC Konfigurieren. 1
> mal!

Also da sollte dann wohl dieses rein:
ADCSRA |= (1 << ADPS2) | (1 << ADPS1);          //Teilungsfaktor 64
ADCSRA |= (1 << ADEN);                  //ADC starten
ADMUX |= (1 << REFS0);

Jobst M. schrieb:
> Schalte die MUX Bits bitte nicht einzeln. Wähle einen Kanal aus, indem
> Du ALLE MUX Bits korrekt setzt.

Dies verstehe ich noch nicht. MUX0 und MUX1 kann ich doch erst in der 
Funktion setzen, oder?

Viele Grüße
Torsten

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:
> Mein Schaltplan ist eventuell ein wenig unübersichtlich, es ist mein
> erster.

Keine Abblock-Kondensatoren --> viele Störungen!

Autor: S. Landolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Könnte es daran liegen, dass PB1 ... versorgt
Spannungsteiler und Referenz sind erstmal vernachlässigbar, aber welchen 
Strom nimmt der Sensor auf?

Autor: W.A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:
> Mein Schaltplan ist eventuell ein wenig unübersichtlich, es ist mein
> erster.

Der wird übersichtlicher, wenn du die Versorgung überall nach oben und 
Gnd überall nach unten zeichnest (R2/R3, Sender, Feuchtigkeitssensor). 
Spannungsteiler zeichnet man ebenfalls so, dass das Potential von oben 
nach unten abnimmt (R1/IC1 senkrecht).

Ein Kondensator parallel zu R3 täte der Signalstabilität sicher gut.

Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jobst M. schrieb:
> Diese Funktion setzt MUX auf den richtigen Kanal, startet eine Messung,
> verwirft diese, macht noch eine Messung und gibt diesen Wert zurück.

Wie genau mache ich das? Unter 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe 
habe ich folgendes gesehen
 adcval = ADC_Read(0);  // Kanal 0
in der ADC_Read()
 // Kanal waehlen, ohne andere Bits zu beeinflußen
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);

dies verstehe ich leider nicht. In der ASCII Tabelle steht 0x1F für 31.

Bezieht sich der Kanal 0 auf den ADC0 an PB5?
0x1F ist dann wohl das Register? Also bei dem Attiny85 wäre 0x07 das 
ADMUX Register.

Wie kann ich auf andere ADC Kanäle umstellen?

Danke und Gruß
Torsten

: Bearbeitet durch User
Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten hast Du denn das Datenblatt des attiny85 für den ADC mal 
komplett gelesen ?
Und auch verstanden ?

Und was hatte ich zu den Kanälen schon geschrieben ?

16.13.1 ADMUX – ADC Multiplexer Selection Register
REFS1 REFS0 MUX5 MUX4 MUX3 MUX2 MUX1 MUX0

Table 16-4.
Single-Ended Input channel Selections.

ADC0 (PA0) entspricht MUX[5:0] = 000000 = 0 dezimal
:
ADC7 (PA7) entspricht MUX[5:0] = 000111 = 7 dezimal

Für den attiny85 entspricht dies dem setzen eines neuen single-endet ADC 
Kanals. Die alte/ vorherige Auswahl wird dabei wieder gelöscht.
#define ADC_MUX_MASK ((1<<MUX5)|(1<<MUX4)|(1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0))

#define ADC_SE_MUX_MASK ((1<<MUX2)|(1<<MUX1)|(1<<MUX0))

ADMUX = (ADMUX & ~ADC_MUX_MASK) | (channel & ADC_SE_MUX_MASK);

Hier musst du verstehen wir, und (&) negieren (~) und oder (|) 
funktioniert.

Torsten W. schrieb:
> Jobst M. schrieb:
>> Diese Funktion setzt MUX auf den richtigen Kanal, startet eine Messung,
>> verwirft diese, macht noch eine Messung und gibt diesen Wert zurück.
>
> Wie genau mache ich das? Unter
> https://www.mikrocontroller.net/articles/AVR-GCC-T...
> habe ich folgendes gesehen
>  adcval = ADC_Read(0);  // Kanal 0
> in der ADC_Read() // Kanal waehlen, ohne andere Bits zu beeinflußen
>   ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
>
> dies verstehe ich leider nicht.

> In der ASCII Tabelle steht 0x1F für 31.
>
> Bezieht sich der Kanal 0 auf den ADC0 an PB5 und was genau bedeutet
> 0x1F?

Ein attiny85 hat kein PB5

> Wie kann ich auf andere ADC Kanäle umstellen?
>
> Danke und Gruß
> Torsten

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry,

ich hatte das falsche Datenblatt auf.

Karl M. schrieb:
> Ein attiny85 hat kein PB5

ADMUX – ADC Multiplexer Selection Register
REFS1 REFS0 ADLAR REFS2 MUX3 MUX2 MUX1 MUX0

ADC0 (PB5) MUX[3:0] = 0000 binär = 0 dezimal
ADC1 (PB2) MUX[3:0] = 0001 binär = 1 dezimal
ADC2 (PB4) MUX[3:0] = 0010 binär = 2 dezimal
ADC3 (PB3) MUX[3:0] = 0011 binär = 3 dezimal
#define ADC_MUX_MASK ((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0))
ADMUX = (ADMUX & ~ADC_MUX_MASK) | (channel & ADC_MUX_MASK);

Autor: Torsten W. (toto1975)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl M. schrieb:
> ADC0 (PB5) MUX[3:0] = 0000 binär = 0 dezimal
> ADC1 (PB2) MUX[3:0] = 0001 binär = 1 dezimal
> ADC2 (PB4) MUX[3:0] = 0010 binär = 2 dezimal
> ADC3 (PB3) MUX[3:0] = 0011 binär = 3 dezimal
> #define ADC_MUX_MASK ((1<<MUX3)|(1<<MUX2)|(1<<MUX1)|(1<<MUX0))
> ADMUX = (ADMUX & ~ADC_MUX_MASK) | (channel & ADC_MUX_MASK);

Danke, genau das hat mir gefehlt.

S. Landolt schrieb:
> Spannungsteiler und Referenz sind erstmal vernachlässigbar, aber welchen
> Strom nimmt der Sensor auf?

Ich habe mir jetzt mal das "Datenblatt" von dem Feuchtigkeitssensor 
angeschaut 
(http://www.fut-electronics.com/wp-content/plugins/fe_downloads/Uploads/moisture-sensor-arduino.pdf).

Ich denke das Problem ist hier: "Output Voltage signal 0 - 4,2 Volt". Da 
meine interne Referenzspannung ja nur 2,46 Volt sind, könnte die Messung 
die andere Messung beeinflussen, oder? Zumindest kann die Messung an 
diesem Sensor ja nicht korrekt sein.

Wenn meine Vermutung richtig ist, könnte ich dann das Problem mit einen 
Spannungsteiler lösen oder welche Möglichkeiten habe ich hier noch?

Viele Grüße
Torsten

Autor: soul e. (souleye)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Torsten W. schrieb:

> Jede einzelne Messung für sich funktioniert super gut. Wenn ich jedoch
> beide Messungen hintereinander aufrufe beeinflusst die Messung am PB2
> (Feuchte der Erde) die Messung am PB4 (Batteriespannung). Die Messung am
> PB2 kann unter Umständen einen sehr hohen Wert haben (bis 980). Je höher
> die Messung am Kanal 1 ist je höher auch die Abweichung. Bei einem Wert
> am PB2 von 0 habe ich auch keine Abweichung an PB4 also je geringer die
> Messung desto geringer die Abweichung bei der zweiten Messung.

Das klingt nach Übersprechen. Du hast direkt an jedem ADC-Pin einen 
Kondensator (>4,7nF) vom Pin nach Masse? Direkt heisst Leitungslänge 
kleiner 1 cm?


Ein ADC erfasst das Messignal, indem er es in einem internen Kondensator 
zwischenspeichert. Dazu wird kurzzeitig viel Strom benötigt. Lange 
Leitungen stellen Induktivitäten dar, welche die Umladung behindern. 
Dann misst der ADC immer eine Art Mittelwert aus dem aktuellen und dem 
vorherigen Signal. Die Stützkondensatoren an den ADC-Pins machen die 
Quellen niederohmiger, was den Effekt reduziert.

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.