Forum: Mikrocontroller und Digitale Elektronik Fault Logic / dspic33fj64gs610 / MPLAB X v5.15


von Uli N. (uln)


Angehängte Dateien:

Lesenswert?

Bei mir arbeitet die Fault-Logik des dspic33fj64gs610 nicht, wie von mir 
erwartet, bzw. sie scheint mir überhaupt nicht aktiv zu sein.

1
FCLCON1bits.FLTPOL  =  1;  // The selected Fault source is active-low
2
IOCON1bits.FLTDAT    =  1;  // If Fault active, then FLTDAT<1> provides data for PWM1H and FLTDAT<0> provides data for PWM1L
3
FCLCON1bits.FLTSRC  = 29;   // Fault Control Signal Source Select bits for PWM Generator 1  => Fault22/Pin58 (FLT1H || FLT1L)
4
FCLCON1bits.FLTMOD   =  1;  // The selected Fault source forces PWM1H, PWM1L pins to FLTDAT values (cycle)
5
FCLCON1bits.IFLTMOD  =  0;  // Normal Fault mode: Current-Limit mode maps CLDAT<1:0> bits to the PWM1H and PWM1L outputs. The PWM Fault mode maps FLTDAT<1:0> to the PWM1H and PWM1L outputs.
6
FCLCON1bits.CLMOD     =  0;  // Current-Limit mode is disabled

Da ich zusätzlich
1
IOCON1bits.POLH      =  0;  // PWM1H pin is active-high
2
IOCON1bits.POLL      =  1;  // PWM1L pin is active-low

konfiguriert habe, erwarte ich eigentlich bei Auftreten von 
Fault22/Pin58 == low (und Aufruf des entsprechend programmierten 
Interrupts), dass PWM1H == low und PWM1L == low von der 
dspic33fj64gs610-Hardware ausgegeben wird  - verstehen könnte ich auch 
noch PWM1H == low und PWM1L == high (wenn der Inhalt von FLTDAT <1:0> == 
0x01 direkt, unter Nichtbeachtung von IOCON1bits.POLH und 
IOCON1bits.POLL, an die Ausgänge durchgereicht wird), ich messe aber 
immer nur PWM1H == high und PWM1L == low.

Fällt jemanden etwas auf, was ich vergessen habe, zu konfigurieren?

: Bearbeitet durch User
von Uli N. (uln)


Lesenswert?

Thx

von Stampede (Gast)


Lesenswert?

Uli N. schrieb:
> FCLCON1bits.FLTMOD   =  1;  // The selected Fault source forces PWM1H,
> PWM1L pins to FLTDAT values (cycle)
> FCLCON1bits.IFLTMOD  =  0;  // Normal Fault mode: Current-Limit mode
> maps CLDAT<1:0> bits to the PWM1H and PWM1L outputs. The PWM Fault mode
> maps FLTDAT<1:0> to the PWM1H and PWM1L outputs.
> FCLCON1bits.CLMOD     =  0;  // Current-Limit mode is disabled
So frei aus dem Kopf: Ist nicht 3 die "Disable" Option? Vermute dass der 
Current-Limit greift, am bestem mal ins das Status Register gucken.

von Stampede (Gast)


Lesenswert?

Vergiss es, war Quatsch.

Mal ein Beispiel von einer Applikation von mir,
1
    /*Initialization of the PWMx for the left leg*/
2
    PSFB_LL_IOCON = 0;
3
    #ifdef APPLY_PWM_GLITCH_ERRATA
4
        PSFB_LL_IO_H = 1;               // Configure PWMxH as digital input
5
                                        // Ensure output is in safe state using pull-up or pull-down resistors
6
        PSFB_LL_IO_L = 1;               // Configure PWMxL as digital input
7
                                        // Ensure output is in safe state using pull-up or pull-down resistors
8
        PSFB_LL_IOCONbits.PENH = 0;     // Assign pin ownership of PWMxH to GPIO module
9
        PSFB_LL_IOCONbits.PENL = 0;     // Assign pin ownership of PWMxL to GPIO module
10
        PSFB_LL_IOCONbits.OVRDAT = 0;   // Configure PWM outputs override state to the desired safe state
11
        PSFB_LL_IOCONbits.OVRENH = 1;   // Override PWMxH output
12
        PSFB_LL_IOCONbits.OVRENL = 1;   // Override PWMxL output   
13
    #endif
14
    // PWMx Configuration
15
    PSFB_LL_IOCONbits.SWAP = 0;         // Swap
16
    PSFB_LL_IOCONbits.POLH = 0;         // PWM Output Polarity is high
17
    PSFB_LL_IOCONbits.POLL = 0;         // PWM Output Polarity is high
18
    PSFB_LL_IOCONbits.PMOD = 0;         // PWM I/O pin pair is in the Complementary Output mode
19
    PSFB_LL_IOCONbits.OSYNC = 1;        // 0 = Output overrides via the OVRDAT<1:0> bits occur on the next CPU clock boundary
20
                                        // 1 = Output overrides via the OVRDAT<1:0> bits are synchronized to the PWMx time base
21
    PSFB_LL_PWMCONbits.ITB = 0;         // PTPER register provides timing for this PWM generator
22
    PSFB_LL_PWMCONbits.MDCS = 0;        // PDCx (and SDCx) registers provide duty cycle information for this PWMx generator
23
    PSFB_LL_PWMCONbits.DTC = 0;         // Positive dead time is actively applied for all Output modes
24
    PSFB_LL_PWMCONbits.IUE = 0;         // Updates are synchronized to the local PWMx time base
25
    PSFB_LL_PDC_REG = PSFBHalfPeriod ;              // 50% Duty
26
    PSFB_LL_DTR_REG = PSFBMAXDEADTIME_VAL;             // Dead time setting
27
    PSFB_LL_ALTDTR_REG = PSFBMAXDEADTIME_VAL;       // Dead time setting
28
    PSFB_LL_PHASE_REG = 0;                          // Do not shift left leg
29
    
30
    PSFB_LL_FCLCON = 0;                             // Clear faults
31
    PSFB_LL_FCLCONbits.FLTSRC = FLTSRC_ANA_COMP1;   // FLT1 has been selected for the Fault control signal source for PWM Generator
32
    PSFB_LL_FCLCONbits.FLTPOL = 0;                  // 0 = The selected current-limit source is active-high
33
    PSFB_LL_FCLCONbits.FLTMOD = FLT_MODE_FLTDATX_LATCH;  // 3: OFF, 1: The selected Fault source forces the PWMxH, PWMxL pins to FLTDATx values (cycle)
34
    PSFB_LL_FCLCONbits.IFLTMOD = FLT_MODE_DISABLED; // Disabled
35
    PSFB_LL_IOCONbits.FLTDAT = 0;                   // Set PWMxH/L low in case of a fault

von Uli N. (uln)


Lesenswert?

Danke für Deinen Beitrag, werde ihn mir genau anschauen (das Thx oben 
war kein Blick in die Zukunft, sollte eigentlich diesem Beitrag 
Beitrag "Re: "Standard Peripherals Library" für PIC18, PIC24 und dsPIC33" gelten - kein 
Ahnung, wie ich das wieder geschafft habe :-).

Eine Idee wäre noch, dass die Fault-Logik nur im "Complementary Output 
mode" arbeitet - meine Vorgänger habe die Applikation mittels "True 
Independant Output mode" (PMOD = 3;) gelöst - soweit ich sehe, findet 
sich dazu in der Dokumentation nichts?

Wie mir darüber hinaus so manches unklar bleibt - z.B. treten die Faults 
bei Kurzschluss immer paarweise auf, ich erhalte aber immer nur einen 
Interrupt -  es könnte nun sein, dass der zweite, anstehende Interrupt 
in der ersten Interrupt-Routine "abgelöscht" wird, da alle drei 
Interrupt-Routinen u.A.
1
  PTCONbits.PTEN      = 0;  // PWM module is disabled
2
  IEC5bits.PWM1IE      = 0;
3
  IEC5bits.PWM2IE      = 0;
4
  IEC6bits.PWM3IE      = 0;

ausführen - mittels Dokumentation vermag ich aber nicht zu bestätigen, 
dass auf diese Weise ein schon eingelaufener Interrupt wieder gelöscht 
wird?

: Bearbeitet durch User
von Stampede (Gast)


Angehängte Dateien:

Lesenswert?

Was man auch noch beachten muss, ist wie die Fault Logik und weitere 
Sachen wie Deadtime und SWAP an die IOs weitergegeben werden. Hier mal 
ein Beispiel aus dem dsPIC33CHxxx, der hat zwar eine andere PWM Einheit, 
aber hier ist das grapfisch ganz schön dargestellt. Ich meine das ist 
bei den dsPIC33EP genau so aufgebaut, leider gibts da kein schönes 
Diagramm, das ist alles in prosa versteckt :D

von Stampede (Gast)


Lesenswert?

Uli N. schrieb:
> Wie mir darüber hinaus so manches unklar bleibt - z.B. treten die Faults
> bei Kurzschluss immer paarweise auf, ich erhalte aber immer nur einen
> Interrupt -  es könnte nun sein, dass der zweite, anstehende Interrupt
> in der ersten Interrupt-Routine "abgelöscht" wird, da alle drei
> Interrupt-Routinen u.A.

Nein, ein xxx.IE = 0 löscht das zugehörige Flag xxx.IF nicht.

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.