This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我需要生成频率固定为20kHz 且占空比变化的 PWM。 示波器显示20kHz 的脉冲。 不过、我在示波器上始终观察到50%的占空比。 虽然我打算将占空比设置为70%、但示波器始终显示50%的占空比。
对于70%占空比、我已经在代码中初始化以下值:-
#define EPWM2_TIMER_TBPRD 312 //周期寄存器
#define EPWM2_MAX_CMPA 218
#define EPWM2_MIN_CMPA 94
#define EPWM_CMP_UP 1
#define EPWM_CMP_DOWN 0
我为您的参考附上了代码:-
// // Included Files // #include "F28x_Project.h" #include "common.h" #include "extern.h" // Globals // uint16_t sensorSample = 0; uint16_t isrCount = 0; int16_t sensorTemp = 0; float ADC_Voltage=0; float ADC_Voltage1=0; float Pressure_kpa=0; float Pressure_mbar=0; typedef struct { volatile struct EPWM_REGS *EPwmRegHandle; Uint16 EPwm_CMPA_Direction; Uint16 EPwmTimerIntCount; Uint16 EPwmMaxCMPA; Uint16 EPwmMinCMPA; }EPWM_INFO; EPWM_INFO epwm2_info; // // Function Prototypes // void InitEPwm2Example(void); // // Main // void main(void) { // // Initialize device clock and peripherals // InitSysCtrl(); // // Initialize GPIO // InitGpio(); // // enable PWM2 to drive motor.. //' CpuSysRegs.PCLKCR2.bit.EPWM2=1; // // For this case just init GPIO pins for ePWM1, ePWM2, ePWM3 // These functions are in the F2837xD_EPwm.c file // InitEPwm2Gpio(); // // Disable CPU interrupts // DINT; // // Initialize the PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // InitPieCtrl(); // // Disable CPU interrupts and clear all CPU interrupt flags: // IER = 0x0000; IFR = 0x0000; // // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // InitPieVectTable(); // // For this example, only initialize the ePWM ///******************************/ // for now GPIO-3 is used for PWM signal..20khz PWM signal is generated. EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; InitEPwm2Example(); EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM while(1) { } } void InitEPwm2Example() { // // Setup TBCLK // EPwm2Regs.TBPRD = EPWM2_TIMER_TBPRD; // Set timer period 801 TBCLKs EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; // Phase is 0 EPwm2Regs.TBCTR = 0x0000; // Clear counter // // Set Compare values // EPwm2Regs.CMPA.bit.CMPA = EPWM2_MIN_CMPA; // Set compare A value // // Setup counter mode // EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up and down EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV2; // Clock ratio to SYSCLKOUT EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV2; // // Setup shadowing // EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // Load on Zero EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // // Set actions // EPwm2Regs.AQCTLA.bit.CAU = AQ_SET; // Set PWM2A on event A, up // count EPwm2Regs.AQCTLA.bit.CBD = AQ_CLEAR; // Clear PWM2A on event B, down // count EPwm2Regs.AQCTLB.bit.ZRO = AQ_CLEAR; // Clear PWM2B on zero EPwm2Regs.AQCTLB.bit.PRD = AQ_SET; // Set PWM2B on period // // Interrupt where we will change the Compare Values // EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // Select INT on Zero event EPwm2Regs.ETSEL.bit.INTEN = 1; // Enable INT EPwm2Regs.ETPS.bit.INTPRD = ET_3RD; // Generate INT on 3rd event // // Information this example uses to keep track // of the direction the CMPA/CMPB values are // moving, the min and max allowed values and // a pointer to the correct ePWM registers // epwm2_info.EPwm_CMPA_Direction = EPWM_CMP_UP; // Start by increasing CMPA epwm2_info.EPwmTimerIntCount = 0; // Zero the interrupt counter epwm2_info.EPwmRegHandle = &EPwm2Regs; // Set the pointer to the // ePWM module epwm2_info.EPwmMaxCMPA = EPWM2_MAX_CMPA; // Setup min/max CMPA/CMPB // values epwm2_info.EPwmMinCMPA = EPWM2_MIN_CMPA; }
尊敬的 Sayali:
您使用什么行动条件判断器设置、哪个 PWM 输出应具有70%的占空比? 您是否在 ISR 中更新占空比? 如果是、您能否在 ISR 中设置断点以验证中断是否被触发?
谢谢!
卢克