私は各対角線(PWM1とPWM4の場合)ごとに1つのPWMジェネレータを使用してHブリッジコンバータを制御しようとしています。dsPIC33 PWMのデューティと周波数の更新
周波数とデューティサイクルの両方を制御できるようにしたいと考えています。 これを行うには、PWM4期間の開始時にトリガ割り込みを生成してから、両方のPWMチャンネルの周期、位相、デューティサイクルのレジスタを更新します。
この問題が発生すると、この更新が行われると、1つの期間ほど予期しない動作が発生します。画像を参照してください。
PWM4はシアン、PWM1はマゼンタ、黄色はPWM4のトリガ割り込みが発生するとトグルします。
PWM1(マゼンタ)の更新頻度は低いですが、PWM4は別の周期で古いPWM1を実行し続けます。また、PWM1はもう1つの短いインパルスを生成します。 私は、周期レジスタ、デューティレジスタ、位相レジスタの値を更新するのにかかる時間を測定しました。ここ は、PWMの設定です:
void PWM4Config() {
ANSELEbits.ANSE6 = 0;
ANSELEbits.ANSE7 = 0;
TRISEbits.TRISE6 = 0;
TRISEbits.TRISE7 = 0;
PTPER = 7002; //period je 50us
PTCON2bits.PCLKDIV = 0b000; //1:1
//fazni stavovi
PHASE4 = 0;
SPHASE4 = 0;
//duty
PDC4 = 3501;
SDC4 = 3501;
//dead time
DTR4 = 0;
//set PWM mode to independent, active high
IOCON4bits.PENH = 1;
IOCON4bits.PENL = 1;
IOCON4bits.POLH = 0;
IOCON4bits.POLL = 0;
IOCON4bits.PMOD = 0b11;
IOCON4bits.OVRENH = 0;
IOCON4bits.OVRENL = 0;
IOCON4bits.OVRDAT = 0b00;
IOCON4bits.FLTDAT = 0b00;
IOCON4bits.CLDAT = 0b00;
IOCON4bits.SWAP = 0;
IOCON4bits.OSYNC = 0;
//set primary time base, edge aligned, independent duty cycles
PWMCON4 = 0x0000;
//PWMCON4bits.IUE = 1; //privremeno
//config faults
FCLCON4 = 0x0003;
//config trigger & interrupt
IFS6bits.PWM4IF = 0;
IEC6bits.PWM4IE = 1;
TRGCON4 = 0x0000; //triger at every period of pwm
TRIG4 = 0x0000; //triger at start of pwm period
PWMCON4bits.TRGIEN = 0;
}
void PWM1Config() {
ANSELEbits.ANSE0 = 0;
ANSELEbits.ANSE1 = 0;
TRISEbits.TRISE0 = 0;
TRISEbits.TRISE1 = 0;
PTPER = 7002; //period je 50us
PTCON2bits.PCLKDIV = 0b000; //1:1
//fazni stavovi
PHASE1 = 3051;
SPHASE1 = 3501;
//duty
PDC1 = 3501;
SDC1 = 3501;
//dead time
DTR1 = 0;
//set PWM mode to independent, active high
IOCON1bits.PENH = 1;
IOCON1bits.PENL = 1;
IOCON1bits.POLH = 0;
IOCON1bits.POLL = 0;
IOCON1bits.PMOD = 0b11;
IOCON1bits.OVRENH = 0;
IOCON1bits.OVRENL = 0;
IOCON1bits.OVRDAT = 0b00;
IOCON1bits.FLTDAT = 0b00;
IOCON1bits.CLDAT = 0b00;
IOCON1bits.SWAP = 0;
IOCON1bits.OSYNC = 0;
//set primary time base, edge aligned, independent duty cycles
PWMCON1 = 0x0000;
//PWMCON1bits.IUE = 1; //privremeno
//config faults
FCLCON1 = 0x0003;
//config trigger & interrupt
//IFS5bits.PWM1IF = 0;
//IEC5bits.PWM1IE = 1;
//TRGCON1 = 0x0000; //triger na svakom periodu pwm-a
//TRIG1 = 0x0000; //triger je na pocetku pwm-a
//PWMCON1bits.TRGIEN = 0;
}
彼らは、マスタータイムベースを使用して、独立モードに設定されています。