zwei synchrone PWMs mit TMS320F2803x

Gast #2238416
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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 #2241841
Lesenswert?

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
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren