Forum: Digitale Signalverarbeitung / DSP / Machine Learning eZdspF2812 Problem mit PWM


von Jens (Gast)


Lesenswert?

Grüße,

ich befasse mich seit ein paar Tagen mit dem eZdsp-Board von 
SpectrumDigital. Auf deren Homepage habe ich ein paar nützliche 
Programmbeispiele gefunden (ADC, LED, PWM etc.) welche alle sehr 
hilfreich und funktionstüchtig waren.

Nun bin ich gerade dabei die PWM-Sachen durch zu gehen und hier fängt 
mein Problem an. Das Programm hierzu schein auf den 1. Blick zu 
funktionieren, doch wenn ich mir mittels Oszi die PWM-Signale anschauen 
will, passiert absolut nix (das Oszi funktioniert ;-))!

Wenn ihr eine Idee hättet, wäre ich euch sehr dankbar.

LG Jens

P.S.: Hier seht ihr den C-Code!

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File
// Prototype statements for functions found within this file.
void init_eva(void);
void init_evb(void);
// Global counts used in this example
void main(void)
{
   InitSysCtrl();
   EALLOW;
   // Enable PWM pins
   GpioMuxRegs.GPAMUX.all = 0x00FF; // EVA PWM 1-6  pins
   GpioMuxRegs.GPBMUX.all = 0x00FF; // EVB PWM 7-12 pins
   EDIS;
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   init_eva();
   init_evb();
   for(;;);
}
void init_eva()
{
// EVA Configure T1PWM, T2PWM, PWM1-PWM6
// Initalize the timers
   // Initalize EVA Timer1
   EvaRegs.T1PR = 0xFFFF;       // Timer1 period
   EvaRegs.T1CMPR = 0x3C00;     // Timer1 compare
   EvaRegs.T1CNT = 0x0000;      // Timer1 counter
   // TMODE = continuous up/down
   // Timer enable
   // Timer compare enable
   EvaRegs.T1CON.all = 0x1042;
   // Initalize EVA Timer2
   EvaRegs.T2PR = 0x0FFF;       // Timer2 period
   EvaRegs.T2CMPR = 0x03C0;     // Timer2 compare
   EvaRegs.T2CNT = 0x0000;      // Timer2 counter
   // TMODE = continuous up/down
   // Timer enable
   // Timer compare enable
   EvaRegs.T2CON.all = 0x1042;
   // Setup T1PWM and T2PWM
   // Drive T1/T2 PWM by compare logic
   EvaRegs.GPTCONA.bit.TCMPOE = 1;
   // Polarity of GP Timer 1 Compare = Active low
   EvaRegs.GPTCONA.bit.T1PIN = 1;
   // Polarity of GP Timer 2 Compare = Active high
   EvaRegs.GPTCONA.bit.T2PIN = 2;

   // Enable compare for PWM1-PWM6
   EvaRegs.CMPR1 = 0x0C00;
   EvaRegs.CMPR2 = 0x3C00;
   EvaRegs.CMPR3 = 0xFC00;

   EvaRegs.ACTRA.all = 0x0666;
   EvaRegs.DBTCONA.all = 0x0000; // Disable deadband
   EvaRegs.COMCONA.all = 0xA600;
}
void init_evb()
{
   EvbRegs.T3PR = 0xFFFF;       // Timer3 period
   EvbRegs.T3CMPR = 0x3C00;     // Timer3 compare
   EvbRegs.T3CNT = 0x0000;      // Timer3 counter
   EvbRegs.T3CON.all = 0x1042;
   // Initialize EVB Timer4
   // Timer4 controls T4PWM
   EvbRegs.T4PR = 0x00FF;       // Timer4 period
   EvbRegs.T4CMPR = 0x0030;     // Timer4 compare
   EvbRegs.T4CNT = 0x0000;      // Timer4 counter
   // TMODE = continuous up/down
   // Timer enable
   // Timer compare enable
   EvbRegs.T4CON.all = 0x1042;
   // Setup T3PWM and T4PWM
   // Drive T3/T4 PWM by compare logic
   EvbRegs.GPTCONB.bit.TCMPOE = 1;
   // Polarity of GP Timer 3 Compare = Active low
   EvbRegs.GPTCONB.bit.T3PIN = 1;
   // Polarity of GP Timer 4 Compare = Active high
   EvbRegs.GPTCONB.bit.T4PIN = 2;
   // Enable compare for PWM7-PWM12
   EvbRegs.CMPR4 = 0x0C00;
   EvbRegs.CMPR5 = 0x3C00;
   EvbRegs.CMPR6 = 0xFC00;
   EvbRegs.ACTRB.all = 0x0666;
   EvbRegs.DBTCONB.all = 0x0000; // Disable deadband
   EvbRegs.COMCONB.all = 0xA600;
}

von M. K. (kichi)


Lesenswert?

So auf den ersten Blick würde ich sagen du hast die entsprechenden Pins 
nicht als Ausgang gesetzt. Beim Starten sind diese aus 
Sicherheitsgründen (hochohmige) Eingänge und das musst du ändern.

Details & Code siehe DSP281x_Gpio.c

von Jens (Gast)


Lesenswert?

Das ist auch nicht das Problem. Habe GPADIR schon auf 0xFFFF bzw. zu 
Testzwecken auf 0x0000 gesetzt. Ohne Erfolg!

von Michael K. (Gast)


Lesenswert?

Jens schrieb:
> Das ist auch nicht das Problem. Habe GPADIR schon auf 0xFFFF bzw. zu
> Testzwecken auf 0x0000 gesetzt. Ohne Erfolg!

Es mag vielleicht noch ein anderes Problem dazukommen - um GPxDIR musst 
du dich aber auf jeden Fall kümmern. An welchen Pins mißt du, wenn ich 
blöd fragen darf?

von Jens (Gast)


Lesenswert?

Am Board ist es die Buchsenleiste P8 (Pin 9 bis 14 und GND). Am 
Controller wären es die Pins 92, 93, 94, 95, 98 und 101.

Das wäre jetzt nicht gerade förderlich für mein Ego, wenn ich an den 
falschen Pins gemessen hätte^^! Aber andererseits, hauptsache ich komme 
mit meinem Projekt weiter!

von Michael K. (Gast)


Lesenswert?

OK. Schau dir das Ganze nochmal an. Folgende Register musst du 
konfigurieren: TxPR, TxCNT, TxCON, CMPRy, ACTRz, DBTCONz, COMCONz 
(x=1...2, y=1...3, z=A...B). Zumindest funktioniert es damit bei mir 
(PWM1...PWM6 als 3phasige PWM mit Totzeit). GPxMUX und GPxDIR nicht 
vergessen.

Wenn du nur PWM1...PWM6 nutzen möchtest brauchst du dich um GPTCONx 
nicht kümmern. Das brauchst du nur wenn du TxPWM benötigst. Event 
Manager B brauchst du auch nicht unbedingt, das hängt aber davon ab was 
du insgesamt vorhast.

Wobei es wirklich interessant ist, dass das TI-Beispiel nicht zu 
funktionieren scheint... Leider habe ich gerade keine Möglichkeit das zu 
testen. Die *.cmd-Files sind in Ordnung und du kannst Pins setzen und 
löschen?

von Jens (Gast)


Lesenswert?

Das Eigenartige ist, ich habe gerade CCS neu gestartet und jetzt läuft 
das Bspl-Programm und auch mein Eigenes!

Jedoch sobald ich ein anderes Programm starte, bsplw. Gpio_Toggle 
(welches auch funktioniert) und anschließend wieder mein PWM-Programm 
starte, funktioniert dieses wieder nicht!

Sehr mysteriös!

von Mugen (Gast)


Lesenswert?

Nach deine Beschreibung stimmt eindeutig die Initialisierung nicht. Der 
TI behält bestimmt Registerwerte/Einstellungen bei, wenn kein Reset 
erfolggt, die Stromversorgung beigehalten wird und einfach eine neue SW 
geflasht wird. Aus diesem grund sollte jedes Flash oder SRAM Projekt 
einmal geprüft werden, wenn das System vorher resetet wurde.

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.