Go Down

Topic: [Gelöst] ADC: Analog Reference im Free Run Mode (Read 225 times) previous topic - next topic

Verzweifler

Oct 11, 2018, 07:32 pm Last Edit: Oct 11, 2018, 09:09 pm by Verzweifler
Hi!

Ich nutze den ADC eines Arduino Nano im free run mode, um ein Audiosignal zu sampeln.

Der Vorverstärker hängt an einem externen 3,3 Volt Regler, der ADC soll nun diese 3,3 Volt auch als Referenz nutzen.

Problem - Das ganze Verträgt sich nicht so ganz:

Übrigens: Den Free Run Code hab ich aus der OpenmusicLabs FFT Lib geklaut.

Code: [Select]

  //Setup ADC:
  analogReference(EXTERNAL);
  ADCSRA = 0xe5; // set the adc to free running mode
  ADMUX = 0x40; // use adc0
  DIDR0 = 0x01; // turn off the digital input for adc0

  //Read ADC:
  while (!(ADCSRA & 0x10)); // wait for adc to be ready
  ADCSRA = 0xf5; // restart adc
  byte m = ADCL; // fetch adc data
  byte j = ADCH;
  sample = (j << 8) | m; // form into an int  


Problem hierbei: ARef gibt nun 5 Volt aus, also seine Normale Referenz, das macht aber den Regler unnötig.

Auch "analogReference(EXTERNAL);" nach dem Setup zu setzen nutzt nichts.

Für Codeschnipsel dafür wäre ich dankbar.

combie

Quote
Auch "analogReference(EXTERNAL);" nach dem Setup zu setzen nutzt nichts.
Die Referenz wird erst beim analogRead() aktiviert.

Quote
ARef gibt nun 5 Volt aus,
Und die wirst schon die 3,3V an ARef anschließen müssen.
Vom messen kommen da keine 3,3V hin
Schreie nach Besserem, bis du es auch erhältst.
Das noch Bessere verabschiedet sich rechtzeitig vor deinem Lärm.

Quelle: Martin Gerhard Reisenberg

Verzweifler

Und die wirst schon die 3,3V an ARef anschließen müssen.
Vom messen kommen da keine 3,3V hin
Ups, da hab ich mich wohl unklar ausgedrückt. Ich hab die 3,3 Volt schon da angschlossen. Der Pin gibt die
dann an die Verstärkungselektronik weiter.

Also wenn ich nun "analogReference(EXTERNAL);" aufrufe wird intern nur ein Flag gesetzt, dass dann hinter den Kulissen des "analogRead(A0);" genutzt wird.

Kann ich dann "analogReference(EXTERNAL);" noch in meinen Auslesecode einfügen oder muss ich Control Register verändern, wenn ja, welche?

postmaster-ino

Hi

ARef ist ein EINGANG, dort gibst Du die Ref-Spannung drauf, damit der Arduino mit Dieser vergleichen kann.
Deinen Post verstehe ich so, daß Du dort gerade die 3,3V abgreifen willst für weitere externe Baugruppen.

MfG

Serenifly

Was willst du da mit der Arduino Funktion? Völlig überflüssig. Die Referenz wird über zwei Bits im ADMUX Register gesetzt. REFS0 und REFS1

Mit ADMUX = 0x40 machst du das schon, aber der Kommentar stimmt nicht ganz

Damit es gut lesbar und änderbar ist verwendet man da keine kryptischen Zahlen, sondern die Bit-Namen:
Code: [Select]

ADMUX = _BV(REFS0);

Verzweifler

#5
Oct 11, 2018, 08:21 pm Last Edit: Oct 11, 2018, 08:29 pm by Verzweifler
Hi

ARef ist ein EINGANG, dort gibst Du die Ref-Spannung drauf, damit der Arduino mit Dieser vergleichen kann.
Deinen Post verstehe ich so, daß Du dort gerade die 3,3V abgreifen willst für weitere externe Baugruppen.

MfG
Ja, eigentlich ist ARef ein Eingang für die Referenzspannung, ABER wenn nun wie in meinem Fall die 5 Volt Betriebsspannung des Arduinos genutzt werden, werden eben diese (ATMega intern) auf den ARef Anschlusses des ADC gegeben.
Durch einen Schutzwiderstand im Atmega ist der ARef am Aref Pin mit der Aussenwelt verbunden.

Heist kompakt:

Weil die 5 Volt am ADC anliegen, kommen diese auch zum ARef-Pin wieder raus.
Vom ARef-Pin fürt eine Leitung zu meiner Restlichen Elektronik, welche eigentlich dazu gedacht ist um die 3,3 Volt des Reglers zu ARef zu führen. Da ARef Atmega intern mit 5 Volt verbunden sind, fließen diese aus dem ARef-Pin in meine Elektronik.

Ungläubige Mutige dürfen gerne mal ihr Multimeter zwischen GND und ARef halten.
Bei "analogReference(EXTERNAL);" misst man 0 Volt.

Hab ich mal irgendwo gelesen, mal schauen, ob ich das auf die Schnelle finde.
Erste Antwort:https://electronics.stackexchange.com/questions/30549/atmega328-external-aref-connection

@Serenifly:
Das ist das was ich suche! Dankeschön, funktioniert aber nicht?!


Verzweifler

Ich habs mal versucht mit:
Code: [Select]
ADMUX = _BV(REFS1);
Das ist wohl
Code: [Select]
analogReference(INTERNAL);
Ohne irgendwas dran angeschlossen zu haben kamen die 1,1 Volt raus.

Wenn ich da nun den Draht von meinem 3,3 Volt Regler anschließe sind an dem Pin nun 3,3 Volt und alles Funktioniert so wie es soll.

Nur sind so nun 3,3 Volt auf dem Atmega internen 1,1 Volt Regler, aber die brauch ich ja eh nicht.

Oder gehts auch ohne obigen Pfusch?

Serenifly

#7
Oct 11, 2018, 08:41 pm Last Edit: Oct 11, 2018, 08:47 pm by Serenifly
Quote
Nur sind so nun 3,3 Volt auf dem Atmega internen 1,1 Volt Regler, aber die brauch ich ja eh nich
Vorsicht. Das ist natürlich Pfusch

Ich hatte da einen Fehler gemacht und die Tabelle falsch gelesen. Tut mir leid. Du musst da auch mal ins Datenblatt schauen. Da steht das alles drin.

Code: [Select]

RFS1  RFS0   Modus
  0       0         AREF
  0       1         Vcc, mit Kondensator an AREF entkoppeln
  1       0         reserviert
  1       1         interne 1,1V, mit Kondensator an AREF


Korrekt für die externe Referenz wäre also das ganze ADMUX Register auf 0! Dein Beispiel Code verwendet die 5V Versorgung als Referenz

Da muss man schon aufpassen. Der Grund weshalb die Spannung herausgeführt wird ist damit man sie mit einem Kondensator mit Masse verbinden kann. Aber damit kann man auch Kurzschlüsse fabrizieren wenn man eine Spannung anschließt und intern 5V auswählt

Verzweifler

@Serenifly

Dankeschön!

Jetzt funktionierts.

Um das Datenblatt richtig nutzen zu können muss ich mir noch das Bitgeschubse anlernen, naja ein andermal.

Also Danke für deine Hilfe

Ciao

Go Up