PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Phasenkorrekt Modus Interrupts



Wombatz
01.12.2011, 09:21
Hallo zusammen,

ich habe eine Frage zu dem Phasenkorrekten Interrupts.
Der Timer zählt von Bottom bis Top und zurück. Ein Interrupt kann bei Top oder Bottom ausgelöst werden.
Kann man auch bei Top und Bottom einen Interrupt auslösen?
Wie kann ich die Interrupts gleichzeitig einschalten?
Oder muss ich in der Hauptschleife die Flags auslesen??

Mit On Timer2 xxx und Sreg.7=1 kann ich den Top Interrupt einschalten.
Wie sieht der Code bei dem Bottom Interrupt aus?

Habe im Datenblatt und im Netz bis jetzt keine Antwort gefunden. Ich hoffe ihr könnt mir helfen.

Danke im Vorraus

radbruch
01.12.2011, 10:04
Hallo

Es treten die gleichen Interrupts auf wie in den anderen Timer-Modi. Overflow jedesmal wenn BOTTOM erreicht wird, MatchCompare jeweils beim Rauf- und beim Runterzählen:


The Timer/Counter Overflow Flag (TOV2) is set each time the counter reaches BOTTOM. The Interrupt Flag can be used to generate an interrupt each time the counter reaches the BOTTOM value.

The OCF2 bit is set (one) when a Compare Match occurs between the Timer/Counter2 and the data in OCR2 – Output Compare Register2.(Aus dem Datenblatt des Mega8 unter "Phase Correct PWM Mode")

Searcher
01.12.2011, 10:06
Hallo,


Kann man auch bei Top und Bottom einen Interrupt auslösen?

Müßte man ins jewilige Datenblatt schauen. Welchen µC und welchen Timer darauf nutzt Du?

Beim ATMega8 wird bei Timer1 der Overflow Interrupt im Phase Correct am Bottom ausgelöst. Bei Top ist es der COMPARE1A oder ICR1, je nach Konfiguration des Timers.

TOV und die anderen kann man gleichzeitig enablen und sollten dann auch nutzbar sein.

Gruß
Searcher

Wombatz
01.12.2011, 10:08
Wie springe ich denn bei dem MatchCompare/bzw ICR1 Modus in das Label?
Nutze übrigends auch den Atmega8

Searcher
01.12.2011, 10:28
Also oben sehe ich, das Du Timer2 nutzen möchtest. Da ist es das OCR2 Compare Register für Interrupt on TOP (EDIT nicht Interrupt on TOP sondern on Compare, on TOP geht mit Timer2 Phase Correct PWM nicht !?)

Sollte mit

Enable OC2
Enable TIMER2

On OC2 ISR_COMPARE
On TIMER2 ISR_BOTTOM

gehen

Gruß
Searcher

radbruch
01.12.2011, 10:30
In der Bascomhilfe unter On Interrupt findet man diese Liste von möglichen Interrupts:


INT0, INT1, INT2, INT3, INT4,INT5, TIMER0 ,TIMER1, TIMER2, ADC , EEPROM , CAPTURE1, COMPARE1A, COMPARE1B,COMPARE1.

Or you can use the AVR name convention:

OC2 , OVF2, ICP1, OC1A, OC1B, OVF1, OVF0, SPI, URXC, UDRE, UTXC, ADCC, ERDY and ACI.
Vermutlich bedeutet On Timer2 den Überlaufinterrupt bei BOTTOM, aber um sicher zu gehen würde ich diesen so initialisieren:

On OVL2 OVL-ISR

Für den MatchCompare-Interrupt bei TOP müßte man das OCR2 mit 255 laden und die ISR etwa so einklinken:

On OC2 MatchCompare-ISR

(ungetestet und zu langsam)

Searcher
01.12.2011, 10:36
(ungetestet und zu langsam)
Bei mir auch und hab grad 'nen Fehler bei mir entdeckt. Der OC2 Interrupt wird nicht bei TOP ausgelöst, sondern bei Compare match. TOP Interrupt geht im Timer2, glaub ich, nicht. Sollte mir auch etwas mehr Zeit nehmen.

@Wombatz: Beschreib doch mal genauer, was Du machen möchtest. Denke, das Timer1 geeigneter wäre. Da gibt es aber mindestens 2 Möglichkeiten...

Gruß
Searcher

Wombatz
01.12.2011, 11:18
Also, ich bastel gerade an einer Motoransteuerung für einen Brushless Motor. Gerade versuche ich den Kommutierungszeitpunkt zu ermessen (ADC). Hierzu brauche ich den PhaseCorrectModus, damit der Nulldurchgang einerseits gemessen wird und andererseits der Mittelwert verglichen wird. Da der Nulldurchgang die Hälfte der Ausgangsspannung ist, muss der Wert halbiert und dann mit einem Interrupt ausgelöst werden. Damit schaltet der Controller dann im richtigen Zeitpunkt auf die nächste Spule des Motors.

Danke der schnellen Antworten

Ach ja den Timer1 wollte ich für die PWM der Phasenansteuerung nehmen

Searcher
01.12.2011, 13:14
Hi,
also ich versuchs nochmal:

Kann leider nicht beurteilen, ob Du nicht auch Timer2 anstelle Timer1 für die PWM der Phasenansteuerungs nehmen kannst.

So wie ich das Datenblatt verstehe, ist es mit Timer2 nicht vorgesehen, Interrupts im Phase Correct PWM bei TOP und BOTTOM zu nutzen.

Für Timer1 geht es nach Tabelle 39, Seite 98 im Datenblatt (http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf) nur für die Modes 8, 9, 10 und 11.
Modes 1, 2, 3 scheinen mir keinen Interrupt bei TOP auszulösen.

Einstellung des Modes 8 :
CONFIG TIMER1 = TIMER , PRESCALE = x
SET TCCR1B.WGM13
SET - noch weitere Einstellungen zB welche Pins als Output genutzt werden sollen
(hab dazu keine Erfahrung, wie das mit dem CONFIG TIMER Kommando geht. Ich benutze immer SET Anweisungen)

TOP Wert einstellen im Register ICR1
ICR1 = x

Pulsweite einstellen im Register OCR1A oder OCR1B (je nachdem welche PWM Output Pins am µC genutzt werden sollen)

Interrupts:

ENABLE ICP1
ENABLE OVF1

ON ICP1 ISR_TOP
ON OVF1 ISR_BOTTOM

ENABLE INTERRUPTS

Timer1 ist ja 16 Bit und läßt sich für Deine gewünschte Funktion nicht auf geringere Auflösung umstellen!?
Timer2 ist 8 bit und könnte für Phasenansteuerung noch gehen ???

PS: Kann das leider nicht testen.

Gruß
Searcher

Wombatz
01.12.2011, 17:02
Vielen Dank für deine Hilfe.

Ich werd das mal so versuchen.

Gruß Wombatz...

Sorry nochmal aber es hakt.....

Ich habe es gerade mal Versucht mit dem Timer1 zwei Interrupts auszulösen. Bei mir geht immer nur einer der Beiden. Zusammen funktionieren die nicht:
Hier mal der Code:

Tccr1a = &B00000010 'Bit7+4=keinCompare,Bit3+2=keinForceOutputCompare, Bit1+0=PWMPhaseCorrect
Tccr1b = &B00010010 'Bit7=NoiseCancelaus,Bit6=FallingEdge,Bit5=Reserve ,Bit4+3=WaveformGenerationMode,Bit2+0=Prescaler/8
Timsk.toie1 = 1 'Timer Overflow Interrupt (TOP) ein
Enable Icp1 'Timer Bottom Interrupt ein

Sreg.7 = 1 'Interrupt global freigeben

On ovf1 Adc_messung
On Icp1 Compare_messungen

'_____________

Do
"Mach Sachen"
Loop
'____________

Adc_messung:

Toggle Portd.6

Return
'___________________

'Compare_messungen:

Toggle Portd.7

Return

Einmal ist Portd.6 (ADC_Messung) 0,00V und wenn ich den anderen Interrupt ausblende, funktionier der???
Mache ich da was falsch???

Wombatz
01.12.2011, 19:11
Hat sich erledigt... Wenn ich ICR1 einen Wert zuweise funktionier das...

Danke der schnellen Hilfe

Gruß Wombatz

Searcher
01.12.2011, 19:38
Prima. Ich blick gerade nicht durch, welchen Mode Du benutzt. Im Mode 8 wird der ICP1 bei TOP ausgelöst. Der Inhalt von ICR1 ist TOP und bestimmt damit auch die PWM Frequenz.

Der OVF1 (Overflow) Interrupt wird bei BOTTOM ausgelöst. In Deinem vorletzten Post, den ich grad erst gesehen habe, ist das für mich irgendwie mißverständlich nach Programmcode.


Timsk.toie1 = 1 'Timer Overflow Interrupt (TOP) ein
Enable Icp1 'Timer Bottom Interrupt ein
In den Remarks ist TOP und Bottom vertauscht.


Egal, Hauptsache es klappt.

Gruß
Searcher