Forum: Mikrocontroller und Digitale Elektronik ePWM vom Texas Instr. F28335


von Sebastian (Gast)


Lesenswert?

Hallo zusammen,

zur ePWM vom F28335 habe ich ein paar einfache Fragen. Ich habe das 
C2000 Experimenter Kit (http://www.ti.com/product/tms320f28335) und 
möchte eine PWM realisieren, welche eine Frequenz von 100 kHz hat. Der 
Tastgrad soll dabei je nach Einstellung zwischen 0 und 1 liegen.

- 1. Frage: Kann man das Projekt noch im Debug-Modus von 
CodeComposerStudio machen? Oder werden da zusätzliche Codezeilen 
eingebaut, die bei solchen Frequenzen das debuggen unmöglich machen - 
bzw. die Frequenz verändern?

- 2. Frage: Ich habe versucht dies anhand der Beispiele von TI zu 
machen. Ich musste aber mit einem Oszilloskop feststellen, dass die 
hohen Frequenzen gar nicht erreicht werden:
1
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
2
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
3
4
...
5
main
6
...
7
8
GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;    // Enable pull-up on GPIO0 (EPWM1A)
9
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;   // Configure GPIO0 as EPWM1A
10
11
PieVectTable.EPWM1_INT = &epwm1_isr;
12
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
13
14
...
15
16
EPwm1Regs.TBPRD = 3500;                        // Set timer period
17
   EPwm1Regs.TBPHS.half.TBPHS = 0x0000;           // Phase is 0
18
   EPwm1Regs.TBCTR = 0x0000;                      // Clear counter
19
20
   // Setup TBCLK
21
   EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
22
   EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE;        // Disable phase loading
23
   EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV4;       // Clock ratio to SYSCLKOUT
24
   EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV4;
25
26
   EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;    // Load registers every ZERO
27
   EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
28
   EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
29
   EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
30
31
   // Setup compare
32
   EPwm1Regs.CMPA.half.CMPA = 3000;
33
34
   // Set actions
35
   EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;             // Set PWM1A on Zero
36
   EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR;
37
38
39
   EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;          // Set PWM1A on Zero
40
   EPwm1Regs.AQCTLB.bit.CAD = AQ_SET;
41
42
   // Active Low PWMs - Setup Deadband
43
   EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;
44
   EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_LO;
45
   EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;
46
   EPwm1Regs.DBRED = EPWM1_MIN_DB;
47
   EPwm1Regs.DBFED = EPWM1_MIN_DB;
48
   EPwm1_DB_Direction = DB_UP;
49
50
   // Interrupt where we will change the Deadband
51
   EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;     // Select INT on Zero event
52
   EPwm1Regs.ETSEL.bit.INTEN = 1;                // Enable INT
53
   EPwm1Regs.ETPS.bit.INTPRD = ET_3RD;           // Generate INT on 3rd event
54
55
...
56
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
57
EPwm1TimerIntCount = 0;
58
EINT;   // Enable Global interrupt INTM
59
   ERTM;   // Enable Global realtime interrupt DBGM
60
61
Endlosschleife
62
63
...
64
interrupt void epwm1_isr(void)
65
{
66
67
   if(EPwm1_DB_Direction == DB_UP)
68
   {
69
       if(EPwm1Regs.DBFED < EPWM1_MAX_DB)
70
       {
71
          EPwm1Regs.DBFED += 3;
72
          EPwm1Regs.DBRED += 3;
73
       }
74
       else
75
       {
76
          EPwm1_DB_Direction = DB_DOWN;
77
          EPwm1Regs.DBFED--;
78
          EPwm1Regs.DBRED--;
79
       }
80
   }
81
   else
82
   {
83
       if(EPwm1Regs.DBFED <= EPWM1_MIN_DB)
84
       {
85
          EPwm1_DB_Direction = DB_UP;
86
          EPwm1Regs.DBFED++;
87
          EPwm1Regs.DBRED++;
88
       }
89
       else
90
       {
91
          EPwm1Regs.DBFED--;
92
          EPwm1Regs.DBRED--;
93
       }
94
   }
95
   EPwm1TimerIntCount++;
96
97
   // Clear INT flag for this timer
98
   EPwm1Regs.ETCLR.bit.INT = 1;
99
100
   // Acknowledge this interrupt to receive more interrupts from group 3
101
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
102
103
}
Es liefert ein PWM-Signal der Frequenz 1.344 kHz. Offensichtlich wird 
der Takt von 150 MHz mehr als nur durch 3500 (EPwm1Regs.TBPRD) geteilt. 
(Mir ist bewusst, dass ich 1500 brauche bei 100 kHz. -> Aber da gibt es 
kein Ausgangssignal am Oszilloskop.) Außerdem schwankt der Tastgrad nur 
zwischen 0.842 und 1, obwohl man bei  EPWM1_MIN_DB = 0 und EPWM1_MAX_DB 
= 1023 mehr erwarten würde.
Ich würde mich über jeden Tipp freuen, wie ich das erwünschte Ergebnis 
erreichen kann.


Viele Grüße
Sebastian

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.