Forum: Digitale Signalverarbeitung / DSP / Machine Learning Langes Delay bei Komperatorinterrupt (TMS320F28069)


von Raphael N. (firefix)


Angehängte Dateien:

Lesenswert?

Hallo,

ich versuche mit einem TMS320F28069 einen 2-Punkt-Regler zu realisieren. 
Dazu nutze ich einen der Komperatoren des DSP's. Jedes Mal wenn der 
Komperator auf High geht, lasse ich einen Interrupt erzeugen.
Das funktioniert soweit. Probleme habe ich aber damit, dass der 
Interrupt extrem verzögert kommt. Gemäss dem Wiki von TI 
(http://processors.wiki.ti.com/index.php/Interrupt_FAQ_for_C2000), 
sollte ein Interrupt (intern) 14 Takte brauchen. Ich erhalte jedoch beim 
ersten Interrupt ein Delay von rund 36 Takten (bei 60 MHz). Die weiteren 
Interrupts folgen dann mit einem Delay von ca 24 Takten (siehe Grafik im 
Anhang).
Mit Hilfe der Code Optimization Stufe habe ich das Delay bereits etwas 
reduzieren können. Die ISR Routine habe ich als pragma initialisiert.
Hat jemand eine Ahnung woher diese grosse Verzögerung kommt?

Hier die Initialisierung des Komperators:

 //configure Comp2
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 3;    //  3=COMP2OUT
Comp2Regs.COMPCTL.bit.COMPDACEN = 1;  // enable Comp2
Comp2Regs.COMPCTL.bit.COMPSOURCE = 0;  // - input conected to intern DAC
Comp2Regs.COMPCTL.bit.SYNCSEL = 1;  // Asynchronous version of 
//comparator output is passed
Comp2Regs.COMPCTL.bit.QUALSEL = 0;
GpioCtrlRegs.AIOMUX1.bit.AIO4 = 3;  // AIO4 -> CMP2A

// Interrupt Comperator
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 9;//COMP2OUT input for the DCAH 
Input
EPwm1Regs.TZDCSEL.bit.DCAEVT1 = 2;      //Event 1 Selection when DCAH = 
//high, DCAL = don't care


EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 0;  //DCAEVT1 = DCAEVT1 (not filtered)
EPwm1Regs.TZEINT.bit.DCAEVT1 = 1;  //Enable Digital Comparator Output 
//A Event 1 Interrupt Enable

EDIS;


Hier meine ISR Routine:

void COMPARATOR_ISR(void)
{
  GpioDataRegs.GPBSET.bit.GPIO40 = 1;    // LED1 an

  EALLOW;

  EPwm1Regs.TZCLR.bit.DCAEVT1 = 1;
  EPwm1Regs.TZCLR.bit.INT = 1;
  EDIS;

    //EPwm1Regs.TZFRC.bit.DCAEVT1 = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP2;

  GpioDataRegs.GPBCLEAR.bit.GPIO40 = 1;    // LED1 aus

}

Vielen Dank für Eure Hilfe.

von schrieb schrieb schrieb (Gast)


Lesenswert?

Hi,

Läuft der Code aus dem Flash oder aus dem RAM? Der Flash hat in der 
Regel Waitstates, sprich, die CPU bekommt nicht alle Daten sofort 
sondern erst nach einer kurzen Verzögerung. Abhilfe schafft es, die 
Funktionen, die wirklich schnell sein müssen, aus dem RAM heraus 
auszuführen.

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.