TI中文支持网
TI专业的中文技术问题搜集分享网站

系统中断及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

非常感谢!!!

囧:

中断频率是根据中断程序的长度以及控制需求设定的。

 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频率设定的依据是什么呢?与指令溢出有关吗?

非常感谢!!!

赞(0)
未经允许不得转载:TI中文支持网 » 系统中断及PWM配置
分享到: 更多 (0)