Forum: Mikrocontroller und Digitale Elektronik ATMega1284P Timer1 und Timer3 synchronisieren


von Anja (Gast)


Lesenswert?

Hallo,

ich will 3 100Hz PWM-Signale (5V Pegel) mit 16 Bit Auflösung und 
möglichst geringem Stromverbrauch erzeugen. Anforderung für die 
Linearität der angeschlossenen Analog-Schaltung ist daß alle 3 
PWM-Signale synchron erzeugt werden.

http://www.edn.com/article/471981-DC_accurate_32_bit_DAC_achieves_32_bit_resolution.php

Bei den beiden PICs die ich verwendet habe, kann man für den PWM-Ausgang 
entweder den Timer frei wählen (dsPIC30F4013, PIC24FJ64GA002) oder es 
gibt eine Synchronisationsmöglichkeit (PIC24FV32KA302). Mit letzterem 
habe ich 2,1 mA (Datenblattwert 1,45mA bei 13,1MHz) erreicht. Mit dem 
ATMega1284P wären theoretisch bei 5V Versorgung 1,2mA (im Sleep-Mode bei 
6,5536 MHz) (Stromangabe mit/ohne Quarz-Oszillator?) drin.

Punkt1:
Laut Datenblatt gibt es keine Möglichkeit die Timer1 + 3 zu 
synchronisieren: außer man startet sie kurz nacheinander mit 
gestaffelten Startwerten und zählt die Takte im Assembler ab (und hofft 
darauf daß sich der Timer nie verzählt).

Punkt2:
Außerdem möchte ich für Kalibrierzwecke+Linearitätsmessungen 100% PWM 
ausgeben können. Beim PIC setze ich einfach das gemeinsame 
Periodendauerregister < dem PWM-Wert 0xFFFF. Beim ATMega scheidet das 
wohl aus da ja sonst die Gefahr besteht daß die Timer wieder 
auseinanderlaufen.

Wie würdet Ihr die beiden Problempunkte behandeln?

Gruß Anja

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> man startet sie kurz nacheinander mit
> gestaffelten Startwerten und zählt die Takte im Assembler ab (und hofft
> darauf daß sich der Timer nie verzählt).

So müßte es gehen.
Warum sollte sich ein Timer verzählen?

Anja schrieb:
> Außerdem möchte ich für Kalibrierzwecke+Linearitätsmessungen 100% PWM
> ausgeben können.

Außer bei Fast-PWM kannst Du 100% einstellen.
Du kannst aber auch einfach die IO-Pins auf high setzen und wieder von 
der  PWM abschalten (Normal port operation, OCnA/OCnB disconnected).


Peter

von Anja (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Warum sollte sich ein Timer verzählen?

Evtl wegen einer EMV-Störung so daß auf Grund von Toleranzen der eine 
Timer mal kurz stehen bleibt oder resetiert wird und der andere normal 
weiterläuft.
Oder wenn ich den einen PWM auf 100% setze also die PWM deaktiviere und 
dann wieder auf einen kleineren Wert setze. (Zyklische Kalibrierung bei 
längeren Messungen).
Da werde ich wohl einen Check auf gleichbleibende Differenz im Timer 
Overflow-Interrupt einbauen müssen. Und im Fehlerfall resetieren. Ein 
kurzer Fehler ist wohl besser wie ein stundenlanger Offset bei der 
Messung.

Peter Dannegger schrieb:
> Außer bei Fast-PWM kannst Du 100% einstellen.
Geht bei voller 16-Bit-Auflösung nicht.

Peter Dannegger schrieb:
> Du kannst aber auch einfach die IO-Pins auf high setzen und wieder von
> der  PWM abschalten (Normal port operation, OCnA/OCnB disconnected).
Das wäre eine Möglichkeit vorausgesetzt der PWM-Timer läuft normal 
weiter. Werde ich mal testen.

Gruß Anja

von Willi (Gast)


Lesenswert?

Anja schrieb:
> Evtl wegen einer EMV-Störung so daß auf Grund von Toleranzen der eine
> Timer mal kurz stehen bleibt oder resetiert wird und der andere normal
> weiterläuft.

Das ist aber schon Schwarzmalerei.
Da müßte man auch den Stack ins EEPROM legen, damit er nicht zerschossen 
werden kann :-)

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> Evtl wegen einer EMV-Störung so daß auf Grund von Toleranzen der eine
> Timer mal kurz stehen bleibt oder resetiert wird und der andere normal
> weiterläuft.

Der Timer ist ne separate Hardwareeinheit.
Wenn Du soviel Störungen auf den CPU-Takt einkoppelst, wird viel eher 
die CPU sich verrechnen.

Du kannst davon ausgehen, daß bei vernünftigen Platinenlayout und 
ordentlicher VCC die Timer immer richtig zählen.
Und wenn Du einen externen Takt nimmst, können sie maximal einen 
CPU-Takt auseinander liegen.

Die einzige Möglichkeit, daß sie falsch zählen, ist, daß Du sie 
absichtlich in Software falsch setzt.


Peter

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> Peter Dannegger schrieb:
>> Außer bei Fast-PWM kannst Du 100% einstellen.
> Geht bei voller 16-Bit-Auflösung nicht.

Dann muß wohl das Datenblatt lügen:

"If the OCRnx is set equal to BOTTOM the
output will be continuously low and if set equal to TOP the output will 
be continuously high for
non-inverted PWM mode."


Peter

von Anja (Gast)


Lesenswert?

Peter Dannegger schrieb:
> "If the OCRnx is set equal to BOTTOM the
> output will be continuously low and if set equal to TOP the output will
> be continuously high for
> non-inverted PWM mode."

Ups,
0   (Bottom) = 0%
0xFFFF (top) = 100 % (erwartet hätte ich 99,9985% = 65535/65536)
und welcher Wert fehlt dann in der Reihe dazwischen der Wert 1 oder der 
Wert 0xFFFE oder sogar 0x8000?

Ist mir schon bei den PICs aufgefallen daß es da mindestens 2 
verschiedene Vorgehensweisen gibt:
Beim PIC24FV32KA302 ist der tatsächlich ausgegebene Wert
Register -> Output
0 = 0
1 = 2 (= 153uV)
0xFFFE = 0xFFFF
0xFFFF = 0x10000 = 100%

bei den beiden anderen PICs ist es so wie ich erwartet hätte:
Register -> Output
0 = 0
1 = 1 (= 76uV)
0xFFFE = 0xFFFE
0xFFFF = 0xFFFF
Dauerhigh nur dann wenn das Periodendauer-Register < PWM-Wert ist.

Gruß Anja

von Anja (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Dann muß wohl das Datenblatt lügen:
>
> "If the OCRnx is set equal to BOTTOM the
> output will be continuously low and if set equal to TOP the output will
> be continuously high for
> non-inverted PWM mode."

Tut es auch:
ich habe jetzt mal TOP in ICR = 0xFF gesetzt (mein Hameg ist bei 0xFFFF 
leider zu dunkel) und Bottom ist ja in Mode 14 = 0.
Das ganze bei 6,5536 MHz also Periode rund 40us.

Bei OCR = 0x00FF erhalte ich continouously high.
Aber bei OCR = 0x0000 ist der entsprechende Ausgang für 150ns high was 
auch zur Beschreibung paßt daß der Flankenwechsel an dem Takt nach 
Erkennung auf Gleichheit erfolgt.

The 16-bit comparator continuously compares TCNTn with the Output 
Compare Register (OCRnx). If TCNT equals OCRnx the comparator signals a 
match. A match will set the Output Compare Flag (OCFnx) at the next 
timer clock cycle.

Bei OCR = 0x0001 dann 300ns high Zeit.
Also immer 150ns zu viel. Um einen Offset-Abgleich (0uV) zu machen muß 
ich also den Timer ausschalten.


Jetzt gibt es also schon 3 Varianten wie ein 16 Bit PWM in der Praxis 
aussehen kann.


Gruß Anja

von Peter D. (peda)


Lesenswert?

Anja schrieb:
> Tut es auch:
> ich habe jetzt mal TOP in ICR = 0xFF gesetzt (mein Hameg ist bei 0xFFFF
> leider zu dunkel) und Bottom ist ja in Mode 14 = 0.

Mode 14 ist Fast-PWM.

Der Text gilt wie gesagt nur für nicht Fast-PWM.


Peter

von Ralf G. (ralg)


Lesenswert?

Falls noch aktuell:
Müssen das unbedingt 16Bit PWM-Auflösung sein?
So bei <14Bit-PWM und >12Mhz Taktfrequenz könnte man das vielleicht mit 
einem Timer und 'in Software' machen.

von Anja (Gast)


Lesenswert?

Ralf G. schrieb:
> Falls noch aktuell:
> Müssen das unbedingt 16Bit PWM-Auflösung sein?

Ja, (die Regeln gebe ich vor)
Der PWM für die oberen 16 Bit ist entscheident für die Gesamtlinearität 
der Schaltung.

> So bei <14Bit-PWM und >12Mhz Taktfrequenz könnte man das vielleicht mit
> einem Timer und 'in Software' machen.

>12 MHz bedeutet mehr Stromverbrauch. (Dann bleibe ich beim PIC).

Die 0% lassen sich gut über das TCCR1A Register realisieren. -> die 
Sonderbehandlung bei 0% ist kein großer Aufwand. Die synchronisation 
bleibt erhalten. Synchronisationsverluste habe ich nur wenn ich die 
Periodendauerregister verändere. (Was beim TCCR1A-Register nicht 
notwendig ist).

Aktuell habe ich den Stromverbrauch des ATMega1284P gemessen:
Bei 6,5536 MHz Quarz + Takt (und entsprechend eingestellten Fuses) und 
die meiste Zeit im Sleep Mode bei deaktivierem ADC/VREF komme ich auf 
2,1 - 2,15 mA.

Also trotz besserem Datenblattwert beim AVR gleichauf mit dem 
PIC24FV32KA302 bei 3,2768 MHz Quarz und 4*PLL also 13,1 MHz.

Das einzige Problem das ich im Moment noch habe ist daß die Schaltung 
plötzlich "über Nacht" nach Auschalten und wiedereinschalten nicht mehr 
funktioniert hat. Ich wollte gerade neu Flashen als beim Anstecken der 
ISP-Schnittstelle die Schaltung plötzlich angelaufen ist. Ich weiß jetzt 
nicht ob es daran liegt daß ich beim Reset-Pin auf den Internen Pull-up 
vertraut habe und keinen externen angeschlossen habe. (Bei mir ist nur 
ein 1nF Entstörkondensator und der Stecker für die ISP-Schnittstelle 
angeschlossen).

Oder eventuell kommt der AVR mit der Low-Power-Einstellung für den Quarz 
nicht klar. FUSEL ist bei mir auf 0xFD.

Ich werde mal einen 10k pull-up am Reset nachrüsten und beobachten. 
Falls jedoch der Oszillator unzuverlässig anschwingt ist der PIC klar im 
Vorteil.

Gruß Anja

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.