Forum: Mikrocontroller und Digitale Elektronik avr adc hochfrequenz-messung auf mehreren kanälen


von Richard S. (rscheff)


Lesenswert?

Hallo,

Soeben ist mir etwas merkwürdiges aufgefallen...

Wenn ich auf einem AVR (konkret attiny861) rasch (jede andere Messung, 
gepollt, nicht via interrupt) zwischen Gnd (MUX5..0 0b011111) und Ref 
(MUX5..0 0b011110) hin und herschalte (konkret will ich die 
Versorgungsspannung indirekt messen, durch vergleich des Messwertes von 
der 1.1V internen Referenz, während des ADC Referenz auf Vcc bleibt), 
wird der korrekte Wert (ca. 55 bei Vcc ~5V von einem 7805) nie erreicht.

Bei einem ADC Prescaler von 128, 8MHz interner RC Oszi,und ständig nur 
0b011110 messend, braucht es 3-4 unmittelbar aufeinander folgende 
Samples, damit der korrekte Wert gelesen wird:

0x52
0x3B
0x37
0x36
0x36
:

Wenn nun jedes 2. Sample alternierend auf Gnd (0b011111) gelegt wird, 
wird nie die "korrekte" Spannung der 1.1V Referenz gemessen:

0x52 (ref)
0x00 (gnd)
0x31 (ref)
0x00 (gnd)
0x31 (ref)
:
:

Bei einer höheren ADC Clock Rate ist das ganze noch ausgeprägter (zB 
2MHz wo externe Messungen durchaus gut funktionieren):

MUX kontinuierlich auf Ref:
0x79 0x71 0x6C 0x66 0x60 0x5B 0x56 0x51 0x4C 0x48 0x45 0x42 0x3F 0x3E 
0x3C 0x3B 0x39 0x38 0x38 0x37 0x37 0x36 0x36 0x36 0x36 0x36

MUX abwechselnd zw. Ref und Gnd:
0x79 0x00 0x02 0x00 0x02...

Gehe ich recht in der Annahme, dass dies wohl darauf zurückzuführen ist, 
das die interne 1.1V Referenz nur eine sehr geringe Stromquelle/senke 
ist, und damit in der kurzen Zeit in der der Sample&Hold ~14pF Cap 
geladen/entladen werden kann, dramatisch zu wenig Strom zum 
Spannungsangleich liefert?

(Für externe A/D Eingänge sehe ich 100 pF Caps vor, aus denen ein 
ausreichend großer Umladestrom in dem Sample-Intervall fliessen kann, 
dass die Messung hinreichend genau sind, wenn ich da mehrmals pro ms 
herumschalte zum sampeln. OpAmp zur Impedanzanpassung war für die zu 
erzielende Genauigkeit dann wieder zu viel... ).

Andererseits, um diese Messung in möglichst kurzer Echtzeit zu 
realisieren, wäre es nicht vorteilhaft, die ADC Clock temporär 
hochzudrehen, 16 Messungen ohne umschalten durchzuführen (dass der 
Sample/Hold Cap sukkzessive "korrekter" geladen werden kann, danach die 
ADC Clock wieder zu reduzieren wenn externe, oder andere Quellen mit 
niedrigerer Impedanz gemessen werden sollen...

Gibts irgendeinen Trick, den Sample/Hold Cap länger laden/entladen zu 
lassen, ohne den ADC voll anlaufen zu lassen?

Mein MCU soll in einem Ultralow-Power Mode starten, wo er praktisch nur 
alle 1/8 sec mit dem 32kHz WDT interrupt geweckt werden soll, um 
nachzusehen ob Vcc noch bei <=3.3V liegt, oder bereits bei 5V, jedoch 
ohne einen weiteren Pin zB für den Comparator benutzen zu müssen.

ADC noise cancelling sleep braucht wahrscheinlich fast so viel strom wie 
active (steht leider nicht im Datenblatt).

von Axel S. (a-za-z0-9)


Lesenswert?

Richard S. schrieb:
> Soeben ist mir etwas merkwürdiges aufgefallen...
>
> Wenn ich auf einem AVR (konkret attiny861) rasch (jede andere Messung,
> gepollt, nicht via interrupt) zwischen Gnd (MUX5..0 0b011111) und Ref
> (MUX5..0 0b011110) hin und herschalte (konkret will ich die
> Versorgungsspannung indirekt messen

Wofür muß man dazu den ADMUX umschalten?

> Bei einem ADC Prescaler von 128, 8MHz interner RC Oszi

Also 62.5kHz, nahe dem Maximum.

> und ständig nur
> 0b011110 messend, braucht es 3-4 unmittelbar aufeinander folgende
> Samples, damit der korrekte Wert gelesen wird:
>
> 0x52
> 0x3B
> 0x37
> 0x36
> 0x36
> :

Bahnhof. Der ADC ist 10 Bit breit. Nicht 8. Ansonsten sagt das 
Datenblatt ja auch, daß nach dem Umschalten des ADMUX die ersten 1-2 
Messungen verworfen werden sollten.

> Wenn nun jedes 2. Sample alternierend auf Gnd (0b011111) gelegt wird,
> wird nie die "korrekte" Spannung der 1.1V Referenz gemessen:

In Übereinstimmung mit dem Datenblatt.

> Bei einer höheren ADC Clock Rate ist das ganze noch ausgeprägter (zB
> 2MHz wo externe Messungen durchaus gut funktionieren):

Außerhalb der Spezifikation. Punkt.

> Gehe ich recht in der Annahme

Außerhalb der Spezifikation. Was verstehst du daran nicht?

> Andererseits, um diese Messung in möglichst kurzer Echtzeit

Wozu? Kürzer als ca. 20µs geht halt nicht.

> wäre es nicht vorteilhaft, die ADC Clock temporär hochzudrehen

Aber nicht außerhalb der Spezifikation. Abgesehen davon ist die 
Sample-Zeit 1.5 Perioden des ADC-Clock. Ergo: niedriger Clock ist 
besser.

> Gibts irgendeinen Trick, den Sample/Hold Cap länger laden/entladen zu
> lassen

s.o.

> Mein MCU soll in einem Ultralow-Power Mode starten, wo er praktisch nur
> alle 1/8 sec mit dem 32kHz WDT interrupt geweckt werden soll, um
> nachzusehen ob Vcc noch bei <=3.3V liegt, oder bereits bei 5V, jedoch
> ohne einen weiteren Pin zB für den Comparator benutzen zu müssen.

Ergibt keinen Sinn. Wenn du ADMUX permanent auf dem Channel für REF 
läßt, ist jede Messung gut (außer halt die ersten 2)

> ADC noise cancelling sleep braucht wahrscheinlich fast so viel strom wie
> active (steht leider nicht im Datenblatt).

Du kannst jeden Sleep-Mode nutzen, der den ADC-Clock und Interrupts 
eingeschaltet läßt. Du kannst auch den Takt runterskalieren, während du 
auf den ADC wartest. Aber die ca. 20µs alle 125ms machen das Kraut auch 
nicht fett.

von Richard S. (rscheff)


Lesenswert?

Axel S. schrieb:
> Richard S. schrieb:
>> Soeben ist mir etwas merkwürdiges aufgefallen...
>>
>> Wenn ich auf einem AVR (konkret attiny861) rasch (jede andere Messung,
>> gepollt, nicht via interrupt) zwischen Gnd (MUX5..0 0b011111) und Ref
>> (MUX5..0 0b011110) hin und herschalte (konkret will ich die
>> Versorgungsspannung indirekt messen
>
> Wofür muß man dazu den ADMUX umschalten?

Dazu muß man den ADMUX nicht umschalten. Gnd als Eingang bot sich für 
einen schnellen, "nackten" Test an, um ein definiertes Potential (und 
ggf. Offset drift) zu messen.

Auf dem Breadboard war nur der restliche AD / diskrete Teil der alle 10 
verfügbaren ADC Kanäle belegt, dass also kein Eingang für eine mit 
ausreichend niedriger impedanz ausgestatteten Teiler mehr frei ist.
(Bevor Fragen aufkommen - der 11. ADC Eingang muß als OC1B ausgang 
leider digital genutzt werden, da ich da auch 3 recht exakte, wenn auch 
langsame PWMs (1 kHz) mit hoher Duty-Cycle Auflösung (0.1% oder 1 usec) 
brauche. Allerdings noch nicht im low-power state... der pin ist nur 
nicht verfügbar ;) ).

>
>> Bei einem ADC Prescaler von 128, 8MHz interner RC Oszi
>
> Also 62.5kHz, nahe dem Maximum.

Wenn man 10 bit präzision braucht, korrekt. Für die mit 100p gepufferten 
Kanäle, wo 5-6 bis Auflösung ausreichend sind, ist eine ADC Clock von 
2MHz immer noch ausreichend gut ¯\_(ツ)_/¯

>
>> und ständig nur
>> 0b011110 messend, braucht es 3-4 unmittelbar aufeinander folgende
>> Samples, damit der korrekte Wert gelesen wird:
>>
>> 0x52
>> 0x3B
>> 0x37
>> 0x36
>> 0x36
>> :
>
> Bahnhof. Der ADC ist 10 Bit breit. Nicht 8. Ansonsten sagt das
> Datenblatt ja auch, daß nach dem Umschalten des ADMUX die ersten 1-2
> Messungen verworfen werden sollten.

Hier wurden die 8 MSB aufgenommen - ADLAR ist gesetzt, damit ein 
einzelner IN die relevanten Bits auslesen, und das Register für die 
nächste Messung freigeben kann.

Und ja, im Datenblatt wird empfohlen die erste Messung nach umschalten 
des ADMUX zu verwerfen. Mit anderen Worten, eine 3-phase BLDC closed 
loop steuerung einzelner Phasen ist damit definitiv nicht möglich ;) 
Aber so extrem ist die Anforderung gar nicht.

>
>> Wenn nun jedes 2. Sample alternierend auf Gnd (0b011111) gelegt wird,
>> wird nie die "korrekte" Spannung der 1.1V Referenz gemessen:
>
> In Übereinstimmung mit dem Datenblatt.
>
>> Bei einer höheren ADC Clock Rate ist das ganze noch ausgeprägter (zB
>> 2MHz wo externe Messungen durchaus gut funktionieren):
>
> Außerhalb der Spezifikation. Punkt.

Das war ja auch nicht die Frage - eher Verständnis, ob die intere Ref 
(1.065 V, aka 1.1V) wirklich so eine hohe Impedanz haben kann, oder ob 
das an anderen Effekten liegt, die ich bei low-power berücksichtigen 
muss.

(Und ja, auch wenn man >> 70usec nach aktivier des ADC wartet, oder 
zwischen dem Sampling, bekommt man das geschilderte Verhalten. Der S/H 
cap scheint also "ursächlich" daran beteiligt zu sein...)


>> Andererseits, um diese Messung in möglichst kurzer Echtzeit
>
> Wozu? Kürzer als ca. 20µs geht halt nicht.

Da interessiert mich eher der Energiebedarf, inkl. aktiver MCU Zeit - ob 
es in Summe weniger Energie kostet, den ADC mehrfach (zB 10x) bei 
höherer Frequenz (2MHz) laufen zu lassen, um Vcc ordentlich zu sampeln, 
oder zB OSCCAL auf 00 zu setzen (~2MHz), ADC Clock divider auf 128, 
vielleicht auch noch die Systemclock auf einen höheren Divider (Clock 
Prescaler auf 256).

(System Clock wäre da bei ca. 2 MHz / 256 = 7,8 kHz, ADC Clock dann bei 
61 Hz, ein Sample würde rund 200ms dauern... Andererseits - wenn der 
interne S/H cap für 1,5 Takte oder auch nur 0,5 Takte verbunden wird, 
der System Takt derartig niedrig ist, ist der dann vielleicht bereits 
ordentlich stabil und korrekt für die eigentliche Messung? )

Aber auch da wird vermutlich das 1. Sample zu verwerfen sein...

d.h. ADC noise cancelling mit main clock (ohne CPU core) muß für ~400ms 
aktiv sein, bei rund 70-80 uA (Fig. 20-10), idle. Wobei das wohl alles 
Werte ohne ADC sind (der bis zu 107 uA nimmt @ 5V,8MHz, oder +27% 
Leistung, wenn aktiv - also rund 100 uA).

100 uA * 200 ms @ 3.3V = 66 uJ

Wenn ich nun den ADC mit einem kleineren Prescaler (2) bei Systemclock 
2MHz/256 laufen lasse, aber dann zB 20 Samples brauche, sind das "nur" 
67 ms, oder - wenn diese Überlegungen stimmen, nur 22 uJ.

Zwischen diesen Samples kann er mit WDT in Power-Down sleep gehen.

Allerdings bin ich mir auch noch nicht sicher, wie das mit dem 
Stabilisieren der Referenzspannungen nach einem WDT Wakeup nach einem 
Powerdown ist - im zweifel muß man da ja 25 ADC clocks (adc enable nach 
power down), sowie 70 usec (Ref Bandgap stabilisierung) warten, wo auch 
wieder Energie verbraucht wird...



> Ergibt keinen Sinn. Wenn du ADMUX permanent auf dem Channel für REF
> läßt, ist jede Messung gut (außer halt die ersten 2)

Möglicherweise habe ich diesen Luxus - wohl aber eher nicht. Während 
dieser Low-Power Phasen soll auch regelmäßig auf mind. 3 AD Kanälen 
abwechselnd ein analoger Spannungswert (ungenau, Vcc referenz) gemessen 
werden, wobei diese Messungen dann eine Aufwachphase einleiten, wo die 
MCU das "richtige" Power Supply aktiviert, und ein paar Sekunden dann 
wieder ohne Energiebudget-Limitationen arbeiten kann.

Konkret muss die Messung ob die Versorgung noch bei <= 3.3V steht (low 
power, Versorgung mit hoher Impedanz, Stromlimit ~300 uA "all inclusive" 
- also auch der analog/diskrete Teil der Schaltung, der dabei aktiv ist) 
parallel zur Messung dieser 3 anderen ADC Eingänge erfolgen - da 
entweder das Aufwachen (aktivier des richtigen PSU) nicht funktioniert, 
oder die Anforderung für das Aufwachen wegfällt.

Kurz - es wäre "gut" die Messung der internen 1,065 V Referenz via MUX 
mit minimaler Energie und "ausreichender" Genauigkeit abwechselnd mit 
anderen Unipolaren (externen) Kanälen zu schaffen...


Vielleicht gibts ja auch Referenzen, was man bei solch 
Energie-Restriktiven Umgebungen alles sonst noch beachten sollte...

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Richard S. schrieb:
> im Datenblatt wird empfohlen die erste Messung nach umschalten
> des ADMUX zu verwerfen.

Das ist IMHO nicht notwendig. Zwei Sachen muss man aber wissen:

a) Wenn man die interne Referenz umschaltet, muss man eine Weile warten 
bis sie sich stabilisiert. Je größer der Kondensator an AREF ist (falls 
vorhanden) umso länger dauert es. Aber auch ohne Kondensator dauert es 
ein paar Millisekunden.

b) Wenn man den ADC Multiplexer während einer Messung umschaltet, dann 
gilt der eingestellte Kanal erst für die nächste Messung (nicht für 
die laufende), deren Ergebnis erst im übernächsten Interrupt bereit 
steht.

von Peter D. (peda)


Lesenswert?

Richard S. schrieb:
> Und ja, im Datenblatt wird empfohlen die erste Messung nach umschalten
> des ADMUX zu verwerfen.

Wenn die Quelle niederohmig genug ist oder mit einem Kondensator 
gestützt, ist das nicht notwendig.
Ich hab viele Anwendungen, wo reihum der MUX umgeschaltet und die 
Messung gestartet wird.
Die 1,1V sind allerdings sehr hochohmig und lassen sich nicht mit einem 
Kondensator stützen. Daher muß nach der MUX-Auswahl etwas gewartet 
werden. Ansonsten sieht man ein Übersprechen des vorher ausgewählten 
Eingangs.

von Richard S. (rscheff)


Lesenswert?

Ich verwende AVcc als referenz für den A/D, und messe die interne 
Referenz; die A/D referenz bleibt permanent auf (A)Vcc da ich nur 3-5 
bit Genauigkeit brauche (aber die konversion schnell gehen soll);

Wie beschrieben wird der mcu entweder von einer high impedance 
spannungsquelle versorgt (mit ldo auf 3,3v), oder von einem richtigen 
netzteil mit 5v - und um dafür keinen weiteren pin nutzen zu müssen 
dachte ich das simpelste wäre es, int ref gegen vcc zu messen - aber 
wenn das zu viel energie braucht weil der s/h cap erst nach multiplen 
messungen korrekt geladen ist…

von Richard S. (rscheff)


Lesenswert?

Danke!

Ich werde mal einige Messungen machen, wieviel energie notwenig ist im 
low power modus, um ein “sauberes” sample der internen ref als mux 
eingang zu bekommen und ob sich das im energiebudget ausgeht.

von Axel S. (a-za-z0-9)


Lesenswert?

Richard S. schrieb:
> Axel S. schrieb:
>> Richard S. schrieb:

>> Also 62.5kHz, nahe dem Maximum.
>
> Wenn man 10 bit präzision braucht, korrekt. Für die mit 100p gepufferten
> Kanäle, wo 5-6 bis Auflösung ausreichend sind, ist eine ADC Clock von
> 2MHz immer noch ausreichend

Wenn du meinst. Atmel schreibt zwar in die Datenblätter etwas von 
ADC-Clock rauf bei geringerer Genauigkeit. Aber ich glaube kaum, daß sie 
dabei die 10-fache Frequenz gemeint haben.

>> Außerhalb der Spezifikation. Punkt.
>
> Das war ja auch nicht die Frage - eher Verständnis, ob die intere Ref
> (1.065 V, aka 1.1V) wirklich so eine hohe Impedanz haben kann, oder ob
> das an anderen Effekten liegt, die ich bei low-power berücksichtigen
> muss.

Ich verstehe ehrlich gesagt den Sinn dieser Frage nicht. Wie immer die 
Antwort lautet, es bleibt der Fakt daß das, was du versuchst, so nicht 
funktioniert. Und da du den ADC außerhalb der Spezifikation betreibst, 
ist das auch erwartbar.

Und um das auch gesagt zu haben: nein ich glaube nicht daß die 
Referenzspannungsquelle so hochohmig ist. Aber der Pfad durch den ADMUX 
ist es wohl. Der ist wohl nicht niederohmiger ausgelegt, als er muß 
(niederohmige MOSFET-Kanäle brauchen Chipfläche).

>> Wozu? Kürzer als ca. 20µs geht halt nicht.
>
> Da interessiert mich eher der Energiebedarf, inkl. aktiver MCU Zeit - ob
> es in Summe weniger Energie kostet, den ADC mehrfach (zB 10x) bei
> höherer Frequenz (2MHz) laufen zu lassen, um Vcc ordentlich zu sampeln

Dann experimentiere in dieser Richtung. Wenn du tatsächlich nur auf den 
ADC warten mußt, dann kannst du neben dem Sleepmode ruhig auch den 
CPU-Takt runtersetzen. Und persönlich glaube ich, daß mit einer oder 
zwei Messungen bei maximalem spezifizierten ADC-Takt das Optimum 
bezüglich Stromverbrauch liegt. Und vermutlich gibt es auch einen Wert 
für den ADC-Takt (niedriger als das erlaubte Maximum?) bei dem die 
Sample-Zeit für eine erfolgreiche Messung der Referenz im ersten Versuch 
reicht.

Denn offensichtlich interessiert dich ja gar nicht die benötigte Zeit 
sondern die die benötigte Energie.

> Allerdings bin ich mir auch noch nicht sicher, wie das mit dem
> Stabilisieren der Referenzspannungen nach einem WDT Wakeup nach einem
> Powerdown ist - im zweifel muß man da ja 25 ADC clocks (adc enable nach
> power down), sowie 70 usec (Ref Bandgap stabilisierung) warten, wo auch
> wieder Energie verbraucht wird...

Was länger dauert, solltest du offensichtlich zuerst anstoßen. Also Ref 
einschalten, ADC einschalten und dann mit minimalen CPU-Takt die 70µs 
abwarten. Den ADMUX kannst du ja schon auf die Referenz schalten und die 
Dummy-Wandlung während der Aufwachphase des ADC anstoßen.

> Vielleicht gibts ja auch Referenzen, was man bei solch
> Energie-Restriktiven Umgebungen alles sonst noch beachten sollte...

Fürs erste solltest du berücksichtigen, daß geringer Energieverbrauch 
nicht mit möglichst schneller Abarbeitung aller Aufgaben korreliert. 
Insbesondere nicht, wenn Wartephasen dabei sind. Aber da der ATTiny ja 
einen Clock-Prescaler hat, kannst du damit spielen. Und Aufgaben statt 
einmal richtig lieber 10x falsch zu machen und zu hoffen, daß sich 
Fehler wegmitteln, ist auf jeden Fall kontraproduktiv.

von Richard S. (rscheff)


Lesenswert?

Axel S. schrieb:
> Richard S. schrieb:
>> Axel S. schrieb:
>>> Richard S. schrieb:
>
> Und um das auch gesagt zu haben: nein ich glaube nicht daß die
> Referenzspannungsquelle so hochohmig ist. Aber der Pfad durch den ADMUX
> ist es wohl. Der ist wohl nicht niederohmiger ausgelegt, als er muß
> (niederohmige MOSFET-Kanäle brauchen Chipfläche).

ADMUX auf Gnd zu setzen liefert bei praktisch jeder ADCclk einen Wert 
von 0...

Spricht IMHO eher für eine hohe Impedanz bei der Referenzspannung, als 
einen hochohmigen Pfad (>>10kOhm) durch den ADMUX.

> Dann experimentiere in dieser Richtung. Wenn du tatsächlich nur auf den
> ADC warten mußt, dann kannst du neben dem Sleepmode ruhig auch den
> CPU-Takt runtersetzen. Und persönlich glaube ich, daß mit einer oder
> zwei Messungen bei maximalem spezifizierten ADC-Takt das Optimum
> bezüglich Stromverbrauch liegt. Und vermutlich gibt es auch einen Wert
> für den ADC-Takt (niedriger als das erlaubte Maximum?) bei dem die
> Sample-Zeit für eine erfolgreiche Messung der Referenz im ersten Versuch
> reicht.
>
> Denn offensichtlich interessiert dich ja gar nicht die benötigte *Zeit*
> sondern die die benötigte Energie.

Die Energie pro OP scheint recht konstant zu sein wenn man den 
Datenblättern glaubt (annähern linear zw. Freq und Stromaufnahme).

Auf diese Anregung hier habe ich mal versucht, nur rund um den Sample 
Zeitpunkt SysClk runterzudrehen, während ADCclk mit /2 läuft (26 CPU 
takte).
Den exakten Energieverbrauch muß ich erst noch messen, während dem 
Ganzen.
Aber es war interessant, dass es praktisch keinen Unterschied macht, ob 
ich nun nur während ADC sampling via der Sysclk die ADCclk auf 50..200 
kHz abbremse, oder die ADCclk die ganze Zeit mit einem höheren Divisor 
laufen lasse.

Das Problem der nicht vollständigen S/H Ladung wenn man den ADMUX 
"ständig" hin- und herschaltet, scheint damit, im Rahmen von 5-6 bit 
Genauigkeit, addressiert. Gleichzeit ist die "effektive" ADCclk deutlich 
höher als die im Datenblatt als zuverlässig angegebene, bzw das 1. 
Sample ist bereits verwertbar - was in Summe nur 1 Konvertierung 
braucht, und somit jedenfalls weniger Energie...

Oder anders, falls man eine höhere Genauigkeit bei schnellerer ADC 
Konvertierung braucht, und bei den Timern auf eine konstant SysClk 
verzichten kann (PLLclk gibts auch noch), kann das u.U. die Samples/sec 
um 2-4x verbessern helfen...
1
  ADMUX =  0<<REFS1 | 0<<REFS0 | 1<<ADLAR | 0b11110; // select 1.1v ref
2
  ADCSRB = (0<<BIN)|(0<<GSEL)|(0<<REFS2)|(0<<MUX5)|(0<<ADTS2)|(0<<ADTS1)|(0<<ADTS0);
3
  // ADCclk /2
4
  ADCSRA = 1<<ADEN | 0<<ADSC | 0<<ADATE | 1<<ADIF | 0<<ADIE | 0<<ADPS2 | 0<<ADPS1 | 1<<ADPS0;
5
6
  // enable modifying the clock prescaler
7
  CLKPR = 1<<CLKPCE;
8
  // start sample (2 cpu ticks)
9
  ADCSRA |= (1<<ADSC);
10
  // set clock prescaler to division by 64
11
  // 8MHz / 64 = 125kHz
12
  CLKPR = 0<<CLKPS3|1<<CLKPS2|1<<CLKPS1|0<<CLKPS0;
13
  // apparently, CLKPR is not accepting another update yet
14
  asm("nop");
15
  CLKPR = 1<<CLKPCE;
16
  // resume 8MHz ops, ADCclk now at 4MHz
17
  CLKPR = 0<<CLKPS3|0<<CLKPS2|0<<CLKPS1|0<<CLKPS0;
18
  // alternatively, do some useful work here (still ~20 cpu clock ticks left)
19
  while (ADCSRA & (1<<ADSC)) {
20
    count++;
21
  }
22
  samples = ADCH;




>> Vielleicht gibts ja auch Referenzen, was man bei solch
>> Energie-Restriktiven Umgebungen alles sonst noch beachten sollte...
>
> Fürs erste solltest du berücksichtigen, daß geringer Energieverbrauch
> nicht mit möglichst schneller Abarbeitung aller Aufgaben korreliert.

Leichter Einwand - dies ist für die Leistung (uA) vollkommen korrekt. 
Aber solange die Energie (uJ) das Limit ist, sollte trotzdem so viel wie 
möglich parallel gemacht werden, um konstante Verbraucher nicht länger 
als notwendig aktiv zu lassen (ARef zB).

Und konkrekt kann ich mir für ~50-100 usec recht hohe Leistung leisten, 
wenn danach für 900-950 usec Tiefschlaf herrscht. Leider kann ich den 
WDT nicht extern syncen, nur alle 125 ms aufwachen (bei niedriger 
Sysclk, während ein kleiner Cap Energie liefert). In der Zeit kann dann 
aber durchaus festgestellt werden, ob ein paar 100 uA drinnen sind ;)

(Gut, ist eine spezielle Umgebung in der das laufen wird, wohl eher 
unwahrscheinlich das jemand anderes ähnliche Anforderungen haben wird :) 
).


Auf jedenfalls Frohes Neues Jahr und Danke für die konstruktive 
Diskussion! Ohne diese hätte ich nicht darüber nachgedacht, selektiv die 
SysClk während des Samplings anzupassen (abzubremsen)...

von Loco (Gast)


Lesenswert?

Irgendwie macht es keinen Sinn die Referenz sampeln zu wollen, denn die 
referenziert ja die Messung. Und ob die speisung stabil ist sollte man 
besser einmal mit dem Oszilloskop messen.
Moeglichst schnell und moeglichst sparsam ist nicht wirklick 
korrelierend.
Was soll eine repetitive Messung ? Was machst du mit den Werten ? Falls 
nichts, brauchst du die auch nicht. Wenn dich zum Ueberpruefen der 
Stabilitaet ein paar Werte interesssieren, miss die einmal (1) in einen 
Buffer, ins Ram, und lies die nachher aus. Das war's dann.
Vergiss die Tinies, die sind fuer hohe Stueckzahlen. Die paar Cents zu 
sparen bringt dir nichts. Wenn du mit einem Mega schneller am Ziel bist, 
hast du viel mehr gewonnen, wie die paar Cents.

von Peter D. (peda)


Lesenswert?

Loco schrieb:
> Irgendwie macht es keinen Sinn die Referenz sampeln zu wollen

Der Trick ist die reziproke Messung, d.h. man mißt die konstanten 1,1V 
mit der VCC als Referenz.
Damit läßt sich ein early Power Fail erkennen und z.B. Daten im EEPROM 
sichern oder in Sleep gehen, um Tiefentladung zu verhindern.

Loco schrieb:
> Wenn du mit einem Mega schneller am Ziel bist,

Die ATmega haben exakt den gleichen ADC, da geht nichts schneller.

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

Nein, den ADC an Vcc zu betreiben und die Referenz Sampeln macht wenig 
Sinn fuer Power fails. Dabei vergibt man die Spannungueberhoehung vor 
einem Spannungsregler. Besser die Spannung vor dem Spannungsregler 
sampeln, die je nach dem eine Ecke hoeher ist, die ergibt so eine viel 
laengere Vorwarnzeit.

Die Entwicklung mit einem Mega geht schneller. Zum Einen hat man mehrere 
Ausgaenge welche zum Debuggen verwendet werden koennen, und sonst noch 
eine SPI oder UART.

von Richard S. (rscheff)


Lesenswert?

Pandur S. schrieb:
> Nein, den ADC an Vcc zu betreiben und die Referenz Sampeln macht wenig
> Sinn fuer Power fails. Dabei vergibt man die Spannungueberhoehung vor
> einem Spannungsregler. Besser die Spannung vor dem Spannungsregler
> sampeln, die je nach dem eine Ecke hoeher ist, die ergibt so eine viel
> laengere Vorwarnzeit.
>
> Die Entwicklung mit einem Mega geht schneller. Zum Einen hat man mehrere
> Ausgaenge welche zum Debuggen verwendet werden koennen, und sonst noch
> eine SPI oder UART.

Im Konkreten Anwendungsfall geht es nicht um Power Fail, sondern um 
Power Good... Der MCU sequenziert den Startup Ablauf, wobei ganz am 
Anfang nur wenige uA (für 50-100 usec  pro ms immerhin einige 100 uA) 
zur Verfügung stehen, jedoch auch mit hoher Impedanz.

Der LDO ist ein low-quiescent current (edit: MCP1704) und dessen 1uF Cap 
der einzige, aus dem der MCU für mehrere ms Energie beziehen kann - 
hauptsächlich für den WDT 128kHz timer und Tiefschlaf sonst. Ein zu 
hoher anfänglicher Ladestrom dieses Caps kann die Sequenz bereits 
durcheinander bringen...

Sobald aber die ersten paar Sekunden Startup geschafft sind, kommt dann 
ein richtiges Netzteil aktiv (auch das will validiert werden. Falls das 
schief geht, also nicht innerhalb von 5-20 sec 5V anliegen, muß 
weiterhin im Low-Power Modus ein koordinierter Shutdown gemacht werden).

Wie erwähnt, für (die richtigen) 50-100 usec kann ich mit der Leistung 
etwas freizügiger sein, also sysclk hochdrehen und ADC ein paar 
(low-impedance) Messungen machen lassen. Die inverse messung von ARef um 
zu sehen ob "noch" low-power 3.3V, oder "schon" high-power 5V anliegen, 
klappte halt nicht so wie bei den externen Quellen - daher dieser 
Thread.

Und lustigerweise sehen die neueren ATtinys exakt das von mir 
nachprogrammierte (mit sysclk verändern) verlängerte Sampling Intervall 
vor für Hochimpedanz-Analogquellen - nur viel bequemer, sysclk kann 
konstant bleiben, aber der ADC Wandler läuft um das zusätzliche Sampling 
und Sample-Delay länger (was man auch noch just vor der Messung der 
betroffenen Quelle anpassen kann).

Und ja, auf einem Mega mag die Entwicklung schneller gehen - und ja, ein 
Teil davon ist Spielerei, wie gering der Energieverbrauch fallen kann. 
Die moderneren ATtinys haben noch einen entwas gringeren Energiebedarf, 
da wird das dann etwas einfacher...

: Bearbeitet durch User
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.