Forum: Digitale Signalverarbeitung / DSP / Machine Learning zwei synchrone PWMs mit TMS320F2803x


von TMS320F2803x (Gast)


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
}

von Karl (Gast)


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!

von Knall Heinz (Gast)


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

von TMS320F2803x (Gast)


Lesenswert?

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ß

von Knall Heinz (Gast)


Lesenswert?

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

von TMS320F2803x (Gast)


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?

von TMS320F2803x (Gast)


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
}

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.