Hallo,
Ich habe folgendes Problem mit dem dsPIC33FJ16GS504:
Halbbrücke, Buckconverter. Schaltfrequenz ist fix auf 200kHz, duty cycle
per PTPER auf ca. 60 % (viel höher, als was ich benötige). Der Strom
wird jeden Cycle gemessen und kürzt den duty cycle sobald eine
Komparatorschwelle überschritten ist. (current limit mode)
Grundlegend für die Schaltung ist, dass der Strom geregelt werden soll.
Dafür variiere ich die Schwellspannung des Komparator.
Nun zum Fehler: Bei niedrigen Strömen, also niedriger Schwellspannung,
fällt die Schaltfrequenz auf exakt die vorgegebene Hälfte von 100kHz.
Kann mir jemand sagen, wieso? Ist irgendeine Einstellung daran Schuld?
Bei der Regelung über den Dutycycle durch PDC1 passiert das nicht.
Die Regelung MUSS aber über den Current limit geschehen, weil ich sehr
schnell von 0 au 30A schalten muss und somit der duty cycle kurzzeitig
lang sein muss, damit der Strom schnell ansteigen kann.
Vielen Dank im Voraus!
ACLKCONbits.ASRCSEL = 1; /* Primary Oscillator is the Clock Source */
ACLKCONbits.FRCSEL = 0; /* Input clock source is determined by
ASRCSEL bit setting */
ACLKCONbits.SELACLK = 1; /* Auxiliary Oscillator provides the clock
source */
ACLKCONbits.APSTSCLR = 7; /* Divide Auxiliary clock by 1 */
ACLKCONbits.ENAPLL = 1; /* Enable Auxiliary PLL */
while(ACLKCONbits.APLLCK != 1); /* Wait for Auxiliary PLL to Lock */
PTCONbits.PTEN = 0; //PWM Module disabled
PTCON2bits.PCLKDIV = 0b000; //Prescaler 1
//// Dead-Time
PWMCON1bits.DTC = 0b00;
DTR1 = 150; //Totzeit beim Beginn des "Left Legs"-Überganngs [Weak
Leg]
ALTDTR1 = 120; //Totzeit beim Ende des "Left Legs"-Überganngs [Weak
Leg]
PWMCON1bits.FLTIEN = 0; // Fault interrupt disabled and FLTSTAT
cleared
PWMCON1bits.CLIEN = 0; //Current limit interrupt disabled
PWMCON1bits.ITB = 0; //PTPER/STPER registers provide timing for this
PWM generator
PWMCON1bits.MDCS = 0; //PDC1 register provides duty cycle for PWM1
PWMCON1bits.XPRES = 0; //External pins do not affect the PWM time base
PWMCON1bits.IUE = 0; //TODO eventuell auf 1 ändern
IOCON1bits.PENH = 1; //PWM module controls PWM1H pin
IOCON1bits.PENL = 1; //PWM module controls PWM1L pin
IOCON1bits.POLH = 0; //PWM1H Output Pin Polarity is active-high
IOCON1bits.POLL = 0; //PWM1H Output Pin Polarity is active-high
IOCON1bits.PMOD = 0b00; //PWM1 Complementary PWM Output mode
IOCON1bits.SWAP = 0; //Don't swap PWM high and low pin
IOCON1bits.OVRDAT = 0; // State for PWMxH and PWMxL Pins is low if
Override is Enabled
PTPER = 5231;
PDC1 = 3000;
FCLCON1bits.IFLTMOD = 0; //Normal fault mode
FCLCON1bits.CLSRC = 0; //Current limit signal is "Reserved"
FCLCON1bits.CLPOL = 0; //Current limit signal is active high
FCLCON1bits.CLMOD = 1; //Current limit mode is enabled
IOCON1bits.CLDAT1 = 0;
IOCON1bits.CLDAT0 = 1;
FCLCON1bits.FLTSRC = 1; //Fault input signal is "Reserved"
FCLCON1bits.FLTPOL = 0; //Fault input is signal is active high
FCLCON1bits.FLTMOD = 0; //Fault mode is enabled
IOCON1bits.FLTDAT1 = 0;
IOCON1bits.FLTDAT0 = 1;
TRGCON1bits.TRGDIV = 0;
PWMCON1bits.TRGIEN = 0; //Trigger interrupt is not pending
//while (PWMCON1bits.TRGSTAT!= 1);
__builtin_write_OSCCONL(OSCCON & ~(1<<6));
RPOR16bits.RP32R = 0b100111; // Comparator 1 auf virtuellen Pin 32.
RPINR29bits.FLT1R = 32; // Input für Fault1 ist virtueller Pin 32
__builtin_write_OSCCONL(OSCCON | (1<<6));
PTCONbits.PTEN = 1; //PWM Module enabled.
Hallo, verstehe das nicht so genau. PDC1 regelt den Duty Cycle, PTPER die Periode. Oder willst du einen Constant On Time Regler bauen?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.