Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
我是需要60Hz的 sin PWM....
不過我量測出來的PWM頻率卻是1.32kHz.... 我設定的切換頻率是20kHz..... 不過量測出來大約是16kHz.... 那請問一下.... 第一..... 如果是外頻的問題.... 那想請教震盪器怎麼設計..... 第二..... counter周期計算錯誤.... 那是不是只要更改就可以達到呢???
發表於: 2007/6/11 15:35
|
|||
|
Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
你的問題很奇怪, 60Hz PWM是PWM為60Hz, 1.32kHz又是啥?
還是你需要60Hz的sin PWM? 如果是,請告知你的PWM 頻率是多少? 假設你希望的PWM是20kHz, 而量出來是1.32kHz, 有可能的原因是:1.外頻與你的程式搭配錯誤 2.counter的週期計算錯誤.
發表於: 2007/6/11 14:37
|
|||
|
Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
我不是要做 six step
只是想讓PWM達到自動調變作用.... 目前有做出自動調變.... 不過不知道是不是程式哪邊有問題.... 還是說外部震盪器沒有完全震盪起來.... 我原本設定的是60Hz的PWM信號.... 出來卻是1.32kHz的信號..... 所以想請教各位高手.... 是不是我的外部震盪器的關係.... 還是說我程式內部有問題... 我用的是dspic 30F2010....
發表於: 2007/6/11 8:47
|
|||
|
Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
你是要做six step嗎?
發表於: 2007/6/9 11:45
|
|||
|
Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
不是ㄧPO在PO....而是問題沒解決阿...
所以想在請教不同的問題阿....
發表於: 2007/6/7 18:31
|
|||
|
Re: 急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
高級會員
|
...
沒有必要一PO再PO吧
發表於: 2007/6/7 18:27
|
|||
|
急救.....請大家幫忙一下.....
|
||||
---|---|---|---|---|
新會員
|
各位高手.....
可以請教一下.... 我要60Hz的PWM信號..... 程式如下.... #define __dsPIC30F2010__ #include <uart.h> #include <adc12.h> #include <timer.h> #include <math.h> #include <p30F2010.h> #include <uart.h> #include <stdio.h> //#include "APP009V2_LCD.h" #define pi 3.1415926 #define FCY 7372800 * 2 #define MAX_HALF_DUTY 730 // Max Duty is 180 , but multiplex with 100 #define Volt0 736 void Initial_Timer1( void ) ; void Initial_CAN( void ) ; void DelayNmSec(unsigned int ) ; void InitADC10(void); void MotPWM_Initial(void); //--------------------------------------------------------------------------- // Configuration bits _FOSC(CSW_FSCM_OFF & XT_PLL8); //XT with 8xPLL oscillator, Failsafe clock off _FWDT(WDT_OFF); //Watchdog timer disabled _FBORPOR(PBOR_OFF & MCLR_EN); //Brown-out reset disabled, MCLR reset enabled _FGS(CODE_PROT_OFF); //Code protect disabled typedef struct tagLEDBITS { unsigned :8; unsigned LED_Val:8; } PORTDBITSS; extern volatile PORTDBITSS LED_Ctrl __attribute__((__near__)); unsigned char TxData[10] = {0,0,0,0,0,0,0,0,0,0} ; unsigned int ValuePDC ; int SinTable[92] ; int LoopVar1 ; int U_Degree ; int V_Degree ; int W_Degree ; int T1IF_Flag ; int T1IF_Counter ; unsigned int Temp_Uint ; void __attribute__((__interrupt__)) _T1Interrupt(void) { U_Degree += 3; if ( U_Degree > 360 ) U_Degree = 0 ; { if ( U_Degree <= 90 ) ValuePDC = ( SinTable[U_Degree]) + Volt0 ; else if ( U_Degree > 90 && U_Degree <= 180 ) ValuePDC = ( SinTable[180 - U_Degree] )+ Volt0 ; else if ( U_Degree > 180 && U_Degree <= 270 ) ValuePDC = Volt0 - ( SinTable[U_Degree - 180] ) ; else if ( U_Degree > 270 && U_Degree <= 360 ) ValuePDC = Volt0 - ( SinTable[360-U_Degree] ) ; PDC1 = ValuePDC ; } V_Degree = U_Degree + 180 ; if ( V_Degree > 360 ) V_Degree = V_Degree - 360 ; { if ( V_Degree <= 90 ) ValuePDC = ( SinTable[V_Degree] )+ Volt0 ; else if ( V_Degree > 90 && V_Degree <= 180 ) ValuePDC = ( SinTable[180 - V_Degree ] )+ Volt0 ; else if ( V_Degree > 180 && V_Degree <= 270 ) ValuePDC = Volt0 - ( SinTable[V_Degree - 180]) ; else if ( V_Degree > 270 && V_Degree <= 360 ) ValuePDC = Volt0 - ( SinTable[360-V_Degree] ) ; PDC2 = ValuePDC ; } //W_Degree = U_Degree + 240 ; //if ( W_Degree > 360 ) W_Degree = W_Degree - 360 ; //{ //if ( W_Degree <= 90 ) //ValuePDC = ( SinTable[W_Degree] )+ Volt0 ; //else if ( W_Degree > 90 && W_Degree <= 180 ) //ValuePDC = ( SinTable[180 - W_Degree ])+ Volt0 ; //else if ( W_Degree > 180 && W_Degree <= 270 ) //ValuePDC = Volt0 - ( SinTable[W_Degree - 180]) ; //else if ( W_Degree > 270 && W_Degree <= 360 ) //ValuePDC = Volt0 - ( SinTable[360-W_Degree]) ; //PDC3 = ValuePDC ; //} } void __attribute__((__interrupt__)) _PWMInterrupt(void) { IFS2bits.PWMIF = 0 ; } int main( void ) { for ( LoopVar1 = 0 ; LoopVar1 < 91 ; LoopVar1 += 1) { SinTable[LoopVar1] = sin( (3.1415926 * LoopVar1) / (double)180 ) * MAX_HALF_DUTY ; } Initial_Timer1( ) ; MotPWM_Initial( ) ; TRISD &= 0x00ff ; U_Degree = 0 ; T1IF_Flag = 0 ; T1IF_Counter = 0 ; //putrsLCD("dsPIC30F2010 Dem") ; //setcurLCD(0,1) ; //putrsLCD("PWM Running ") ; while (1) { } } void DelayNmSec(unsigned int N) { unsigned int j; while(N--) for(j=0;j < 1000;j++); } void Initial_Timer1( void ) { ConfigIntTimer1( T1_INT_PRIOR_7 & T1_INT_ON ) ; OpenTimer1( T1_ON & T1_IDLE_STOP & T1_GATE_OFF & T1_PS_1_1 & T1_SYNC_EXT_OFF & T1_SOURCE_INT , 2048 ) ; } void MotPWM_Initial(void) { IEC2bits.PWMIE = 0 ; // Disable PWM Interrupt !! IEC2bits.FLTAIE = 0 ; OVDCON = 0xff00 ; // Inactive all PWM OUTPUT !! TRISE = 0xffc0 ; PTCON = 0xa000 ; // Configure as 0b1010 0000 0000 0000 // PWM Time Base OFF , PWM Time Base OP in free running Mode PWMCON1 = 0x0077 ; // Configure as 0b0000000000010001 // PWM I/O in complementary Mode and only PWM1L/H as PWM output PWMCON2 = 0x0000 ; // Configure as 0b0000000000000000 DTCON1 = 0x0101 ; // Configure as 0b0000001000000010 ; FLTACON = 0x0000 ; IPC9bits.PWMIP = 6 ; // --------------------------------------------------------------------------------- // The Switching Frequency !! // PWM resolution >= 10 bits , // PDCx[1:15] compare with PTMR [0:14] // PDCx(0) compare with MSB of prescaler counter // So, PTPER is 9 bit if resolution of PDCx is 10 bit // Setting PWM Frequency = 20K // PTPER = ( (7372800*2)/ 20000 ) -1 = 736.28 = 736 // PWM Frequency will be Fcy/736 = 20.0K // Formular !! PTPER = (Fcy/(FPWM*PTMR Prescaler)) - 1 // --------------------------------------------------------------------------------- PTPER = 736 ; // PWM Time Base Period Register ValuePDC = 0x00 ; PDC1 = ValuePDC ; PDC2 = ValuePDC ; //PDC3 = ValuePDC ; } 不過我的PWM信號....沒有60Hz.... 我用的是dspic 30F2010 震盪器....6MHz....電容用15pF 不知道是不是沒有震盪起來.... 造成輸出達到1.32kHz的PWM信號.... 請教各位高手.... 我的問題到底在哪??? 還有怎樣才能達到60Hz的PWM信號輸出....
發表於: 2007/6/7 17:42
|
|||
|