Kennix
03.06.2013, 11:53
Hallo miteinander, ich versuche mit dem dsPIC30F4012 (http://www.mikrocontroller.net/part/DSPIC30F4012) den double-update-Modus in Betrieb zu nehmen.Jedoch ruft er nur einmal pro Periode den PWMInterrupt auf, statt zweimal.
Er ändert den Wert einmal beim neuen PWM-Block, wodurch ich abwechselnd einen breiten und schmalen Block erzeuge.
Ich würde aber gerne den Zeitpunkt der steigende Flanke und der fallenden Flanke unabhängig von einandern ändern.
Das IUE Bit gibt es angeblich bei diesem Controller nicht, von daher vermute ich das man es auch nicht benötigt um den Modus zu Betreiben.
Könnt ihr mir weiterhelfen oder sagen was für ein Fehler ich gemacht habe?
Ich wäre dankbar um jede Hilfe
Schöne Grüße
Kenny
Anbei die relevanten Codestellen:
void init_PWM()
{
PTCON = 0x4003; //Module stop; pre+postscaler 1:1; Up/Down-Counting with Double Update
PWMCON1 = 0x0077;
PWMCON2 = 0x0006;
OVDCON = 0xFF00;
DTCON1 =0x0000; //DeadTime Generator disabled
PTPER=PTPER_val; //Periode (1157dez = 12750Hz, 0x3D6 = 15000Hz)
PTCON = 0x4003;
}
unsigned int ChangePWM=0;
/* PWM Interrupt */
void __attribute__((_interrupt_,__auto_psv__)) _PWMInterrupt(void)
{
if(ChangePWM++%2==0) PDC3 = tau;
else PDC3 = (PTPER<<1)-tau;
IFS2bits.PWMIF = 0;
}
Er ändert den Wert einmal beim neuen PWM-Block, wodurch ich abwechselnd einen breiten und schmalen Block erzeuge.
Ich würde aber gerne den Zeitpunkt der steigende Flanke und der fallenden Flanke unabhängig von einandern ändern.
Das IUE Bit gibt es angeblich bei diesem Controller nicht, von daher vermute ich das man es auch nicht benötigt um den Modus zu Betreiben.
Könnt ihr mir weiterhelfen oder sagen was für ein Fehler ich gemacht habe?
Ich wäre dankbar um jede Hilfe
Schöne Grüße
Kenny
Anbei die relevanten Codestellen:
void init_PWM()
{
PTCON = 0x4003; //Module stop; pre+postscaler 1:1; Up/Down-Counting with Double Update
PWMCON1 = 0x0077;
PWMCON2 = 0x0006;
OVDCON = 0xFF00;
DTCON1 =0x0000; //DeadTime Generator disabled
PTPER=PTPER_val; //Periode (1157dez = 12750Hz, 0x3D6 = 15000Hz)
PTCON = 0x4003;
}
unsigned int ChangePWM=0;
/* PWM Interrupt */
void __attribute__((_interrupt_,__auto_psv__)) _PWMInterrupt(void)
{
if(ChangePWM++%2==0) PDC3 = tau;
else PDC3 = (PTPER<<1)-tau;
IFS2bits.PWMIF = 0;
}