EPWM-Modulfunktionen
- EpwmA epwmB-Ausgänge können wie folgt funktionieren:
- Einzelkantenbetrieb
- symmetrischer Betrieb mit zwei Kanten
- asymmetrische Operation mit zwei Kanten
- Totzeit kann konfiguriert werden
- Das TZ-Ereignis kann konfiguriert und der logische Zustand des HI- und LO-Ausgangs eingestellt werden.
- Ein Interrupt- oder SOC-Ereignis für den ADC kann konfiguriert werden.
Kommen wir näher zu den Hauptblöcken: Woraus besteht das ePWM-Modul und woran ist es angeschlossen?
Wie Sie der Abbildung entnehmen können, enthält das ePWM-Modul nicht viele Blöcke. Daher ist es sinnvoll zu überlegen, wofür jedes Modul verantwortlich ist, und mit Signalen zu beginnen.
- EPWMxA- und EPWMxB-Signale sind wahrscheinlich das offensichtlichste Ausgangssignal. Der normale Logikzustand ist entweder HI oder LO, je nachdem, wie die Ausgabeaktion konfiguriert ist
- TZ1 — TZ6 — . , , , . , EPWMxA EPWMxB . , , - , , . . , .
- EPWMxSYNCI EPWMxSYNCO — , , .
- EPWMxSOCA- und EPWMxSOCB-Signale - hier ist alles mehr als klar aus dem Namen. Diese Ereignisse können SOC-Ereignisse für den ADC festlegen.
- EPWMxTZINT- und EPWMxINT-Signale - hier ein Interrupt-Ereignis auf TZ und auf Ereignisse, die sich auf die PWM selbst beziehen, beispielsweise ein Interrupt auf der PWM-Periode.
Kommen wir nun zu den
TB-Modulen (Time Base). Das Modul ist für die Ereigniszeit jedes ePWM-Moduls verantwortlich. Wir werden nicht auf alle Einstellungen dieses Moduls eingehen. Ich denke, es reicht aus, darauf zu achten, dass es drei Betriebsarten des Zählers gibt:
- Up-Down-Count-Modus
- Up-Count-Modus
- Down-Count-Modus
Außerdem gibt es eine Timer-Synchronisationseinstellung durch Einstellen des TBCLKSYNC
Counter Compare (CC) -Bitmoduls - über diese stellen wir nur unseren Arbeitszyklus ein.
AQ-Modul (Action-Qualifier) - Über dieses Modul können Sie den Status für ein Ereignis konfigurieren. Für Ausgänge können Sie die folgenden Aktionen konfigurieren:
- Auf HI-Status setzen
- Auf LO setzen
- Zustandsinversion durchführen
- Nichts tun
DB-Modul (Dead-Band Submodule) - Mit diesem Modul können Totbänder für PWM-Kanäle konfiguriert werden. Es ist für niemanden ein Geheimnis, dass die Transistortasten nicht sofort schalten. Um zu vermeiden, dass der obere Halbbrückenschlüssel keine Zeit zum Schließen hat und der untere bereits geöffnet ist, setzen sie eine Verzögerung für das Umschalten in den HI-Zustand und das frühere Umschalten in den LO-Zustand.
Trip-Zone-Submodul (TZ) -Modul - Wie oben erwähnt, ist dieses Modul mit der Behandlung von Notfällen verbunden. Hier können wir 1 von 4 Aktionen auswählen.
- Auf HI-Status setzen
- Auf LO setzen
- Stellen Sie den hochohmigen Zustand ein
- Nichts tun
Das Ereignis, das die Aktion des TZ-Moduls auslöst, kann sowohl von Software als auch von Hardware ausgelöst werden. Zusätzlich wird ein Interrupt-Anruf bereitgestellt.
Gehen wir nun von den Worten zum Üben über.
Zunächst müssen Sie GPIO für eine alternative epwm-Funktion konfigurieren
EALLOW;
// pull-up
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0x000;
GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0x000;
// GPIO EPWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0x001;
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0x001;
EDIS;
Wenn wir das GPIO bereits konfiguriert haben, können wir mit den verschiedenen Einstellungen fortfahren. Um den PWM-Betrieb zu konfigurieren, müssen Sie entscheiden, was wir erhalten möchten. Beginnen wir mit der TBCLK-Frequenz. Es wird durch die Formel bestimmt:
Hier müssen Sie darauf achten, dass CLKDIV standardmäßig 1 ist, bei HSPCLKDIV ist alles anders, standardmäßig ist es 2. Dies sollte beachtet werden, da es Zeiten gibt, in denen Leute es vergessen. Beim Laden eines Programms in den Arbeitsspeicher, häufig HSPCLKDIV = 1, wird dieses Problem nicht sofort bemerkt.
Wir haben uns für die Taktfrequenz von TBCLK entschieden. Aber wir müssten uns entscheiden, wie der Zähler für uns funktionieren soll. Durch Abnehmen, Erhöhen oder vielleicht hin und her müssen Sie dafür das entsprechende Register einrichten, zum Beispiel:
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
Damit sich in Zukunft niemand von Makros einschüchtern lässt, werden wir feststellen, woher sie überhaupt kommen. Diese Definitionen werden in einer Datei mit dem Namen DSP2833x_EPwm_defines.h definiert.
Dann müssen Sie entscheiden, wie unsere GPIOs auf das Erreichen bestimmter TBCTR-Werte reagieren. Es gibt mehr als genug Möglichkeiten. Sie sind in der folgenden Tabelle aufgeführt:
Dann müssen Sie entscheiden, welches Verhalten wir von den Ports A und B erwarten, nämlich, dass sie miteinander verbunden sind oder unabhängig arbeiten können. Wenn Port A der Master sein soll, schreiben wir einfach Aktionen dafür auf, zum Beispiel (Fall für das Hochzählen):
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
Wenn wir Unabhängigkeit für den zweiten Port wünschen, fügen Sie hinzu:
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
Für weitere Details zu den Einstellungen müssen Sie sich nur für eine Ergänzung auf das Bild oben beziehen. Es gibt etwas mehr AQCTLA-Register als in der Tabelle gezeigt. Dies ändert das Bild nicht wesentlich, aber es werden nur Einzelheiten dazu eingeführt, in welchem Fall der Zähler den gewünschten Wert erreicht hat, beispielsweise beim Einzählen oben oder unten zählen. Weitere Informationen zu den Bits finden Sie im Ausschnitt aus der .h-Datei des Systems
struct AQCTL_BITS { // bits description
Uint16 ZRO:2; // 1:0 Action Counter = Zero
Uint16 PRD:2; // 3:2 Action Counter = Period
Uint16 CAU:2; // 5:4 Action Counter = Compare A up
Uint16 CAD:2; // 7:6 Action Counter = Compare A down
Uint16 CBU:2; // 9:8 Action Counter = Compare B up
Uint16 CBD:2; // 11:10 Action Counter = Compare B down
Uint16 rsvd:4; // 15:12 reserved
};
Wenn wir 2 ePWM-Ports haben, die unabhängig voneinander arbeiten und die Totzeit einstellen möchten, müssen wir das Register auf den gewünschten Status setzen, zum Beispiel:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
Nachdem wir uns für die Beschreibung der Peripherie entschieden haben, können wir mit konkreten Beispielen fortfahren.
Konfigurieren von ePWM im Zählmodus
Hier ist ein Beispiel ohne Totzeit und Port A und Port B arbeiten unabhängig voneinander. Wenn A aktiv ist, ist B inaktiv.
EPwm1Regs.TBPRD = 150000 / 5; // . 150 / 5000
// 50%
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;
EPwm1Regs.TBPHS.half.TBPHS = 0;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm1Regs.AQCTLB.bit.PRD = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
Auf dem Oszillogramm sehen Sie das erhaltene Ergebnis:
Jetzt können Sie versuchen, die Totzeit hinzuzufügen. Dazu fügen wir hinzu:
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
EPwm1Regs.DBCTL.all = BP_ENABLE + POLSEL_ACTIVE_HI_CMP; // db
EPwm1Regs.DBFED = 300; // = 150 * 2 = 300
EPwm1Regs.DBRED = 300;
Die Totzeit wird auf die gleiche Weise wie die Frequenz gemäß der Formel gezählt:
Und jetzt haben wir die Totzeit genau so, wie wir es wollten.
Was ist, wenn wir Port A und Port B trennen müssen? Dies findet auch statt. Hier ist alles einfach. Wir kehren zum ersten Beispiel zurück, löschen die letzten 4 Zeilen und schreiben jeden Arbeitszyklus in die folgenden Register.
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2; // 50%
EPwm1Regs.CMPB = EPwm1Regs.TBPRD / 3; // 33%
Jetzt haben wir so ein Bild. Sie können das Tastverhältnis für jeden Kanal separat einstellen.
Für den Zerfallsmodus ist alles ungefähr gleich. Es gibt einen Unterschied zum Countdown im Auf-Ab-Modus. Hier wird die Shim-Frequenz nach folgender Formel berechnet:
Gleiches gilt für die Totzeit.
Wahrscheinlich ist die einzige wichtige Sache, die nicht berücksichtigt wurde, die TZ-Einstellung. Nun wollen wir uns dieses Modul etwas genauer ansehen.
Um ein Alarmereignis programmgesteuert auszulösen, müssen die folgenden Register konfiguriert werden:
EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO;
Der PWM-Alarm kann mit den folgenden Befehlen aufgerufen und zurückgesetzt werden:
//
EALLOW;
EPwm1Regs.TZFRC.bit.OST = 0x001;
EDIS;
//
EALLOW;
EPwm1Regs.TZCLR.bit.OST = 0x0001;
EDIS;
Wenn wir das TZ-Signal in Hardware aufrufen möchten, ist alles noch einfacher. Über das TZSEL-Register stellen wir die benötigte TZ ein. Zusätzlich ist es jedoch erforderlich, den GPIO auf TZ zu konfigurieren.
Fazit
Wenn jemand diesen Artikel interessant findet, kann ich ein paar weitere Artikel mehr oder weniger beschleunigt schreiben. Ich habe vor, das Dosenmodul in Betracht zu ziehen, ich möchte dma, und vielleicht schreibe ich auch einen kleinen Artikel über IQMath von ti mit ihren Bibliotheken.