Forum: Mikrocontroller und Digitale Elektronik Setzen der analogen Referenz für die ADC's des ATmega328P


von Simon H. (hornez777)


Lesenswert?

Hallo Community,

ich habe meinen ATmega328P neu geflasht, sodass er mit einem internen 
Takt von 8MHz läuft. Der Sinn dahinter war, dass ich den µC unabhängig 
vom Arduino Uno Board betreiben kann. Das hat auch soweit funktioniert 
und er reagiert auf digitale Signale etc. Das Arduino Uno Board benutze 
ich dabei als ISP, um meine Programme auf den geflashten µC zu laden.
Nun möchte ich analoge Spannungswerte von einem Spannungsteiler an 2 der 
6 ADC's einlesen. Dies konnte ich auf dem Arduino Uno Board problemlos 
realisieren, da für die ADC's standardmäßig eine Referenzspannung von 5V 
vordefiniert ist.
Wie ist das nun bei dem geflashten µC? Reicht es, wenn ich ein Programm 
hochlade, in dem der Befehl analogReference(EXTERNAl) steht, oder muss 
ich das spezifisch mit Register setzen machen, also z.B.:

void setup()
{
 // Select Vref=AVcc
 ADMUX |= (1<<REFS0);
 //set prescaller to 128 and enable ADC
 ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);
}

Und falls ich die Register so setzen muss, kann ich dann diese Befehke 
in die setup-Funktion der Arduino IDE schreiben, oder muss ich dafür 
noch Bibliotheken includen?

Vielen Dank.

von Rainer U. (r-u)


Lesenswert?

Simon H. schrieb:
> Wie ist das nun bei dem geflashten µC?

Also DU hast den Bootloader entfernt beim flashen und den Takt 
verändert. Das Ändert an der Hardware ja erstmal nichts und 
analogReference(EXTERNAl) sollte ausreichen / lässt sich ja auch einfach 
testen.

Nur mal INteressehalber, weil ich ein paar R3-Clones rumliegen habe: Wie 
flasht Du denn jetzt Dein Programm .hex auf den Chip? Mit einem externen 
ISP?

von Einer K. (Gast)


Lesenswert?

Rainer U. schrieb:
> analogReference(EXTERNAl)

Wieso EXTERNAL ?
Beim UNO ist es auch nicht EXTERNAL sondern DEFAULT.
Also intern zu AVcc geschaltet.

von Simon H. (hornez777)


Lesenswert?

Hallo Rainer,

Rainer U. schrieb:
> Nur mal INteressehalber, weil ich ein paar R3-Clones rumliegen habe: Wie
> flasht Du denn jetzt Dein Programm .hex auf den Chip? Mit einem externen
> ISP?


Ich verwende das Arduino Board als ISP. Ich habe mich dabei an die 
Anleitung auf folgender Seite gehalten: 
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

Auf dieser Seite ist einmal das Flashen beschrieben, woraufhin der µC 
mit einem externen 16 MHz Quarz betrieben werden kann und einmal das 
Flashen, woraufhin der µC mit einem internen Takt von 8MHz läuft. Das 
Problem ist nur, dass einem diese Vorgehensweise wenig Eigenspielraum 
zur Verfügung stellt, da man auf diese zwei Optionen festgesetzt ist, 
obwohl ja der ATmega328 mit einigen anderen internen oder externen 
Takten laufen könnte.

Rainer U. schrieb:
> analogReference(EXTERNAl) sollte ausreichen / lässt sich ja auch einfach
> testen.

Hättest du eine Idee, mit der man überprüfen kann, ob die Einstellungen 
übernommen wurden?

von Simon H. (hornez777)


Lesenswert?

Arduino F. schrieb:
> Beim UNO ist es auch nicht EXTERNAL sondern DEFAULT.

Ja beim Uno ist DEFAULT eingestellt. Das ist richtig. Das Problem ist 
nur, dass die DEFAULT-Einstellung eine 5V-Referenzspannung für 
ADC-Funktionen festlegt. Wenn der ATMega-Chip vom Board getrennt und 
"selbstständig" läuft, dann kann allerdings maximal 1,1V als chipinterne 
Referenzspannung gewählt werden. Wenn ich nun 5V Referenzspannung haben 
möchte, muss ich diese extern hinzuschalten (am Besten von AVCC auf 
AREF). Deshalb brauche ich den Code zur Einstellung einer externen 
Referenz.

von Einer K. (Gast)


Lesenswert?

Simon H. schrieb:
> Arduino F. schrieb:
>> Beim UNO ist es auch nicht EXTERNAL sondern DEFAULT.
>
> Ja beim Uno ist DEFAULT eingestellt. Das ist richtig. Das Problem ist
> nur, dass die DEFAULT-Einstellung eine 5V-Referenzspannung für
> ADC-Funktionen festlegt. Wenn der ATMega-Chip vom Board getrennt und
> "selbstständig" läuft, dann kann allerdings maximal 1,1V als chipinterne
> Referenzspannung gewählt werden. Wenn ich nun 5V Referenzspannung haben
> möchte, muss ich diese extern hinzuschalten (am Besten von AVCC auf
> AREF). Deshalb brauche ich den Code zur Einstellung einer externen
> Referenz.

Du sprichst in Rätseln....
Warum tut es DEFAULT nicht?
Deine Begründung verstehe ich nicht...

Tipp:
Wenn der µC auf 3,3V o.ä. läuft, solltest du Aref keinesfalls mit einer 
höheren Spannung beaufschlagen. Also keine 5V anklemmen.

von Sven L. (svenl)


Lesenswert?

Wer sucht, der wird im Datenblatt fündig, meinst Du nicht?

Ich, an Deiner Stelle, würde mich schnellstens von der Arduino-IDE 
entfernen und das Atmel Studio mit AVR-GCC nehmen.

Du hast dann zwar keine schicken Bibliotheken mehr, bist aber auch nicht 
auf die Funktionalitäten dieser "festgenagelt". Du kannst Dir für 
sämtliche Funktionalitäten selbst Deine Bibliotheken schreiben. Nach 
einiger Zeit hast Du auch den Dreh raus, dass Du die Bibliotheken so 
schreibst, dass sie nur noch irgendwo eine external Timer-Variable oder 
ähnliches brauchen und mit ein paar Defines die Anschlüsse festgelegt 
werden.

Nicht irgendwelche Tutorials oder Webseiten sind Dein 
Hauptnachschlagewerk im Umgang mit dem Controller, sondern das 
Datenblatt und die Application Notes zum Controller. Dort steht wirklich 
alles sehr gut beschrieben.

Viele Grüße!

Sven

von Einer K. (Gast)


Lesenswert?

Sven L. schrieb:
> Ich, an Deiner Stelle, würde mich schnellstens von der Arduino-IDE
> entfernen und das Atmel Studio mit AVR-GCC nehmen.
>
> Du hast dann zwar keine schicken Bibliotheken mehr, bist aber auch nicht
> auf die Funktionalitäten dieser "festgenagelt".

Hier hast du ein "Projektionsproblem".

Mit der Arduino IDE ist man keinesfalls auf die Nutzung der Arduino Libs 
festgelegt. Mit einem "Fingerschnipps" hat man der IDE beigebogen, den 
Kram draußen zu halten.

Also:
Es gibt auch mit der IDE ein Leben neben delay() und digitalXXXX().

von Sven L. (svenl)


Lesenswert?

Hallo Fanboy! ;)

Ja, das ist mir schon klar! Aber die Arduino-IDE als "IDE" zu bezeichnen 
ist ja schon fast eine L*ge! Das ist ein Texteditor mit 
Syntax-Highlighting, mehr nicht!

Von einer IDE erwarte ich einfach viel mehr Dinge! Mit einer 
vernünftigen IDE, sei es Atmel Studio oder Eclipse, bist Du einfach 
deutlich produktiver.

Viele Grüße!

Sven

von Einer K. (Gast)


Lesenswert?

Sven L. schrieb:
> Mit einer
> vernünftigen IDE, sei es Atmel Studio oder Eclipse, bist Du einfach
> deutlich produktiver.

Teil 1:
DU vielleicht.
Für mich gilt dein DU nicht.

Teil 2:
Zum Thema "Arduino bashing"...
Wenns dich glücklich macht, weiter so..


----------------------

Wenne auch sonst etwas verbohrt erscheinst, in einem haste recht:
Welche IDE auch immer, wenns ans Eingemachte geht, sollte man schon 
Datenblätter lesen können.

----------------------------

Sven L. schrieb:
> ist ja schon fast eine L*ge!
Hast du nicht gerade gelogen?

von Rainer U. (r-u)


Lesenswert?

Simon H. schrieb:
> Hättest du eine Idee, mit der man überprüfen kann, ob die Einstellungen
> übernommen wurden?

Ja, ganz einfach - Du legst an den ADC eine Spannung von 1V an und 
misst. Wenn Du ungefähr 205 (1024 / 5) erhältst, ist Deine Referenz 5V. 
Wenn Du irgendwas > 800 erhältst, ist Deine Referenz 1.1V

von Rainer U. (r-u)


Lesenswert?

Simon H. schrieb:
> Ich verwende das Arduino Board als ISP. Ich habe mich dabei an die
> Anleitung auf folgender Seite gehalten:
> https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

Ach so meinst Du, ich dachte Du lässt den Chip auf dem Board - ja dann 
musst Du noch den ARef -Pin beschalten, wie oben schon erwähnt.

Aber warum soll man das tun - auf dem Arduinp ist doch schon ein Quarz 
fertig mit drauf?

von Einer K. (Gast)


Lesenswert?

Rainer U. schrieb:
> Aber warum soll man das tun -

Da kann ich nur für mich sprechen....
Der Aufbau des UNO ist für Prototypaufbauten schon nicht schlecht. Nutze 
ich gerne. Am Ende kommt dann meist ein Standalone ATMega, mit internem 
Takt zum Einsatz. Oder ein Pro Mini, denn der ist meist billiger, als 
einzelne ATMegas.

von Simon H. (hornez777)


Lesenswert?

Rainer U. schrieb:
> Ja, ganz einfach - Du legst an den ADC eine Spannung von 1V an und
> misst. Wenn Du ungefähr 205 (1024 / 5) erhältst, ist Deine Referenz 5V.
> Wenn Du irgendwas > 800 erhältst, ist Deine Referenz 1.1V

Cool hat funktioniert vielen Dank.

von Simon H. (hornez777)


Lesenswert?

Rainer U. schrieb:
> Aber warum soll man das tun - auf dem Arduinp ist doch schon ein Quarz
> fertig mit drauf?

Das ist richtig, aber wie Fanboy schon sagt

Arduino F. schrieb:
> Am Ende kommt dann meist ein Standalone ATMega, mit internem
> Takt zum Einsatz.

So ist es bei mir auch. Erstens ist das Arduino Uno Board viel zu groß, 
um es in das Gehäuse meines Projektes zu integrieren und zweitens 
verbraucht der µC deutlich weniger Strom (ca. 20mA), als auf dem Arduino 
Board (ca. 120 mA).

von Manfred (Gast)


Lesenswert?

Arduino F. schrieb:
> Der Aufbau des UNO ist für Prototypaufbauten schon nicht schlecht. Nutze
> ich gerne. Am Ende kommt dann meist ein Standalone ATMega, mit internem
> Takt zum Einsatz. Oder ein Pro Mini, denn der ist meist billiger, als
> einzelne ATMegas.

Ich setze den Nano ein, na gut, kostet 50ct mehr als ein Pro Mini. Dafür 
habe ich USB permanent verfügbar und kann diesen bei Bedarf auch am 
Gerät verfügbar machen: 
http://www.aliexpress.com/item/5PCS-Mini-USB-5pin-Male-to-USB-B-Female-panel-mount-type-Cable-20cm-with-screws/32375947985.html

Simon H. schrieb:
> So ist es bei mir auch. Erstens ist das Arduino Uno Board viel zu groß,
> um es in das Gehäuse meines Projektes zu integrieren

Der Uno hatte zu Zeiten des DIL-Gehäuses noch einen Sinn, aber das 
versetzte Raster der Steckverbinder ist eine Unverschämtheit. Mit dem 
(China-SMD) habe ich meine ersten Gehversuche gemacht, mehr nicht.

> und zweitens
> verbraucht der µC deutlich weniger Strom (ca. 20mA), als auf dem Arduino
> Board (ca. 120 mA).

Was machst Du verkehrt? Ich klemme meinen China-Uno samt 16x2-Display 
ans Labornetzteil und bekomme unter 35mA, nix 120mA.

Vom ProMini habe ich die Power-LED und den Spannungsregler abgelötet, da 
bleiben mir 15mA, wenn der mit Nichtstun in der Loop rennt - Deine 20mA 
passen also.

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.