各位老师大家好,我正在学习PWM算法,运行的是TI的例程,现在遇到一些问题。
控制芯片采用的是F28035,工作频率为60MHz
1、首先是主程序的设置:
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &MainISR;//全局中断采用PWM中断
EDIS;
// Enable PIE group 3 interrupt 1 for EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CNT_zero interrupt using EPWM1 Time-base
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation
EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event
EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event
EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts
InitCommros();
这样全局中断就采用的是PWM中断吧?
那为什么程序中或设置的中断频率是10khz呢?
// Define the ISR frequency (kHz)
#define ISR_FREQUENCY 10
2、第二个问题就是PWM的PeriodMax 参数设置,
程序中关于PeriodMax 的定义为:
typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0)
int16 MfuncPeriod; // Input: Period scaler (Q15) int16 MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q15)
int16 MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q15) int16 MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q15)
int16 PWM1out;
int16 PWM2out;
int16 PWM3out;
} PWMGEN ;
这个对应的寄存器就是TBPRD吧?
那为什么要将PeriodMax这么设置呢?
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
//=60MHz*1000000*1/10khz
非常感谢!!!
囧:
中断频率是根据中断程序的长度以及控制需求设定的。
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
这样设置的原因是这个程序应该是会控制PWM的频率,这样可以保证PWM的频率不会超过控制要求的最大值
各位老师大家好,我正在学习PWM算法,运行的是TI的例程,现在遇到一些问题。
控制芯片采用的是F28035,工作频率为60MHz
1、首先是主程序的设置:
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &MainISR;//全局中断采用PWM中断
EDIS;
// Enable PIE group 3 interrupt 1 for EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CNT_zero interrupt using EPWM1 Time-base
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation
EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event
EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event
EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts
InitCommros();
这样全局中断就采用的是PWM中断吧?
那为什么程序中或设置的中断频率是10khz呢?
// Define the ISR frequency (kHz)
#define ISR_FREQUENCY 10
2、第二个问题就是PWM的PeriodMax 参数设置,
程序中关于PeriodMax 的定义为:
typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0)
int16 MfuncPeriod; // Input: Period scaler (Q15) int16 MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q15)
int16 MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q15) int16 MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q15)
int16 PWM1out;
int16 PWM2out;
int16 PWM3out;
} PWMGEN ;
这个对应的寄存器就是TBPRD吧?
那为什么要将PeriodMax这么设置呢?
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
//=60MHz*1000000*1/10khz
非常感谢!!!
xu zhang11:
回复 囧:
谢谢您的回复,系统采用的是PWM中断,为什么中断频率和PWM没有关系呢?
各位老师大家好,我正在学习PWM算法,运行的是TI的例程,现在遇到一些问题。
控制芯片采用的是F28035,工作频率为60MHz
1、首先是主程序的设置:
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &MainISR;//全局中断采用PWM中断
EDIS;
// Enable PIE group 3 interrupt 1 for EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CNT_zero interrupt using EPWM1 Time-base
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation
EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event
EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event
EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts
InitCommros();
这样全局中断就采用的是PWM中断吧?
那为什么程序中或设置的中断频率是10khz呢?
// Define the ISR frequency (kHz)
#define ISR_FREQUENCY 10
2、第二个问题就是PWM的PeriodMax 参数设置,
程序中关于PeriodMax 的定义为:
typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0)
int16 MfuncPeriod; // Input: Period scaler (Q15) int16 MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q15)
int16 MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q15) int16 MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q15)
int16 PWM1out;
int16 PWM2out;
int16 PWM3out;
} PWMGEN ;
这个对应的寄存器就是TBPRD吧?
那为什么要将PeriodMax这么设置呢?
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
//=60MHz*1000000*1/10khz
非常感谢!!!
xu zhang11:
回复 囧:
您好,这个问题我理解了一部分,请问PWM的频率最大值是根据什么设定的
各位老师大家好,我正在学习PWM算法,运行的是TI的例程,现在遇到一些问题。
控制芯片采用的是F28035,工作频率为60MHz
1、首先是主程序的设置:
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &MainISR;//全局中断采用PWM中断
EDIS;
// Enable PIE group 3 interrupt 1 for EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CNT_zero interrupt using EPWM1 Time-base
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation
EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event
EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event
EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts
InitCommros();
这样全局中断就采用的是PWM中断吧?
那为什么程序中或设置的中断频率是10khz呢?
// Define the ISR frequency (kHz)
#define ISR_FREQUENCY 10
2、第二个问题就是PWM的PeriodMax 参数设置,
程序中关于PeriodMax 的定义为:
typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0)
int16 MfuncPeriod; // Input: Period scaler (Q15) int16 MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q15)
int16 MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q15) int16 MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q15)
int16 PWM1out;
int16 PWM2out;
int16 PWM3out;
} PWMGEN ;
这个对应的寄存器就是TBPRD吧?
那为什么要将PeriodMax这么设置呢?
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
//=60MHz*1000000*1/10khz
非常感谢!!!
囧:
回复 xu zhang11:
中断频率就是PWM频率,如以下代码:
// Enable CNT_zero interrupt using EPWM1 Time-baseEPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generationEPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero eventEPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st eventEPwm1Regs.ETCLR.bit.INT = 1; // Enable more interruptsInitCommros();
各位老师大家好,我正在学习PWM算法,运行的是TI的例程,现在遇到一些问题。
控制芯片采用的是F28035,工作频率为60MHz
1、首先是主程序的设置:
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.EPWM1_INT = &MainISR;//全局中断采用PWM中断
EDIS;
// Enable PIE group 3 interrupt 1 for EPWM1_INT
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
// Enable CNT_zero interrupt using EPWM1 Time-base
EPwm1Regs.ETSEL.bit.INTEN = 1; // Enable EPWM1INT generation
EPwm1Regs.ETSEL.bit.INTSEL = 1; // Enable interrupt CNT_zero event
EPwm1Regs.ETPS.bit.INTPRD = 1; // Generate interrupt on the 1st event
EPwm1Regs.ETCLR.bit.INT = 1; // Enable more interrupts
InitCommros();
这样全局中断就采用的是PWM中断吧?
那为什么程序中或设置的中断频率是10khz呢?
// Define the ISR frequency (kHz)
#define ISR_FREQUENCY 10
2、第二个问题就是PWM的PeriodMax 参数设置,
程序中关于PeriodMax 的定义为:
typedef struct { Uint16 PeriodMax; // Parameter: PWM Half-Period in CPU clock cycles (Q0)
int16 MfuncPeriod; // Input: Period scaler (Q15) int16 MfuncC1; // Input: EPWM1 A&B Duty cycle ratio (Q15)
int16 MfuncC2; // Input: EPWM2 A&B Duty cycle ratio (Q15) int16 MfuncC3; // Input: EPWM3 A&B Duty cycle ratio (Q15)
int16 PWM1out;
int16 PWM2out;
int16 PWM3out;
} PWMGEN ;
这个对应的寄存器就是TBPRD吧?
那为什么要将PeriodMax这么设置呢?
pwm1.PeriodMax = SYSTEM_FREQUENCY*1000000*T/2; // Prescaler X1 (T1), ISR period = T x 1
//=60MHz*1000000*1/10khz
非常感谢!!!
xu zhang11:
回复 囧:
谢谢您的回复,PWM频率设定的依据是什么呢?与指令溢出有关吗?
非常感谢!!!