zwei synchrone PWMs mit TMS320F2803x

Gast #2238416
Hallo,
zur Zeit beschäftige ich mich mit dem TMS320F2803x von TI. Momentan 
versuche ich mich daran zwei PWMs synchron (im PWM UP_DOWN Mode) laufen 
zu lassen. Hierbei soll die Frequenz von PWM2 N mal Frequenz von PWM1 
(PWM1 = "Masterfrequenz") sein. Das funktioniert auch soweit, nur ist 
das Signal von PWM1 nicht phasengleich mit PWM2 (immer um 90° 
verschoben).
Im Datenblatt zur PWM (Spruge 9) gibt es ein Beispiel dazu aber leider 
nur mit F_PWM2 = F_PWM1.
Nun versuche ich schon seit Tagen dies so zum Laufen zu bekommen, aber 
leider ist mir das nicht so möglich.
Vllt kann mir hier jmd. weiterhelfen.
Hier mal mein Code dazu:
1
{
2
..
3

4
EPwm1Regs.CMPA.half.CMPA = 600;    // adjust duty for output EPWM1A
5
EPwm1Regs.CMPB = 600;      // adjust duty for output EPWM1B
6
EPwm2Regs.CMPA.half.CMPA = 150;    // adjust duty for output EPWM2A
7
EPwm2Regs.CMPB = 150;      // adjust duty for output EPWM2B
8

9
}
10

11
void init_epwm1(void)
12
{
13

14
// EPWM Module 1 config
15
EPwm1Regs.TBPRD = 1200;        
16
EPwm1Regs.TBPHS.half.TBPHS = 0;  
17
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;   // Symmetrical mode
18
EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;      // Master module
19
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
20
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;
21
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    
22
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
23
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
24
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
25
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;  // load on CTR=Zero
26
EPwm1Regs.AQCTLA.bit.CBU = AQ_SET;    // set actions for EPWM1B
27
EPwm1Regs.AQCTLA.bit.CBD = AQ_CLEAR;
28

29
  
30
}
31

32

33
void init_epwm3(void)
34
{
35
// EPWM Module 2 config
36
EPwm2Regs.TBPRD = 300;
37
EPwm2Regs.TBPHS.half.TBPHS = 0;  
38
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;   // Symmetrical mode
39
EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE;    // Slave module
40
EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW;
41
EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
42
EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;  // TBCLK = SYSCLKOUT
43
EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1;
44
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
45
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;  // load on CTR=Zero
46
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
47
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;    // set actions for EPWM2A
48
EPwm2Regs.AQCTLA.bit.CAD = AQ_CLEAR;
49
}
Gast #2238499
Hallo,

also für dich gilt wohl eher Figure 7 in spruge9e. (03x).
Die Frequenz spielt auch keine Rolle.

Was mir aufgefallen ist: in epwm1 schaltest du den SyncOut aus. Das ist 
falsch, du musst Impulse rausschicken. Dann musst du epwm2 (!) auch 
korrekt intialisieren, der Syncimpuls muss durch das Modul durchgehen, 
um dann bei epwm3 triggern zu können.

Ansonsten kann ich nur sagen, dass sowas prinzipiell funktioniert... 
Aber das wird dir nicht weiterhelfen.

Also mein Rat: geh nach Figure 7 vor, konfiguriere epwm1 und epwm2 
richtig und dann wird das funktionieren...

Viel Erfolg!
Gast #2238619
Ist ganz einfach, mach folgende Änderungen:

EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE;  ==> ändern zu: ==>
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_CTR_ZERO; (Immer bei CTR==0 wird ein 
Impuls erzeugt, dieser wird beim PWM2 zum syncen verwendet. )

Der Rest sollte so eingestellt bleiben.

Grüße
Gast #2238635
Super, vielen Dank.
Hmm, der zeitliche Versatz ist doch größer als ich dachte.
Muss mich dann wohl noch an einer HRPWM statt der PWM2 versuchen. Mal 
sehen ob der dann kürzer ist.

Gruß
Gast #2238644
Schau mal im spruge9e nach.
Auf Seite 83 sind Blöcke zu sehen. Schaue die dir mal genau an.
Überdies ist das auf den Seiten 83-85 erklärt, sogar mit "Code Snippet"


Viel Erfolg!

Grüße
Gast #2241841
Das ganze Funktioniert so wie es um 16:44 beschreiben wurde.
Leider folgt PWM2 beim Achtfachen der PWM1 (~205kHz) mit einem Versatz 
von ca. 150ns was für mich noch zu viel ist.
Weiß jmd ob das ganze mit der HRPWM etwas schneller zu erledigen ist?
Gast #2252820
Hallo,
momentan versuche ich mich daran eine normale PWM als Master und eine 
zweite HRPWM als Slave laufen zu lassen. Für die HRPWM gibt es auch ein 
schönes Beispiel von TI. Leider aber keines mit Synchronisation. Das 
Problem was ich nun habe ist das Slave Signal mit dem Master Sginal zu 
synchronisieren. Mit den Einstellungen aus der normalen PWM 
Synchronisaton funktioniert es irgendwie nicht oder ist ein Verzögerung 
von PWM1 zu (HR)PWM2 von ca. 160ns wirklich das Maximum in der 
Synchronisation (Sysclk = 60MHz)?
Hier der Code von TI mit meinen Abänderungen, vllt. findet von euch jmd 
den Fehler oder weiß wo ich noch etwas setzen/weglassen kann.

Danke :)
1
void HRPWM1_Config(period)
2
{
3

4
EALLOW;
5
     
6
EPwm1Regs.TBPRD = period/2;              // Period = 585,37 TBCLK counts
7
  EPwm1Regs.TBPHS.half.TBPHS = 0;          // Set Phase register to zero
8
  
9
  EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;   // Symmetrical mode
10
  EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;      // Master module
11
  EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;
12
  EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
13
  EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;    // TBCLK = SYSCLKOUT
14
  EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;   
15
  EPwm1Regs.TBCTL.bit.FREE_SOFT = 3;
16
      
17
    EPwm1Regs.ETSEL.bit.SOCAEN  = 1;     
18
     EPwm1Regs.ETSEL.bit.SOCASEL  = ET_CTR_ZERO;     
19
     EPwm1Regs.ETPS.bit.SOCAPRD   = ET_1ST;
20
  
21
  EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
22
  EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
23
  EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;  // load on CTR=Zero
24
  
25
//  EPwm1Regs.AQCTLA.bit.CBU = AQ_SET;        // set actions for EPWM1B
26
//  EPwm1Regs.AQCTLA.bit.CBD = AQ_CLEAR;        // if using this one TBPRD = 147
27
  EPwm1Regs.AQCTLA.bit.ZRO = AQ_TOGGLE;
28
  EDIS;
29
}
30

31
void HRPWM3_Config(period)
32
{
33
  
34
  
35
// ePWM3 register configuration with HRPWM
36
// ePWM3A toggle high/low with MEP control on falling edge
37

38
  EPwm3Regs.TBCTL.bit.PRDLD = TB_SHADOW;          // set Immediate load
39
  EPwm3Regs.TBPRD = period-1;                        // PWM frequency = 1 / period
40
  EPwm3Regs.CMPA.half.CMPA = period / 2;              // set duty 50% initially
41
  EPwm3Regs.CMPA.half.CMPAHR = (1 << 8);              // initialize HRPWM extension
42
  EPwm3Regs.TBPHS.all = 0;
43
  EPwm3Regs.TBCTR = 0;
44
  
45
  
46

47
  EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
48
  EPwm3Regs.TBCTL.bit.PHSEN = TB_ENABLE;            // EPwm3 is the Master
49
  EPwm3Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;
50
  EPwm3Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
51
  EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1;
52
  
53
  EPwm3Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD;
54
  EPwm3Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD;
55
  EPwm3Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
56
  EPwm3Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
57

58
  EPwm3Regs.AQCTLA.bit.ZRO = AQ_SET;                  // PWM toggle high/low
59
  EPwm3Regs.AQCTLA.bit.CAU = AQ_CLEAR;
60
  EPwm3Regs.AQCTLB.bit.ZRO = AQ_SET;
61
  EPwm3Regs.AQCTLB.bit.CBU = AQ_CLEAR;
62

63
  EALLOW;
64
  EPwm3Regs.HRCNFG.all = 0x0;
65
  EPwm3Regs.HRCNFG.bit.EDGMODE = HR_BEP;               //MEP control on falling edge
66
  EPwm3Regs.HRCNFG.bit.CTLMODE = HR_CMP;
67
  EPwm3Regs.HRCNFG.bit.HRLOAD  = HR_CTR_PRD;
68
  EDIS;
69
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.