www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP eZdspF2812 Problem mit PWM


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Michael K. (kichi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

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

Autor: Michael K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Mugen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.