Stromverbrauch minimieren- welche Takfrequenz würde bei diesem Programm reichen?

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Stromverbrauch minimieren- welche Takfrequenz würde bei diesem Programm reichen?

      Hallo,

      ich möchte einen ATmega 328p für eine Batterieanwendung einsetzen,
      wo es wirklich auf jedes mA ankommt. Die Stromaufnahme sinkt ja
      stark bei kleinere Taktfrequenzen.
      Das Programm liest pausenlos ca. 250 Messwerte pro Sekunde und schickt sie
      über ein Bluetoothmodul an einen Rechner. Außerdem wartet es auf Befehle
      vom Rechner, um hin und wieder einen Pin zu schalten.
      Bloß mal so grob als Schätzung, wieviel MHz sollten es bei diesem Programm sein?
      Es läuft zZ. mit einem fertigen Modul mit 8MHz sehr stabil, allerdings bewirken
      die 8MHz ja eigentlich einen großen Baudratenfehler.
      Die Sache würde ich viel kleiner aufbauen und einen entsprechenden Baudratenquarz nehmen.
      Was würdet ihr sagen

      Gruß Ralf


      Source Code

      1. $regfile = "m328pdef.dat"
      2. $framesize = 32
      3. $swstack = 32
      4. $hwstack = 64
      5. $crystal = 8000000
      6. Baud = 57600
      7. Declare Sub Blinksequenz
      8. Config Adc = Single , Prescaler = Auto , Reference = Avcc 'AD Wandler initialisieren
      9. Start Adc
      10. Config Portd.7 = Output 'der Vibrationsmotor
      11. Reset Portd.7 'ausschalten
      12. On Urxc Onrxd
      13. Enable Urxc
      14. Enable Interrupts
      15. Dim Spannung As Word
      16. Dim Empfangen As String * 10
      17. Dim Vibr_flag As Boolean , Zaehler_vibr As Word
      18. Vibr_flag = 0
      19. Zaehler_vibr = 0
      20. Do
      21. Spannung = Getadc(0) 'Spannung messen
      22. Print "#5F" ; Spannung ; ";" 'Wert senden
      23. Waitms 4 'kurz warten
      24. If Vibr_flag = 1 Then
      25. Call Blinksequenz
      26. Vibr_flag = 0
      27. End If
      28. Loop
      29. Onrxd:
      30. Input Empfangen Noecho 'Zeichen einlesen
      31. If Empfangen = "I" Then
      32. Vibr_flag = 1
      33. End If
      34. Return
      35. Sub Blinksequenz()
      36. Set Portd.7
      37. Waitms 25
      38. Reset Portd.7
      39. Waitms 250
      40. Set Portd.7
      41. Waitms 25
      42. Reset Portd.7
      43. Waitms 250
      44. Set Portd.7
      45. Waitms 25
      46. Reset Portd.7
      47. End Sub
      48. End
      Display All
    • Das Baud = 57600 ist das Problem. Mit 8Mhz macht das schon unschöne 2% Fehler.
      Mit Quarz könnte er mit 461khz arbeiten. Per Osccal Abgleich mit 921,5 khz.
      Auch könnte er "schlafen" solange nichts zu tun ist. Jedoch ist mit der Mode nicht klar bei dem während des Schlafes der Uart funktioniert. Nur Idle?
      Möglicherweise geht auch Power-Down wenn Pin D.0 (RX) mit D.2(Int0) verbunden wird.
      Den Adc nur starten wenn er gebraucht wird (nach den Getadc ein Stop ADC)
      Der AC wird auch nicht benötigt (ACSR=128)
      Solange PortC nur Analog benutzt wird DIDR1=63 (alle Digital Treiber aus)

      The post was edited 2 times, last by Pluto25 ().

    • Hallo Pluto,

      vielen Dank für die Antwort!
      Ich würde ja einen Quarz einsetzen, wo kein Baudratenfehler auftritt.
      mikrocontroller.net/articles/Baudratenquarz

      Mir geht es nur darum, wie tief kann ich gehen?
      Mit 8MHz ging es seltsamerweise ohne Probleme, ich möchte jetzt aber eine neue
      Variante bauen, die so klein wie möglich ist, der Stromverbrauch soll
      minimiert werden.
      Power-Down geht gar nicht, der ATmega muß pausenlos messen und senden.
    • Ralf wrote:

      pausenlos
      Alle 4ms. Ist das nötig? Das bringt eine enorme Datenflut zu dem Empfänger. 16ms wäre die kleinste Schlafzeit (per Watchdog-Weckung)

      Ralf wrote:

      Mit 8MHz ging es seltsamerweise ohne Probleme,
      Nicht seltsam. 2% sind nur unschön, ab 5% gibts vereinzelt Bitfehler.

      1,84 Mhz ist der kleinste den ich auf die schnelle finden konnte? 1/4 davon würde auch gehen. Wobei sich die Frage stellt, ob der Quarz nicht mehr Strom braucht als der interne Generator?

      PS "Ultra" Dirty ist es den TX der zweiten Station als Ladeleitung zu mißbrauchen. So hatte ich ein Accu eines Thermometers über einen Laptop geladen.

      The post was edited 2 times, last by Pluto25 ().

    • Pluto25 wrote:

      Alle 4ms. Ist das nötig? Das bringt eine enorme Datenflut zu dem Empfänger. 16ms wäre die kleinste Schlafzeit (per Watchdog-Weckung)
      Es geht um EKG Signale, eine hohe Auflösung wäre schon günstig.
      Wie schon geschrieben, es ist ein gut funktionierendes Projekt und ich habe gerade Zeit und
      mich hat der Ehrgeiz gepackt.
      Der Mega 328 nimmt bei 4Mhz und 3V 1,7mA auf, das ist schon Klasse.
      Ich würde dann einen 3,6864 MHz Quarz nehmen, bloß ist der dann noch schnell genug?
    • Leider nicht, es ist ein HM-11 Bluetoothmodul.
      Ist aber nicht tragisch, ich bestell mir die infrage kommenden
      Quarze und teste es.
      Wäre denn der interne Oszillator genau genug, es kommen ja
      alle möglichen Baudraten infrage?
    • Zum Test kann er ja an einen Ttl2Usb an den PC.
      Bei mir arbeiten die internen von -10 bis 40°. Damit verstehen die sich untereinander und auch mit dem PC (falls der an ist). Ihr Clock wurde runter gesetzt (auf ca 922kHz) damit sie die Baudraten bis 115200 so schaffen das auch der PC mitreden kann.
      PS Basiert das Bluetooth Modul nicht auf einen ESP? Der kann beliebige Baudraten. Bruchzahlige würde der Mega gut hin bekommen mit 1MHz 125kBaud oder 62500Baud. (Bei 4Mhz bis 500kBaud)

      PPS Beim Blinken werden fast 100 Werte nicht gesendet. Ist das akzeptabel? Anderenfalls kann das Senden in einer Timer Isr ausgeführt werden. Die kann auch zum wecken genutzt werden. Soweit ich weiß aber nur bei Idle (ca halber Strom) .

      The post was edited 1 time, last by Pluto25 ().

    • Hallo Ralf,
      ich würde den Power-Save Mode nehmen und einen 32KHz Quarz an die entsprechenden Pins hängen.
      Timer2 kannst du dann zum Aufwecken nehmen.
      Dadurch kannst den Stromverbrauch während des Waitms 4 auf einige µA runterbringen, also zu vernachlässigen.
      Während der 1ms, die GETADC() und das Printen benötigt, verbraucht er dann die 1,7mA.
      Der tatsächliche Verbrauch insgesamt liegt dann bei 1,7mA/5, also etwa 0,34mA.

      Du kannst übrigens noch etwas rausholen, wenn du die baudrate auf 115200 bei 3,6864MHz Takt setzt.
      Allerdings braucht dabei die Konvertierung der Spannung in die Ausgabe so lange, dass das Print für die Berechnung unterbrochen wird.
      Dies kannst du vermeiden, indem du die max 4 zeichen selber berechnest.
      Da immer zwei zeichen bei der Ausgabe gepuffert werden, tritt so keine verzögerung auf.
      Damit kommst du dann auf einen Sendezeit von 0,68 Sekunden, also schon nur noch 1/6 der Gesamtzeit, somit weniger als 0,3mA insgesamt.

      The post was edited 1 time, last by Franz: Noch eine Idee ().

    • Franz wrote:

      einen 32KHz Quarz an die entsprechenden Pins hängen
      Das sind die selben die auch einen Baudquarz bekommen würden. :(
      Und per Osccal auf 3,6864Mhz zu kommen ist "abenteuerlich" - unmöglich? :D

      Die Konvertierung kann mit $lib "mcsbyteint.lib" auf ein Drittel verkürzt werden.
      Leider "schlampt" der Simulator mit dem Adc. (40Takte ist Quatsch es wären ca 5000).
      Die Zeit könnte zur Ausgabe genutzt werden :

      Source Code

      1. Config Serialout = Buffered , Size = 10
      2. ...
      3. Print "#5F" ;
      4. Spannung = Getadc(0)
      5. Print Spannung ; ";"
      6. ...
      Dann muß er aber ausgesprochen haben bevor er schlafen geht.
      Mit einer UTXC-Isr? Oder einer _RS_Bufcountw0 Abfrage?

      Wie würde er das "I" empfangen? Im Tiefschlaf höhrt der Uart nichts ?
      Im Idle wohl? Aber dann wäre die Ersparnis nur wenig :(
      Kann dem HM11 klargemacht werden das es nur sprechen darf (das I ) sobald es was hört?
    • Stiimmt, die ...8 haben ja so eine seltsame Pinbelegung.
      Bei einem M16 kein Problem.
      Aber ich würde jetzt den internen RC des M328P auch noch nicht vergessen.
      Mit einem M88P habe ich gerade mal versucht, 115200 zu schicken. Dazu musste ich den OSCCAL recht weit runterdrehen.
      Aber im Bereich von 5 - 25 hat hterm zuverlässig Daten bekommen.
      Muss man mal ausprobieren, ob die Stromersparnis damit klappt.

      Um im PowerSave den UART zu empfangen, muss man doch nur den PCINT des RX-Pins aktivieren.
    • Hallo,

      ganz herzlichen Dank für die vielen Tips!
      Ich habe mir ein paar ATmega328p und die infrage kommenden Quarze
      bestellt. Die ATmegas sind ja absolute Mangelware, bei Ebay habe ich aber
      noch einen Anbieter gefunden.
      Wenn die Teile da sind, werde ich erst mal Testen, bis zu welcher
      Quarzfrequenz das Programm stabil läuft.
      Dann kann ich das auch mit den Stromsparmodi testen.
      Wenn ich so ungefähr auf 2mA komme, geht das in Ordnung.
      Es hängt ja noch ein Bluetoothmodul dran, das braucht so 2,5 mA,
      Das EKG Modul bracht fast nichts.

      Gruß Ralf
    • Dann kommt das ja hin - ist auch wirklich weit. Keine Probleme mit dem EEprom bekommen? Irgendwo wird gewarnt das man die nicht zu sehr "tunen" soll a_56_df238249

      Ein Tiny kann während der Laufzeit seinen Takt (per Teiler 1,2,4,8Mhz) ändern. Der 328 auch? Ich hab nichts passendes gefunden. Selbst der div8 aus den Fuses ist nicht in einem Register hinterlegt?
    • Grundsätzlich kann man die AVR bis zu quasi 0 Hz runter takten. Nur bei 0 Hz taktet natürlich nix mehr. Auch klar.
      Man kann aber einen entprellten Taster zum Takten nehmen. Das geht. Soviel zur tiefsten Taktrate.

      Da aber ein UART im Spiel ist, braucht es einen Minimum Takt, um die gewünschte Baud-Rate zu erreichen.

      Typischerweise wird der Takt immer durch 16 geteilt, danach kommt das Baudrateregister.
      Bedeutet im Umkehrschluss, wenn ich Baudrateregister (Teiler = 1) einstelle, dann sollte man das 16-fache der Baudrate als Minimum-Takt haben.

      Also bei 57600 Baud braucht es dann minimum 57600 x 16 = 0,9216MHz. Nur solche Quarze gibts wohl kaum. Dann nimmt man ein Vielfaches davon (x2, x3, x4 ... usw.), was man über den Baudrateteiler einstellt. z.B. Teiler = 4. Dann kommt man auf das Baudratequarz 3,686400 Baud. Vielleicht findest du was mit x2 oder x3?

      Es gibt noch ein Flag bei der Uart-Baudrate x2. Wenn man das setzt, muss man die gewünschte Baudrate *8 als Mindesttakt ansehen. Dann kommt noch der Baudrate-Teiler.

      Mit diesem Wissen kann man sich ne Tabelle (Excel) machen und die möglichen Quarze finden.

      Ich würde aber in jedem Fall ein Quarz nehmen, um die Übertragung nicht durch drifftende Oszillatoren (wie den internen RC-Oszillator) zu gefärhden.
    • Pluto25 wrote:

      Die Übertragung "verträgt" einiges an Drift (siehe #11).
      Mir kannst ja egal sein. Ob der Code nachher sauber läuft. Ich gebe hier nur gute tipps.
      Ein Quarz oder Schwinger ist immer besser als der interne RC-Oszillator, der
      nach Datenblatt von Spannung und Temperatur abhängig ist.
      Ist auch weniger Aufwand als im nachhinein Spannung zu messen und Temperatur und das versuchen zu kompensieren.
      Das wäre nur Symptombehandlung.

      War da nicht mal irgendwo ein Thread, wo man den RC-Oszillator als Temoeraturmesser wegen der Temperaturabhängigkeit verwendet hat?