2

おそらく、これらのレジスタの 1 つを使用して、木を見て森を見ることができない瞬間を過ごしているだけかもしれませんが、dsPIC33FJ32MC102マイクロコントローラで PWM を動作させることができません (警告: 大きな PDF) I' m で遊んでいます。データシートと詳細なアプリケーション ノート(警告: 別の PDF)、さらにはコード サンプルの両方に従っていますが、何が間違っているのかわかりませんが、テストベンチでは高出力で Vcc を取得し、接地をオンにしています。低出力。障害ピンを両方とも Vcc に接続し、レジスタ キーコードを無効にしたので、変更が何らかの効果を示すはずです。私は何を間違っていますか?

#define FOSC    (3686400ULL)
#define FCY     (FOSC/2)

#include <xc.h>
#include <libpic30.h>

...

#pragma config PWMPIN = ON              // Motor Control PWM Module Pin Mode bit (PWM module pins controlled by PORT register at device Reset)
#pragma config PWMLOCK = OFF             

...

void main(void){

...

//setup PWM

//Clear faults
IFS3bits.PWM1IF     = 0;
IFS3bits.FLTA1IF    = 0;
IFS4bits.FLTB1IF    = 0;

//Setup dead times
P1DTCON1bits.DTAPS  = 0b00; //Dead time tick is 1 TCY
P1DTCON1bits.DTBPS  = 0b00;
P1DTCON1bits.DTA    = 10;    //Dead time is 10TCY ~= 3uS
P1DTCON1bits.DTB    = 10;
P1DTCON2bits.DTS1A  = 0;    //Active and Inactive transition dead times
P1DTCON2bits.DTS2A  = 0;    //0 takes A dead time
P1DTCON2bits.DTS3A  = 0;    //1 takes B dead time
P1DTCON2bits.DTS1I  = 1;
P1DTCON2bits.DTS2I  = 1;
P1DTCON2bits.DTS3I  = 1;

P1TCONbits.PTOPS    = 0b0000; //1 CPU tick = 1 PWM tick
P1TCONbits.PTCKPS   = 0b00;
P1TCONbits.PTMOD    = 0b00;
P1TCONbits.PTSIDL   = 0;      //Run when CPU idles

// no longer necessary since I disabled register write lock:
//    __builtin_write_PWMSFR(&P1FLTACON,0x0000,&PWM1KEY);
//    __builtin_write_PWMSFR(&P1FLTBCON,0x0000,&PWM1KEY);
//    __builtin_write_PWMSFR(&PWM1CON1 ,0x0077,&PWM1KEY);

PWM1CON1 = 0x0077;    //Enable all 3 channels
P1FLTACON = 0x0000;   //Disable faults
P1FLTBCON = 0x0000;

//Setup Wave freq/duty
//Fosc = 7.3728 MHz -> Fcy = 3.6864MHz
//Desire a PWM of 20250Hz (smaller scalar error than 20kHz)
//P1TPER = [Fcy/(Fpwm*Scalar)] - 1
//Therefore P1TPER = [3.6864M/(20250*1)] - 1 = 181;
P1TPER              = 181;
P1DC1               = 0x7FFF;   // 0x7FFF for 50%
P1DC2               = 0x7FFF;
P1DC3               = 0x7FFF;

P1OVDCON            = 0x3F00;   //Disable override; override disables PWM
PWM1CON2            = 0x0000;    
P1TCONbits.PTEN     = 1;        //Turn on

...

while(1);
}
4

1 に答える 1

0

タイマーを 0 から 181 (P1TPER) までカウントし、リセットして繰り返すように設定したと思います。しかし、デューティ サイクル レジスタを 0x7FFF に設定しました。これは 181 より大きい値です。そのため、デューティ サイクルの値がタイマーの値よりも小さくなることはなく、出力が変化することはないと考えています。デューティ サイクル レジスタを 181/2 = 90 に設定して、デューティ サイクルを 50% にします。

于 2014-05-12T21:02:22.227 に答える