Forum: Mikrocontroller und Digitale Elektronik Atmega324A "Datenlogger" - ein paar Fragen u.A. zu Konzepten für Versorgung und Verbrauch


von Daniel N. (natulo)


Angehängte Dateien:

Lesenswert?

Guten Abend,

ich möchte mit einem Mikrocontroller (Atmega324A oder 324PA) über den 
eingebauten AD-Wandler Spannungen im Bereich von 0...5V (4x) und 0...24V 
(2x) und über einen Shunt Ströme bis 20A (2x) mit einer Tastfrequenz von 
1kHz messen. Die Messwerte sollen auf einem HD44780 Display angezeigt 
und über SPI auf einer SD-Karte abgespeichert werden.

Versorgen möchte ich das Ganze über einen USB-Anschluss (stationär am 
PC) und mit AA-Batterien oder Akkus (Mobil).

Die Hauptkomponenten der Schaltung wären:
Atmega324A oder 324PA
FT232R für Kommunikation über USB
HD44780 Display mit Beleuchtung
RTC: DS1307 o.Ä.
zwei LEDs
SD Karte
ggf. Pegelwandler für SPI Bus
4 Taster an interne Pullups

- Eine Frage zur Wahl 324A oder 324PA:
Der 324PA verbraucht etwas weniger Strom als der A. Durch welchen 
Nachteil erkauft er sich das gegenüber dem 324A?

http://www.atmel.com/Images/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf

Auf Seite 321 sieht man den niedrigeren Verbrauch, in den Diagrammen ab 
389 / 415 sehe ich jedoch keinen Unterschied mehr.

- Eine Frage zur Migration vom Atmega32 zum Atmega324A:
Bisher habe ich mit einem Atmega32 experimentiert und würde jetzt zu 
einem 324A greifen. Für den Atmega32 habe ich jetzt schon ein Programm 
geschrieben. Für die Migration zum "324P" habe ich die App Note 
gefunden: (der 324A sollte ja identisch sein?)
http://www.atmel.com/Images/doc8001.pdf

Das kritischste was ich gesehen habe ist unter Punkt 4, I/O Mapping and 
SRAM:
"The  ATmega164P/324P/644P internal data SRAM addressing starts at 0x100 
as opposed to 0x60 in ATmega16/32."

Ich programmiere den Mikrocontroller mit dem Atmel Studio 6. Bevor ich 
das Programm später auf den neuen Controller flashen kann, muss ich im 
aktuellen Projekt den Controller wechseln. Wird der Adressbereich dann 
automatisch umgeschrieben oder muss man das irgendwo manuell einstellen?

Jetzt zur Kernfrage, der Versorgung:
Die Schaltung soll entweder über USB (4,4V...5,5V) oder über 6x AA 
Batterien oder Akkus (also 7,2V bzw. 9V) betrieben werden.
Dabei soll die USB Spannung bevorzugt werden.

- Stromverbrauch:
Als groben Überschlag würde ich vom folgenden Verbrauch ausgehen:
µC: <20mA bei 14,7456 / 16 MHz
2 LEDs: 40mA
HD44780 LCD beleuchtet: 20mA
SD Karte: 100mA (bei 3,3V)
RTC+Pegelwandler+Current Amp: <5mA

Wenn ich nichts übersehen / vergessen habe, wären das in Summe 185mA.
Kommt das in etwa hin? Wie viel Reserve sollte man da einrechnen?



Für die Versorgung der Schaltung hätte ich zwei Ansätze: (Skizze im 
Anhang)
Ansatz 1) Den µC mit 5V betreiben und die SD-Karte mit 3,3V:
Die 9V der Batterien gehen auf einen LDO oder Buck, der sie auf 5V 
runtersetzt.
Dazu kommt die ~5V USB Versorgung, die den LDO/Buck über den SHDN Pin 
abschaltet und sich dann nach einem P-FET als "ideale Diode" mit dem 
Ausgang des LDO/Buck trifft und den µC versorgt.
Dort werden mit einem weiteren LDO 5V -> 3,3V für die SD Karte 
generiert.

Überschlag Verluste im Worst-Case am LDO:
Pv1 = (9V-5V)*0,2A = 800mW
Pv2 = (5V-3,3V)*0,1A = 170mW

Vorteil: höhere Taktfrequenz möglich, Kontrastspannung für Display 
unproblematisch
Nachteil: braucht einen Pegelwandler für den SPI zur SD-Karte (reicht 
bei einer SD Karte eigentlich ein Unidirektionaler oder muss er 
bidirektional sein?)


Ansatz 2) Die gesamte Schaltung mit 3,3V betreiben:
Die 9V gehen mit einem LDO oder Buck auf 3,3V runter. Hier müsste ich 
mir dann überlegen, wie ich den 9V Pfad mit einem FET öffnen kann, wenn 
die USB Spannung aktiv ist.
Die USB Spannung geht, wie in Ansatz 1, über eine "ideale Diode" 
ebenfalls an den LDO/Buck.

Überschlag Verluste im Worst-Case am LDO:
Pv = (9V-3,3V)*0,2A = 1,14W

Vorteil: SD Karte kann direkt vom µC angesteuert werden
Nachteil: niedrigere Taktfrequenz (max. 12MHz?), mehr Aufwand bei 
Kontrastspannung am Display (sowas wie ICL7660?) oder die PWM Variante 
(Ladungspumpe?), ich brauche noch eine Ansteuerung für einen FET als 
Schalter im 9V Pfad


Welche der beiden Varianten würdet ihr als "sinnvoller" erachten?
Würdet ihr bei den zu erwartenden Strömen (sofern ich nichts übersehen 
habe) noch Linearregler nehmen oder direkt einen Buck-Converter? (für 
die 9V->5V/3,3V)

Allgemeine Frage:
Nach welchen Kriterien würdet ihr die Taktfrequenz festlegen?
Bisher habe ich 14,7456MHz genommen. Für UART super, um auf glatte 
Interrupts in Zehnerpotenzen (hier 10^-3) zu kommen jedoch nicht ideal, 
da eine kleine Abweichung bleibt.


Wäre super, wenn jemand ein paar meiner Fragen beantworten und ein paar 
Tips geben könnte. :)


Schöne Grüße

von Carol (Gast)


Lesenswert?

Und wofür sind 10^-3 bei einem µC gut?

Dadrin funktioniert alles mit Binärzählern, die Zahl 1000 ist
dort nicht "rund". 1024 schon eher...

von S. Landolt (Gast)


Lesenswert?

Ein ATmega1284P mit seinen 16 KiB RAM wäre angebrachter, denn eine 
SDCard kann beim Schreiben durchaus mal bis zu einer halben Sekunde 
verzögern: 4+2+2 = 8 Kanäle mal 1 oder 2 Bytes bei 1 kHz sind 4 oder 8 
kB in 0.5 s, der ATmega328 hat nur 2 KiB.

> 2 LEDs: 40mA
Dienen diese zu Beleuchtungszwecken?

> Nachteil: niedrigere Taktfrequenz
Wo steht etwas von der Notwendigkeit eines hohen Taktes? Oder anders 
gefragt, warum wären z.B. 11.059 MHz (bei 3.3 V) zu langsam?

> ...I/O Mapping...
Das interessiert eigentlich, wenn überhaupt, nur Assemblerprogrammierer, 
der C-Compiler erledigt das. Die betreffenden Zugriffe werden einen Tick 
langsamer, spielt fast nie eine Rolle.

von Daniel N. (natulo)


Lesenswert?

Carol schrieb:
> Und wofür sind 10^-3 bei einem µC gut?
>
> Dadrin funktioniert alles mit Binärzählern, die Zahl 1000 ist
> dort nicht "rund". 1024 schon eher...

Für die Abtastrate von 1kHz wollte ich jede Millisekunde einen Interrupt 
auslösen, der dann über ein Flag im Hauptprogramm die Wandlung anstößt.
Darum die "10^-3" = 1ms. Wenn ich mich nicht vertan habe bräuchte ich 
dafür mit Timer1 im CTC Modus ein OCR1A von 14744,6 (nach ocr1a = [ 
f_cpu / (prescaler * f_interrupt) ] -1 ), was nicht machbar ist. Wobei 
die Abweichung sehr klein ist, womöglich vernachlässigbar. (ca. 
-0,0027%/+0,0041%)





S. Landolt schrieb:
> Ein ATmega1284P mit seinen 16 KiB RAM wäre angebrachter, denn eine
> SDCard kann beim Schreiben durchaus mal bis zu einer halben Sekunde
> verzögern: 4+2+2 = 8 Kanäle mal 1 oder 2 Bytes bei 1 kHz sind 4 oder 8
> kB in 0.5 s, der ATmega328 hat nur 2 KiB.
>


An den Zugriff auf die SD-Karte habe ich nicht gedacht. Ich hatte 
gedacht, dass man einmalig auf die SD-Karte zugreift und "aktiv" hält 
und dann einfach dauerhaft die Werte draufschreibt, wenn sie gerade 
kommen.
Nach dem was du geschrieben hast vermute ich, dass man die Werte in dem 
RAM schreibt und dann in Intervallen als Ganzes auf die SD-Karte 
schreibt?

Dafür würde ich mit meinem bisherigern Ansatz dann ziemlich viel RAM 
brauchen, denn ursprünglich sollten die Telegramme die ich abspreichern 
wollte so aufgebaut sein: (und so hatte ich sie Testweise per UArt 
verschickt.)
1
Sensorname _ dd.mm.yy _ hh:mm:ss.ms _ Wert \n
2
    5       1     5    1     8       1  2    1
Das wären dann nach meiner Rechnung 24 Byte pro Messwert und Kanal 
gewesen.
Wenn man das zwischenspeichern müsste, würden da ja absurde Datenmengen 
anfallen. Demnach müsste ich das Telegramm entschlacken, nur am Anfang 
Datum ect. senden und danach mit einer Laufnummer arbeiten.
Kann man auf der SD-Karte problemlos zwischen mehreren Textdateien als 
Zielort wechseln oder muss man das alles in eine Datei schreiben?

>> 2 LEDs: 40mA
> Dienen diese zu Beleuchtungszwecken?

Die eine LED ist als Status-LED für das Programm und die andere liegt 
hinter der Versorgung und soll signalisieren, dass das Gerät 
eingeschaltet ist. Für den Zweck würden die wahrscheinlich auch mit 
weniger Strom noch ausreichend hell sein.

>> Nachteil: niedrigere Taktfrequenz
> Wo steht etwas von der Notwendigkeit eines hohen Taktes? Oder anders
> gefragt, warum wären z.B. 11.059 MHz (bei 3.3 V) zu langsam?

Bei der Taktfrequenz bin ich mir ehrlichgesagt nicht sicher, wie viel 
ich da brauche, da ich dazu keine Erfahrungswerte habe. Daher auch die 
Frage, nach welchen Kriterien man die festlegen würde.


>
>> ...I/O Mapping...
> Das interessiert eigentlich, wenn überhaupt, nur Assemblerprogrammierer,
> der C-Compiler erledigt das. Die betreffenden Zugriffe werden einen Tick
> langsamer, spielt fast nie eine Rolle.

Gut, dann sollte das keine Probleme machen. Bin auf das Thema gestoßen 
und war mir nicht sicher ob das dramatisch wäre.
Beitrag "Atmega324A Probleme bei FET Steuerung"


Bis hierhin schonmal Danke für die Antworten und noch einen schönen 
Sonntag.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> Zugriff auf die SD-Karte ... einfach dauerhaft die Werte draufschreibt
Genauso mache ich es, übrigens völlig ohne Dateisystem; trotzdem treten 
diese Pausen bis 0.5 s auf, ohne Unterschied zwischen no-name und etwas 
besseren Samsung-SDCards.

> in Intervallen als Ganzes auf die SD-Karte
Nein, kontinuierlich per FIFO.

> problemlos zwischen mehreren Textdateien als Zielort wechseln
Ich denke schon, warum nicht, wenn man ein entsprechendes Dateisystem 
verwendet, z.B. von ElmChan.

> LED ist als Status-LED
Nur als Beispiel, weil ich sie zuletzt verbaut habe: KM2520ZGC-G01 von 
Kingbright (schön klein, trotzdem bedrahtet) sind bei direktem 
Sonneneinfall noch bei 150 uA lesbar.

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.