Forum: Mikrocontroller und Digitale Elektronik ATTiny45 + LED an Solarzelle


von Stefan K. (sdwarfs)


Lesenswert?

Hallo,

ich habe hier eine Testanwendung für Solarbetrieb, bei der der 
"Einschaltvorgang" nicht so recht funktionieren will.

Es handelt sich um einen AVR (ATTiny45) und eine LED (an einem IO-Pin) 
mit einer Solarzelle (3V nominal, 2 Elkos mit 47µF zum Puffern) als 
Energieversorgung.

Test-Anwendung: Der AVR soll die LED nur kurz (15ms) "anschalten" und 
dann für 1 Sekunde schlafen gehen (wird per Watchdog-Timer aufgeweckt) 
und danach wieder von vorn beginnen (also Endlosschleife: sehr kurzes 
Aufleuchten, lange Pause).

Problem: Das ganze funktioniert solange die Spannung (gleich nach der 
Programmierung des AVR) über 1,8V bleibt. Ich kann also die externe 
Spannungsversorgung abklemmen und die LED blinkt (wenn auch sehr dunkel) 
und die Versorgungsspannung pegelt sich bei ~1,98V ein (Solarzelle 
liefert nominal 3V, ist aber gerade in einer schlecht beleuchteten 
Wohnung).

Wenn ich nun testweise die Solarzelle abklemme sinkt die 
Versorgungspannung (gemessen mit Voltmeter) langsam unter 1,8V und ab 
~1,2V sinkt sie dann ganz ruckartig ab auf ~0,8V und bleibt dort. Wenn 
ich nun die Solarzelle wieder anklemme, steigt die Versorgungspannung 
auf ~1,2V an und hängt dort fest (schwankt um +/- 20 mV, eher 
Messwertrauschen).

Auch eine Verzögerung von 8 Sekunden (PowerDown-Sleep-Mode) am Anfang 
des Programms hilft nicht.  Auch wenn ich die LED abklemme kommt die 
Versorgungsspannung nicht mehr über 1,2V.

Was hilft: Die externe Spannungsversorgung (5V) kurz anschließen. Danach 
läuft alles wieder und pendelt sich bei ~1,8V ein.

== Programmdetails: ==
Peripherie wird beim Startup sofort abgeschalten (d.h. ADC, Timer0+1, 
USI; danach: BOD, AC + Spannungsreferenz; auch wird DigitalInputDisable 
für alle IO-Pins aktiviert). Danach geht der AVR für 8 Sekunden 
schlafen, damit im Falle einer "Unterspannung" sich die Kondensatoren 
erst einmal etwas aufladen können.

Dann Endlosschleife:
* IOPin mit LED wird auf "OUTPUT" und "HIGH" geschalten
* 15ms WatchDog-PowerDown-Sleep
* IOPin mit LED wird auf "INPUT" geschalten (***)
* 1s WatchDog-PowerDown-Sleep

(***) Erklärung: Der IO-Pin wird auf INPUT umgeschalten, um nicht 
Energie aufzuwenden, um das Spannungslevel abzusenken. Die (kleine) 
Kapazität in der LED soll also genutzt werden, um noch etwas 
nachzuleuchten.

== FRAGE ==
Was kann man da tun, damit ein normales Einschalten per Solarversorung 
funktioniert?
Meine aktuelle Idee dazu wäre: Kann man vllt. irgendwie verhindern, dass 
der AVR anläuft, wenn weniger als 1,8V Spannungsversorgung anliegen? 
D.h. dass solange die Spannung < 1,8V ist der AVR z.B. Stromlos 
geschalten wird oder sowas?
Vllt muss man auch irgendwie eine Reset-Leitung irgendwie "anklemmen"?

von Lucky (Gast)


Lesenswert?

Vielleicht klappt es schon mit einem ATtiny45V und geringerem 
Systemtakt.

von Stefan K. (sdwarfs)


Lesenswert?

Lucky schrieb:
> Vielleicht klappt es schon mit einem ATtiny45V und geringerem
> Systemtakt.

Also ich hab mal 128kHz Systemtakt probiert. Verhält sich immer noch so. 
Ich denke zudem, dass die "V" Varianten das gleiche Problem haben, nur 
halt bei nem niedrigerem Spannungslevel.
Das Löst also wahrscheinlich das Problem nicht.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du solltest vermutlich den BOD aktivieren, damit der Tiny nach einem 
Spannungseinbruch wieder in einen definierten Zustand kommt. Für mich 
klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc. 
Obacht, wenn die Solarzelle dann richtig Strom liefert (Wolke vor der 
Sonne geht weg) und der Tiny ist in seinem Zwischenstadium, könnten 
recht hohe Ströme fliessen, natürlich nur, wenns eine kräftige Zelle 
ist.
Du könnest auch überlegen, ob du einen kleinen Zwischenpuffer aus Akkus 
oder einem Goldcap integrierst.

von Stefan K. (sdwarfs)


Lesenswert?

Matthias Sch. schrieb:
> Du solltest vermutlich den BOD aktivieren, damit der Tiny nach einem
> Spannungseinbruch wieder in einen definierten Zustand kommt.
BOD mit 1,8V hab ich probiert. Ohne Erfolg. Hatte die BOD während des 
"Power Down" deaktiviert... testweise aktiviert. Kein Erfolg.

> Für mich
> klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc.

Ein Latch-Up sollte doch eher bei "Überspannung" auftreten, oder?


> Obacht, wenn die Solarzelle dann richtig Strom liefert (Wolke vor der
> Sonne geht weg) und der Tiny ist in seinem Zwischenstadium, könnten
> recht hohe Ströme fliessen, natürlich nur, wenns eine kräftige Zelle
> ist.

Ja, das würde dann natürlich sinn machen... da reicht bestimmt auch ne 
kleine Schaltung mit ner 4.7V Z-Diode. Hab ich testweise probiert (4.7V 
Z-Diode parallel zur Solarzelle, "|"-Markierung in Richtung des 
Pluspols).

> Du könnest auch überlegen, ob du einen kleinen Zwischenpuffer aus Akkus
> oder einem Goldcap integrierst.
Denke das würde das Problem eher nicht beheben. Denn das Problem ist, 
dass es -irgendwann- immer vorkommen kann, dass mal nicht genug Sonne 
ist und dann ist auch ein Akku oder Goldcap leer.
Zudem funktioniert es auch nicht "initial" ... d.h. wenn die Batterie 
bzw. der Goldcap noch nicht aufgeladen ist und die Spannung dann langsam 
ansteigt.

-- NACHTRAG: --
Nach meinen aktuellsten Recherchen ist die langsam steigende Spannung 
das Problem. Damit der POR (Power On Reset) sauber funktioniert, muss 
der Spannungsanstieg laut Datenblatt mindestens 0.1 V pro Millisekunde 
betragen.

Sprich: Wir brauchen eine Schaltung, die ab einer bestimmten 
Grenzspannung (z.B. bei > 1.8V) die Spannung zuschaltet und sonst 
abschaltet. Könnte z.B. ein Transistor erledigen. Da ich aber mit 
Analog-Schaltungen noch zu wenig Erfahrungen habe, muss ich mich hier 
wohl auch wieder erst mal belesen. Werde mal bissl recherchieren und 
dann per LTSpice testen, wie sich eine Testschaltung (einfacher 
Transistor richtig rein geklemmt) bzgl. des Spannungsanstiegs auf dem 
"Ausgang" verhält.

von Stefan K. (sdwarfs)


Lesenswert?

PS: Danke für deinen Beitrag Matthias ...

von Gäste (Gast)


Lesenswert?

Vllt hilft ja ein Komparator in Verbindung mit normalen und schottky 
Dioden..
Der könnte dann den Transistor sauber schalten, dass du nicht irgendwo 
im nicht linearen Teil der Kennlinie bist.

von Stefan K. (sdwarfs)


Lesenswert?

== nächster Nachtrag ==
Also es haben wohl welche über nen P-Kanal MOSFET gelöst, der aber von 
der Schaltspannung ziemlich genau stimmen muss.

Was auch nicht funktioniert:
1. den AVR extern/manuell zu einen Reset zu verpassen (Puls mit 
RESET-Pin an GND); Dabei bricht Vcc nochmal ordentlich ein. 
Wahrscheinlich hängt also der AVR in einer Art Reset-Schleife. Und beim 
Reset verbrät er wahrscheinlich Unmengen an Energie, die verhindern, 
dass das Spannungslevel sich weit genug erhöhen kann.
2. BOD auf 2.7V war ebenso erfolglos.
3. Hab auch mal SUT = 00 probiert, also schneller Startup ohne Delay; 
mit 1.8V BOD und BOD disabled.

Das ärgert mich jetzt schon ein wenig, dass wegen einer langsam 
steigenden Versorgungsspannung noch mehr externe Komponenten nötig sind.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Bloß so ein Gedanke... keine Ahnung, ob er sinnvoll ist:

Wenn du den /RESET-Pin über einen Spannungsteiler immer auf ca. 60 oder 
70% der Versorgungsspannung hältst, vielleicht bringt das etwas.

Oder – du hängst zwischen VCC und /RESET eine Diode. Damit liegt /RESET 
immer ca. 0,6 Volt unter VCC. Notfalls nimmst du zwei Dioden oder eine 
Z-Diode.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan K. schrieb:
>> Für mich
>> klingt das nach einem Latch-Up durch den Betrieb mit undefinierter Vcc.
>
> Ein Latch-Up sollte doch eher bei "Überspannung" auftreten, oder?

Vllt. ist Latch-Up nicht der richtige Ausdruck. Ich meine den Zustand, 
das in der Gegentaktendstufe des I/O Pins beide FETs leiten und damit 
einen hohen Querstrom produzieren.
Was mir gerade noch einfällt: Wie sind denn die Pegelverhältnisse an den 
I/Os generell? Da ist nichts dran, was versehentlich noch Strom in den 
Prozessor leitet, wie eine LED oder so? Dadurch wird evtl. der MC über 
die internen Schutzdioden gespeist, statt über den Vcc Pin. In diesem 
speziellen Fall solltest du überlegen, ob es nicht besser ist, LEDs 
gegen Masse zu schalten und nicht wie sonst üblich gegen Vcc.

von Stefan K. (sdwarfs)


Lesenswert?

Markus W. schrieb:
> Wenn du den /RESET-Pin über einen Spannungsteiler immer auf ca. 60 oder
> 70% der Versorgungsspannung hältst, vielleicht bringt das etwas.
>
> Oder – du hängst zwischen VCC und /RESET eine Diode. Damit liegt /RESET
> immer ca. 0,6 Volt unter VCC. Notfalls nimmst du zwei Dioden oder eine
> Z-Diode.

Die Idee hatte ich auch schon (zumindest den Spannungsteiler). Da aber 
ein manueller Reset (auch) nix bringt, wird das wohl ebenso 
fehlschlagen.

Die Idee mit der Diode find ich auch gut. Hab ich zumindest wieder eine 
Variante mehr in Reportoir für solche Dinge...

von Stefan K. (sdwarfs)


Angehängte Dateien:

Lesenswert?

Matthias Sch. schrieb:
> Was mir gerade noch einfällt: Wie sind denn die Pegelverhältnisse an den
> I/Os generell? Da ist nichts dran, was versehentlich noch Strom in den
> Prozessor leitet, wie eine LED oder so? Dadurch wird evtl. der MC über
> die internen Schutzdioden gespeist, statt über den Vcc Pin. In diesem
> speziellen Fall solltest du überlegen, ob es nicht besser ist, LEDs
> gegen Masse zu schalten und nicht wie sonst üblich gegen Vcc.

Ich habe nun doch mal die grundlegende Schaltung als Schaltbild 
gezeichnet. Siehe Anhang... Leider sind auch in diesem Programm nicht 
alle Bauteile drin, die ich eigentlich habe. Deswegen ist der ATTiny85 
(statt ATtiny45) im Schaltbild und die Solarzelle ist als 
"Peltierelement" eingetragen.

Die IC-Eingänge Reset, ADC1 (SCLK), PWM1/0 (MISO/MOSI) hängen am 
SPI-Port des Programmers (Arduino-Board). Hab den Programmer aber schon 
mal abgeklemmt.

Hatte auch schon einen 10kOhm-Widerstand als Pullup zwischen Reset und 
Vcc (Pin 1 + Pin 8). Einen Vorwiderstand vor der LED hab ich auch 
ausgetestet.

Stefan

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan K. schrieb:
> Hab den Programmer aber schon
> mal abgeklemmt.

Da sollte auch unbedingt so sein.

Stefan K. schrieb:
> Einen Vorwiderstand vor der LED hab ich auch
> ausgetestet.

Ja bitte lass ihn auch drin. Egal wie niedrig die Spannung ist, ein 
Vorwiderstand ist immer nötig, und wenn es nur 22R oder 47R sind.

Die LED ist falschrum gepolt gezeichnet, aber so wie ich mir das 
vorstelle, also an Masse und nicht an Plus.
In deinem Init Programm solltest du jedenfalls so schnell wie möglich 
die LED ausschalten, damit die nicht überflüssig Strom zieht. Evtl. wäre 
es auch gar nicht dumm, einen der ADC Kanäle zum Messen der 
Versorgungsspannung heranzuziehen, um einen geordneten Rückzug zu 
ermöglichen.

von Stefan K. (sdwarfs)


Lesenswert?

Matthias Sch. schrieb:
> Ja bitte lass ihn auch drin. Egal wie niedrig die Spannung ist, ein
> Vorwiderstand ist immer nötig, und wenn es nur 22R oder 47R sind.

Also die Idee war, dass die LED sowieso nur kurz "pulst"... also 15ms 
pro Sekunde. Das sind nur 1,5% der Zeit. Also der LED sollte das ja 
eigentlich nicht weh tun. Is halt wie die Hand durch die Kerzenflamme 
bewegen... schnell geht, langsam durch tut weh...


> Die LED ist falschrum gepolt gezeichnet, aber so wie ich mir das
> vorstelle, also an Masse und nicht an Plus.

Ja, kann durchaus sein... also das mit dem Schaltsymbol der Dioden 
bekomme ich selten richtig hin (is wie Münze werfen). Hab bei der LED 
einfach ausgetestet wie herum sie leuchtet ;-). Sie hängt aber definitiv 
zwischen Masse und IO-Pin.

> In deinem Init Programm solltest du jedenfalls so schnell wie möglich
> die LED ausschalten, damit die nicht überflüssig Strom zieht.
Initial dürfte der IO-Port auf "LOW" sein.

> Evtl. wäre
> es auch gar nicht dumm, einen der ADC Kanäle zum Messen der
> Versorgungsspannung heranzuziehen, um einen geordneten Rückzug zu
> ermöglichen.

Die Idee hatte ich ganz zu Anfang auch. Deswegen hatte ich am Anfang 
ein Delay von 8 Sekunden im Programm (mit ausgeschaltener LED). Das 
hatte aber nichts gebracht, deswegen habe ich es aktuell wieder 
herausgenommen, weils beim debugging stört (8 Sekunden warten).

Allerdings würde der ADC auch nochmal ordentlich Leistung verbraten. 
Aber klar: definitiv bei weitem nicht so viel wie die LED anzuschalten 
(wahrscheinlich faktor 100). Der müsste dann entsprechend kurz 
angeschalten werden und dann schnell wieder aus. Allerdings muss sich 
laut Datenblatt die Referenzspannung erst stabilisieren, bevor man 
messen kann. Mit aktivierter BOD müsste die aber aktiviert sein.

Gefühlt scheint die BOD aber eher mehr Schaden anzurichten, was das 
ansteigen des Spannungslevels angeht.

Ich werde mal trotzdem mal testweise das Programm so umschreiben, 
vielleicht waren 8 Sekunden warten einfach nicht genug. Zudem war 
sowieso angedacht, dass das Programm sich bei wenig Spannung "schlafen 
legt", damit nicht irgendwelche merkwürdigen Effekte auftreten.

Ich bin dabei gerade auch auf ein Problem gestoßen. Im Datenblatt steht 
nämlich "Note: 1. The device requries a supply voltage of 3V in order to 
generate 2.56V reference voltage."; und für die 1,1 Volt Referenz wird 
das ähnlich aussehen. Wahrscheinlich kann die Referenz nur unterhalb der 
Versorgungsspannung liegen. Sinkt die Spannung z.B. unter 1,4 Volt, 
sinkt dann wahrscheinlich die Referenzspannung mit.
Man muss also, wenn, drauf bauen, dass die Brownout-Detection schon 
sauber bei etwas unter 1,8V zuschlägt und man solche Messungen überhaupt 
nicht bekommt. Und kann dann nur mit der 1,1 V Referenz arbeiten. Und 
zum messen einer höheren Spannung wäre damit ein Spannungsteiler 
(zwischen Vcc und GND) nötig.
Aus Energiespargründen wurde dafür irgendwo (ich weiß nicht mehr wo ichs 
gelesen habe) vorgeschlagen, dass man statt zwischen Vcc und GND die 
Spannung zwischen einem IO-Pin und GND mit einem Spannungsteiler 
halbiert und dann misst. Der Trick dabei ist, dass man den IO-Pin nur 
für die Messung auf HIGH schaltet und sonst auf LOW. Damit frisst der 
Spannungsteiler nur im Messzeitraum Energie. Problem: Das kostet dann 
gleich 2 IO-Pins (wir haben insgesamt nur 6 Stück).

Ne andere Idee von mir wäre, mit einen kleinen(!) Kondensator mit PWM 
und definiertem Duty-Cycle an einem IO-Pin zu laden und dann schnell für 
die Messung auf Input umzuschalten. Die Messung ist dass vielleicht 
nicht genau, aber um einen unteren Grenzwert festzulegen, würde das 
sicher reichen. ---> Problem: Das zieht wieder sofort beim Anschalten um 
festzustellen, ob das Spannungslevel hoch genug ist.

Weitere Idee: Vcc über 2 Dioden in Reihe an einen IO-Pin anlegen und 
digital messen. Wie oben schon beschrieben, sinkt damit der 
Spannungslevel um je ~0,6V (d.h. 1,2 Volt). Bei niedriger Vcc (< 2,4 
Volt??) müsste das reichen, damit am IO-Pin "LOW" gemessen wird. ---> 
Problem: Laut Datenblatt soll eine Spannung an den IO-Pins, die irgenwo 
in der Mitte zwischen High/Low liegt recht hohen Energieverbrauch 
bewirken. Und auch hier passiert das ja gerade wieder, wenn wir wenig 
Energie zur Verfügung haben.

Welche der Ideen klingt denn am vielversprechensten für Dich / Euch?

von Stefan K. (sdwarfs)


Lesenswert?

Gäste schrieb:
> Vllt hilft ja ein Komparator in Verbindung mit normalen und schottky
> Dioden..
> Der könnte dann den Transistor sauber schalten, dass du nicht irgendwo
> im nicht linearen Teil der Kennlinie bist.

Ehe wir diese Beitrag hier "übergehen". Ich habe bisher noch nicht 
darauf geantwortet, weil ich ihn nicht verstanden habe.

Ich muss dazu sagen: Bei Transistorschaltungen schlage ich immer erstmal 
im Elektronikkompendium nach und hoffe die richtige Variante der 
Basisbeschaltungen zu erwischen ... und dann wird im Simulator 
rumprobiert, ob die gewünschten Effekte auftreten. Und in der Realtität 
funktionierts dann meistens nicht... is dann immer wieder sehr 
deprimierend :(

Ich würd das gern können, aber irgendwie weigert sich die Elektronik mir 
zu gehorchen...

Sprich: Da fehlt mir fehlt da leider jede Menge Erfahrung und Wissen...


Worauf ich aber hinaus will: Kann's mir vielleicht einer erklären, was 
genau gemeint war? Bissl "theoretisches" Wissen hab ich ja... und 
lerngewillt will bin ich auch ;-)

von Konrad S. (maybee)


Lesenswert?

Stefan K. schrieb:
> Welche der Ideen klingt denn am vielversprechensten für Dich / Euch?

Die Methode, bei der du VCC als als Voltage Reference (REFS2:0 = 0b000) 
und VBG als Input Channel (MUX3:0 = 0b1100) wählst. Da brauchst du genau 
0,0 I/O-Pins dafür, musst aber ein bisschen um die Ecke denken.
(Die Idee dazu habe ich, glaube ich, im Transistortester-Thread 
aufgeschnappt.)

von Stefan K. (sdwarfs)


Lesenswert?

Konrad S. schrieb:
> Die Methode, bei der du VCC als als Voltage Reference (REFS2:0 = 0b000)
> und VBG als Input Channel (MUX3:0 = 0b1100) wählst. Da brauchst du genau
> 0,0 I/O-Pins dafür, musst aber ein bisschen um die Ecke denken.
> (Die Idee dazu habe ich, glaube ich, im Transistortester-Thread
> aufgeschnappt.)

Ganz klar das Thema verfehlt Konrad! ;-)
Diese Idee war nämlich garnicht dabei!!! G

Ok, also ich geh's mal durch, ob ich's verstehe:
1. Vcc also Referenz... REFS[2:0] = 000 (wobei das erste bit laut 
Datenblatt ignoriert wird, 100 würde wohl das gleiche tun); weiter...
2. V_BG (Bandgap Reference Voltage) als Input.. mal schauen...

Das Manual schreibt dazu:
>> "8.3 Internal Voltage Reference"
>> ATtiny25/45/85 features an internal bandgap reference. This reference is
>> used for Brown-out Detection, and it can be used as an input to the
>> Analog Comparator or the ADC.

Klingt perfekt. Wenn die Brown Out Detection (BOD) auch damit arbeitet, 
is das genau die Grenze bei der die BOD letztlich abschalten wird, d.h. 
wenn diese zu lange unterschritten wird.

Jetzt noch eben "verstehen" wie das Zahlenmäßig aussieht:
Messwert = (1023*V_BG) / Vcc

Also ist bei "Messwert == 1023"  "V_BG == Vcc".
Wenn wir unser unteres Limit z.B. mit 10% über V_BG (110% = 1.1) 
festlegen, wäre das:
Messwert = (1023*V_BG) / (V_BG*1.1) = 1023 / 1.1 = 930
Wobei gilt: höherer Wert == schlechter.

Also müssen wir mit obiger Einstellung für REFS und MUX messen (Funktion 
readVBGvsVCC()) und dann:

while (readVBGvsVCC() > 930) {
  sleep(WDTO_1S);
}

Wobei sleep() ein Powerdown-Sleep ist, der per Watchdog-Timer 
unterbrochen wird...

Alles klar Konrad! Das probier' ich morgen nach der Arbeit aus... und 
dann meld ich mich mal... Dann hat man doch gleich wieder IO-Pins und 
externe Bauelemente eingespart. So mag ich das... alles schön in 
Software, da kenn ich mich aus ;-)

von Mikel M. (mikelm)


Lesenswert?

Probiere mal aus ob die Spannung steigt,wenn du Reset vom Tiny fix auf 
Masse legst.
Wenn die Spannung dann steigt,könntest du sowas wie nen 24c021-25 dran 
anschliessen,der hält den Tiny solange auf reset wie die Spannung unter 
2,7V liegt und sorgt dann für einen sauberen Start. Die beiden 
!Resetleitungen von den beiden chips miteinander verbinden und nen 
Pullup dran.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Hmm, hab nochmal das Datenblatt durchsucht, aber nicht gefunden, ab 
welchem Vcc die Bandgap 1,1 Volt REF stabil ist. M.E. steht da aber, das 
erst ab 2,7 Volt alles im grünen Bereich ist.
Du könntest also enweder die 1,1 Volt Referenz nehmen, oder z.B. eine 
externe Diode im Durchlassbetrieb mit ihrem ca. 0,6 - 0,7 Volt. Ein 
Spannungsteiler an einem ADC Kanal würde dir dann die Solarspannung 
liefern können.
Beim MC Takt gilt, so hoch wie nötig, so niedrig wie möglich. Du hast ja 
im Datenblatt schon gesehen, wie hoch der Stromverbrauch bei 
verschiedenen Takten ist, ausserdem beachte noch die Safe Operation 
Area. Am besten sind die 128 kHz, die könntest du für den WD oder den 
BOD sowieso benutzen.

Achtung, es ist leicht möglich, sich dabei vom MC auszusperren, wenn 
gleichzeitig noch CKDIV8 gefused ist. Man muss dann den Programmierer 
auf 1-2 kHz ISP runterdrehen, das kann nicht jeder. Also erst CKDIV8 
löschen, und dann den WD Oszillator aktivieren.

von spess53 (Gast)


Lesenswert?

Hi

>Du könntest also enweder die 1,1 Volt Referenz nehmen, oder z.B. eine
>externe Diode im Durchlassbetrieb mit ihrem ca. 0,6 - 0,7 Volt.

Die minimale Spannung für eine externe Referenz sind 2V.

MfG Spess

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

spess53 schrieb:
> Die minimale Spannung für eine externe Referenz sind 2V.

Hab nochmal das Datenblatt durchsucht. Wo hast du das gefunden?

von spess53 (Gast)


Lesenswert?

Hi

>Hab nochmal das Datenblatt durchsucht. Wo hast du das gefunden?

21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF

MfG Spess

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

spess53 schrieb:
> 21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF

Ah, cool. Ich hatte 'ne alte Version, wo es noch nicht drin stand. Danke 
Dir!

Es bleibt also nur die 1,1 Volt Bandgap Referenz.

von Konrad S. (maybee)


Lesenswert?

Stefan K. schrieb:
> Ganz klar das Thema verfehlt Konrad! ;-)
> Diese Idee war nämlich garnicht dabei!!! G

Ist halt wie im Krimi: Auf den letzten drei Seiten werden noch mal eben 
schnell zwei neue Charaktere eingeführt: der Mörder und der gemeinsame 
Friseur von Opfer und Mörder, der die Zusammenhänge aufklärt. ;-)

von Stefan K. (Gast)


Lesenswert?

Mikel M. schrieb:
> Probiere mal aus ob die Spannung steigt,wenn du Reset vom Tiny fix auf
> Masse legst.

Ja, das klingt nach ne guten Test! Wird heute Abend erledigt.


@Spess:
>> Die minimale Spannung für eine externe Referenz sind 2V.
>> 21. Electrical Characteristics -> 21.7 ADC Characteristics -> AREF

Danke fürs Raussuchen!

@Matthias:
>> Es bleibt also nur die 1,1 Volt Bandgap Referenz.

Ja, aber die reicht dann ja auch völlig. Mit der ADC-Konfiguration die 
Konrad geliefert hat, sollte das ja prima funktionieren.

@Matthias:
>> Beim MC Takt gilt, so hoch wie nötig, so niedrig wie möglich.
>> Du hast ja im Datenblatt schon gesehen, wie hoch der Stromverbrauch
>> bei  verschiedenen Takten ist, ausserdem beachte noch die Safe
>> Operation Area. Am besten sind die 128 kHz, die könntest du für den
>> WD oder den BOD sowieso benutzen.

Ja, also die Safe-Operation-Area geht ja sowieso bis 0 MHz runter. 
Allerdings steht auch irgendwo, dass die PLL bei <1 MHz nicht sauber 
"lockt" (Kapitel "Known Issues" glaube ich). Deswegen hab ich's derzeit 
mit 1 MHz laufen. Außerdem is die Frage, ob kurzzeitig 1 MHz nicht 
günstiger ist als 128 kHz für die 8fache Dauer. Denn die Initialisierung 
dauert ja entsprechend 8 mal länger... abgesehen vom zusätzlichen Delay, 
welches wegen ISP-Zugriff eingebaut wird.

>> Achtung, es ist leicht möglich, sich dabei vom MC auszusperren, wenn
>> gleichzeitig noch CKDIV8 gefused ist. Man muss dann den Programmierer
>> auf 1-2 kHz ISP runterdrehen, das kann nicht jeder. Also erst CKDIV8
>> löschen, und dann den WD Oszillator aktivieren.

Ja, davon kann ich ein Liedchen singen... Hab ich am Wochenende schon 
geschafft. Hab damals schon ausversehen auf externe Taktreferenz gefust 
und keine Taktreferenz gehabt... und dann ewig gebraucht, das wieder hin 
zu bekommen (hatte aber zum Glück noch einen zweiten ATTiny45, den ich 
dann auf nen IO-Pin nen Takt generieren lassen habe).
Als ich bei 128 kHz den Chip nicht mehr programmieren konnte dachte ich 
auch nur "Yikes!" (wie avrdude so schön schreibt)  und "diesmal haste's 
wohl wirklich geschafft!". Weil ja "interner Referenztakt" und ich 
dachte ich müsse unbedingt den WDT auf "immer an" fusen. Ging aber auch 
ohne...  musste wie du schriebst nur den ISP "runtertakten"; Allerdings 
brauchte ich dafür ne ISP-"Software" für den Arduino, weil das 
Hardware-SPI wohl nur bis 500 MHz runter geht. Die Software hat's dann 
das SPI-protokolldirekt über Software erledigt.

@Konrad:
>>Ist halt wie im Krimi: Auf den letzten drei Seiten werden noch mal eben
>>schnell zwei neue Charaktere eingeführt: der Mörder und der gemeinsame
>>Friseur von Opfer und Mörder, der die Zusammenhänge aufklärt. ;-)

Was für fiese Krimi's liest Du denn da? Hinterhältig!!! ;-)


---
TODO-Liste für heute Abend:
---
1. Check, ob Spannung mit Reset and GND steigt.
2. Messung von V_BG gegen V_cc als Referenz austesten mit 5V (USB) und 
3V (Knopfzelle) und Messwert via Serial-Port rausschieben; prüfen, ob's 
zu Berechnungen und externer Messung der Spannung passt.
3. Schleife mit Prüfung der Versorgungsspannung => Watchdog-Sleep 
einbauen (erster Schritt, bevor irgendwelche IO-Pins auf HIGH gehen).

von Stefan K. (sdwarfs)


Lesenswert?

> ---
> TODO-Liste für heute Abend:
> ---
> 1. Check, ob Spannung mit Reset and GND steigt.
> 2. Messung von V_BG gegen V_cc als Referenz austesten mit 5V (USB) und
> 3V (Knopfzelle) und Messwert via Serial-Port rausschieben; prüfen, ob's
> zu Berechnungen und externer Messung der Spannung passt.
> 3. Schleife mit Prüfung der Versorgungsspannung => Watchdog-Sleep
> einbauen (erster Schritt, bevor irgendwelche IO-Pins auf HIGH gehen).

Hab leider nicht alles geschafft... und muss nun ins Bett. Vor allem 
gabs Schwierigkeiten mit der seriellen Datenliefern. Vor paar Tagen hat 
das noch super funktioniert mit 9600 baud. Hab dann ewig den Fehler 
gesucht und dann mal 300 baud probiert... das ging... bis 1200 läuft's 
danach bekomm ich nur noch Müll. Was solls...

Aber hier nun die Ergebnisse:
1. Spannung mit Reset an GND => tut...
2. V_BG gegen V_cc als Referenz tut

bei ~5.00V --> Messwert(RAW): ~250
bei ~2.98V --> Messwert(RAW): ~383

Die Messwerte weichen stark vom vorhergesagten Wert ab.
V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen 
Offset und nen Gain-Fehler. Muss wohl mal das Offset messen und dann 
raus rechnen... der interessiert mich schon.
Bei der aktuellen Messwertreihe müssten wir für 1.8V geschätzt irgendwas 
wie 625 oder 650  messen...

3. schaff ich grad nicht mehr. Kommt morgen...


Grüße,
Stefan

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Stefan K. schrieb:
> Allerdings steht auch irgendwo, dass die PLL bei <1 MHz nicht sauber
> "lockt" (Kapitel "Known Issues" glaube ich). Deswegen hab ich's derzeit
> mit 1 MHz laufen.

PLL? Oha, das wird mit der schwankenden Vcc aber ein Affentänzchen. 
Wenns irgendwie geht, probier auf die PLL zu verzichten, da kann es 
nämlich auch mal zu einem Lock-up kommen. Du müsstest jedenfalls 
zyklisch testen, ob die PLL noch gelockt ist, das ist aber ein wenig wie 
der Baron, der sich selber am Zopf ausm Sumpf zieht, denn je nach 
Konfiguration taktet die ja auch Sysclk oder die Peripherie.
Mit einem 1:4 oder 1:5 Spannungteiler am ADC Kanal und der Bandgap 
Referenz jedenfalls sollte es möglich sein, die Solarzelle zu 
überwachen. Wenn sie in den kritischen Bereich kommt, geordneten Rückzug 
und den WD aktivieren. Du könntest dann per WD den MC zyklisch 
aktivieren und die Spannung testen. Wenns reicht, LED blitzen lassen, 
wenn nicht, Hände in den Schoss und den WD neu starten.

Stefan K. schrieb:
> V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen
> Offset und nen Gain-Fehler.

Oder beides. Atmel nimmts da nicht so genau und empfiehlt immer, für 
genaue Messungen den ADC vorher zu  kalibrieren. Die Bandgap ist auch 
ein bisschen schwammig definiert, lt. Datenblatt 1,0-1,2 Volt. Das macht 
schon was aus. Wenn das eine Massenschaltung wird, solltest du einmal 
kalibrieren und die Werte im EEPROM speichern, wenn nicht, hart die 
Limits in den Code programmieren.

von spess53 (Gast)


Lesenswert?

Hi

>Du müsstest jedenfalls
>zyklisch testen, ob die PLL noch gelockt ist, das ist aber ein wenig wie
>der Baron, der sich selber am Zopf ausm Sumpf zieht, denn je nach
>Konfiguration taktet die ja auch Sysclk oder die Peripherie.

Die PLL des ATTiny45 ist nur für Timer1 zuständig. Allerdings erschließt 
sich mir nicht, wozu man zum Led-Blinken einen Timer mit 64MHz braucht.

MfG Spess

von Stefan K. (sdwarfs)


Lesenswert?

@Matthias
> PLL? Oha, das wird mit der schwankenden Vcc aber ein Affentänzchen.
> Wenns irgendwie geht, probier auf die PLL zu verzichten, da kann es
> nämlich auch mal zu einem Lock-up kommen.

Ich hab da jetzt nicht speziell ne PLL aktiviert. Aber üblicherweise 
hängt doch eine PLL am Oszillator / Resonator. In dem Fall der internen 
Taktquelle für den Systemtakt. Wenn die allerdings ganz normal erzeugt 
wird und nur immer brav geteilt wird (zwei mal durch 8), um auf 128 kHz 
zu kommen... wird schon alles passen. Wenn aber z.B. auf nen anderen 
Ressonator umgeschalten wird, oder z.B. ne größere Kapazität 
zugeschalten wird (damit er langsamer schwingt)... dann könnte die PLL 
nen Problem werden.
Und die Vcc schwankt ja auch wenn "langsam" im Vergleich zum Systemtakt. 
Deswegen hängen auch 2 Elkos + ein Entstör-Kondensator parallel zur Vcc, 
die letztlich die Probleme mit dem zu langsamen Anstieg der Vcc 
verursachen.

> Mit einem 1:4 oder 1:5 Spannungteiler am ADC Kanal und der Bandgap
> Referenz jedenfalls sollte es möglich sein, die Solarzelle zu
> überwachen.

Schauen wir mal, ob das noch nötig ist.

> Oder beides. Atmel nimmts da nicht so genau und empfiehlt immer, für
> genaue Messungen den ADC vorher zu  kalibrieren.

Ja, das muss ich mir noch anschauen, wie das geht...

> Wenn das eine Massenschaltung wird, solltest du einmal
> kalibrieren und die Werte im EEPROM speichern, wenn nicht, hart die
> Limits in den Code programmieren.

Für den Test reicht jetzt mal ne manuelle Kalibrierung. Aber is halt 
auch nen Übungsobjekt... ich soll was daraus lernen.
Am Ende gibts vielleicht paar Prototypen (<10 Stück) für ne 
Wissenschaftliche Untersuchung. Denke aber nur einen zum zeigen der 
Machbarkeit... Rest mit Knopfzelle. Da ist nur wichtig, dass das was das 
Teils tut funktioniert und möglichst preiswert ist. Dabei soll der AVR 
aber nicht viel tun. Geht nur darum, dass man das Teils irgendwo an die 
Wand hängen kann und es tut was es tut* und man muss weder Batterien 
tauschen noch nen Kabel für Stromversorgung verlegen. Das brauch ich 
sozusagen nur als "Kostenargument", weil es sonst bei ner Konferenz 
heißt: "aber das kostet doch dann viele Euros". Wenn man aber sagen 
kann: die Bauteile kosten in 1000+ Stückzahlen <3 EUR sind sie 
glücklich.

von spess53 (Gast)


Lesenswert?

Hi

>Ich hab da jetzt nicht speziell ne PLL aktiviert. Aber üblicherweise
>hängt doch eine PLL am Oszillator / Resonator.

Beim ATTiny45 nicht üblicherweise. Da ist eine PLL nur in Spiel, wenn 
diese aktiviert ist und der 16MHz Takt verwendet wird. Externen 
Taktquellen wird keine PLL verwendet.

MfG Spess

von Konrad S. (maybee)


Lesenswert?

Stefan K. schrieb:
> Die Messwerte weichen stark vom vorhergesagten Wert ab.
> V_bg muss demnach 1.1-1.25 Volt sein oder der ADC hat nen riesigen
> Offset und nen Gain-Fehler.

Oder das hier trifft zu: "The first ADC conversion result after 
switching voltage reference source may be inaccurate, and the user is 
advised to discard this result."
Die Referenz wird zwar nicht umgeschaltet, aber sie ändert sich.

Machst du nur eine Messung?

von Stefan K. (Gast)


Lesenswert?

@Spess:
>> Die PLL des ATTiny45 ist nur für Timer1 zuständig. Allerdings
>> erschließt  sich mir nicht, wozu man zum Led-Blinken einen Timer
>> mit 64MHz braucht.

Nö, in dem Fall benutz ich die PLL nicht...

[Sarkasmus]
PS: Wir wollen natürlich mit einer Genauigkeit von +/-20 ns regeln 
können, wie lang die LED an ist... den Nutzer interessiert nämlich nur, 
dass das Licht nicht unnötig an ist... wieviel der µC dafür unnötig an 
Saft mehr verbrät ist, is dabei nicht relevant! Dann musst Du nur noch 
einen Aufkleber mit so nem grünen Blatt aufs Gehäuse kleben und das 
Produkt kauft sich wie warme Semmeln.  Also: Immer kundenorientiert 
denken... der DAU muss glücklich gemacht werden! ;-)
[/Sarkasmus]

@Konrad:
> Oder das hier trifft zu: "The first ADC conversion result after
> switching voltage reference source may be inaccurate, and the user is
> advised to discard this result."
> Die Referenz wird zwar nicht umgeschaltet, aber sie ändert sich.
>
> Machst du nur eine Messung?

Ja, hab mir das Kapitel ADC extra genau durchgelesen. Diese Stelle 
entsprechend auch so umgesetzt. Der ADC wird aktuell immer wieder (insb. 
nach dem "Tiefschlaf" mit deaktiviertem ADC) komplett neu initialisiert. 
In der Initialisierungsroutine wird dann eine "Dummy"-Messung 
durchgeführt, die verworfen wird. Gemessen wird per 
ADC-Noise-Cancelation-Sleep-Mode...

Allerdings habe ich da auch eine andere Software gesehen, die die ersten 
3 Messungen weg wirft...

Durch den ADC-Sleep-Mode sollte auch der Energieverbrauch während der 
Messung dann nicht so extrem hoch sein.

von Stefan K. (sdwarfs)


Lesenswert?

Hallöle,

also wie's aussieht, hat mein USB-zu-Serial-Kabel den Geist aufgegeben. 
Da muss ich mir erstmal was neues basteln. Wahrscheinlich war das auch 
der Grund, warum plötzlich nur noch 1200 baud gingen.

Wird also bissl dauern bis es wieder im Thread weiter geht.
Ich danke aber schon mal für alles, was ihr mir so weit beigebracht 
habt. Da ist sehr viel nützliches dabei gewesen.

Stefan

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.