ePWM vom Texas Instr. F28335

Gast #3571542
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.