2016-08-28 25 views
1

私は各対角線(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; 


} 

彼らは、マスタータイムベースを使用して、独立モードに設定されています。

答えて

0

この問題は、両方のPWMチャネルのデューティサイクルと周波数を更新する前に、PWMを無効にする(PTENビットをクリアする)ことで解決し、直後に有効にしました。その結果、更新の瞬間にあるはずのPWMパルスよりもいくらか短いPWMパルスが存在するかもしれないが、相補的なチャネルに対するパルスの重なりは起こらない。 これは実際のソリューションよりも回避策に似ていますが、私の目的に役立ちます。