2014-05-09 66 views
2

我可能只是用這些寄存器中的某個寄存器看不見樹的時刻,但我無法使PWM工作dsPIC33FJ32MC102單片機(警告:很大的PDF)我正在玩。我已經按照數據表和進一步application note(警告:另一PDF),甚至代碼示例,我看不出我做錯了什麼,雖然在我的測試平臺上,我得到高輸出Vcc和地面上產量低。我已將故障引腳連接到Vcc並禁用了註冊碼,所以我的更改應該會看到一些效果。我究竟做錯了什麼?無法初始化dsPIC33F上的PWM

#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); 
} 

回答

0

我相信你已經設置了從0到181(P1TPER)計數的定時器,然後重置並重復。但是您已將佔空比寄存器設置爲大於181的0x7FFF。因此,我認爲佔空比值永遠不會低於定時器值,因此輸出永遠不會改變。嘗試將佔空比寄存器設置爲181/2 = 90以獲得50%的佔空比。

+1

這幾乎是正確的,所以我會給你答案和反正。這讓我嘗試了一個較低的值,並且在'錯誤'的佔空比中得到了PWM。這讓我再次查看數據表,它糾正了我錯誤的印象:佔空比在0到65535之間是任意的;它不是,它在0 - 2 * P1TPER之間。它現在有效。謝謝! –