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.

关于咨询28035中BLPFCv1.0的问题



你好,我想质询在BLPFC中若想改变开关频率,那么下面代码中的period、period_instr_pwm 、TBPRD这几个周期之间有什么关系,若想改变开关频率,怎么修改?

#define period 300
#define period_instr_pwm 120

// Configure PWM1 for 200Khz switching Frequency
PWM_1ch_UpDwnCnt_CNF(1, period, 1, 0);
// Configure PWM2 for 200Khz switching Frequency
PWM_1ch_UpDwnCnt_CNF(2, period, 0, 0);

// Configure PWM4 for Instrumentation; 1Mhz switching Frequency
PWM_1ch_UpDwnCnt_CNF(4, period_instr_pwm, 0, 0);

EALLOW;
SysCtrlRegs.PCLKCR1.bit.EPWM7ENCLK = 1; // ePWM7
// Setup TBCLK
EPwm7Regs.TBPRD = 3000; // Set timer period 3000 TBCLKs
EPwm7Regs.TBPHS.half.TBPHS = 0x0000; // Phase is 0
EPwm7Regs.TBCTR = 0x0000; // Clear counter
// Setup counter mode
EPwm7Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // Count up
EPwm7Regs.TBCTL.bit.PHSEN = TB_DISABLE; // Disable phase loading
EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm7Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
// Configure the Start of Conversion for the ADC.
EPwm7Regs.ETSEL.bit.INTEN = 1; //
EPwm7Regs.ETSEL.bit.INTSEL = ET_CTR_PRD; // Select Int from counter = PRD
EPwm7Regs.ETPS.bit.INTPRD = ET_1ST; // Generate pulse on 1st event

PieVectTable.EPWM7_INT = &SECONDARY_ISR;
IER |= M_INT3; // Enable CPU INT3 for capture interrupt
PieCtrlRegs.PIEIER3.bit.INTx7 = 1; // Enable EPWM7 int in PIE group 3
EDIS;

//sine analyzer initialization
sine_mainsV.Vin=0;
sine_mainsV.SampleFreq=_IQ15(10000.0);
sine_mainsV.Threshold=_IQ15(0.1);//(0.02);
// End sine analyzer initialization


#define IpfcR AdcResult.ADCRESULT1 //Q12
#define VbusR AdcResult.ADCRESULT2 //Q12
#define VL_fbR AdcResult.ADCRESULT3 //Q12
#define VN_fbR AdcResult.ADCRESULT4 //Q12

// ADC Channel Selection for C2000EVM
ChSel[0] = 2; // Dummy read for first
ChSel[1] = 2; // A2 - IpfcA
ChSel[2] = 6; // A6 - Vbus
ChSel[3] = 1; // A1 - VL_fb
ChSel[4] = 0; // A0 - VN_fb

// ADC Trigger Selection
TrigSel[0] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA
TrigSel[1] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA
TrigSel[2] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA
TrigSel[3] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA
TrigSel[4] = ADCTRIG_EPWM1_SOCA; // ePWM1, ADCSOCA

// Configure ADC
ADC_SOC_CNF(ChSel, TrigSel, ACQPS, 17, 0);

// Configure ePWMs to generate ADC SOC pulses
EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable ePWM1 SOCA pulse
EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTR_ZERO; // SOCA from ePWM1 Zero event
EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // Trigger ePWM1 SOCA on every event


DPL_Init();

  • period和period_instr_pwm都是在PWM_1ch_UpDwnCnt_CNF函数中用到的,你可以参考PWM_1ch_UpDwnCnt_Cnf.c文件中的函数调用。
    TBPRD是PWM模块的时基周期寄存器,计算PWM频率的公式为:
    Fpwm=1/Tpwm
    Tpwm=2*TBPRD*Ttbclk
    其中TBPRD已经给出,
    TBCLK = SYSCLKOUT / (HSPCLKDIV × CLKDIV),对应你代码中的:
    EPwm7Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm7Regs.TBCTL.bit.CLKDIV = TB_DIV1;

    即,这几个参数应该都是可以更改PWM频率的,前两个是调用了函数,后一个是直接修改PWM的寄存器。