请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320F280049C 工具与软件:
您好!
我将尝试生成2个反相 PWM、每个 PWM 具有50%的占空比、并且信号之间有一个200ns 的死区、因此将正确生成死区
但我的问题是、我无法获得精确的占空比值、如示波器 pic 中所示、占空比在47%- 53%之间变化。 设置
那么,我如何在保持死区的同时实现精确的占空比(精确的50 %)(代码是)
#include "f28x_Project.h"
__interrupt void epwm1_ISR(void);
__interrupt void epwm2_ISR(void);
//PWM Period= (2×Desired Frequency) / System Clock
Uint16 pwm_period = 333; // 150 kHz frequency with 100 MHz clock
Uint16 duty_cycle_cmpa = 166; // 50% duty cycle (TBPRD/2)
Uint16 deadband_value = 20; // 200 ns deadband (20 clock cycles)
void main(void)
{
// Initialize system
InitSysCtrl();
// Disable interrupts
DINT;
// Clear interrupts
IER = 0x0000;
IFR = 0x0000;
// Initialize peripherals
InitPieCtrl();
// Initialize PIE vector table
InitPieVectTable();
// Assign our ISR addresses to the elements in vector table
EALLOW;
PieVectTable.EPWM1_INT = &epwm1_ISR;
PieVectTable.EPWM2_INT = &epwm2_ISR;
EDIS;
// Enable ePWM1 and ePWM2 clocks
EALLOW;
CpuSysRegs.PCLKCR2.bit.EPWM1 = 1;
CpuSysRegs.PCLKCR2.bit.EPWM2 = 1;
EDIS;
// Configure ePWM1
EPwm1Regs.TBPRD = pwm_period; // Set 150 kHz period
EPwm1Regs.TBCTL.bit.CTRMODE = 2; // Up-down count mode
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // No high-speed clock divider
EPwm1Regs.TBCTL.bit.CLKDIV = 0; // No clock divider
EPwm1Regs.CMPA.bit.CMPA = pwm_period/2; // 50% duty cycle
// Configure Action Qualifier for ePWM1 A and B
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // Clear PWM on CMPA up count
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // Set PWM on CMPA down count
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR; // Set PWM on CMPA up count
EPwm1Regs.AQCTLB.bit.CAD = AQ_SET; // Clear PWM on CMPA down count
// Dead band configuration for ePWM1
EPwm1Regs.DBCTL.bit.IN_MODE = 1; // EPWMxA as source for both rising and falling edges
EPwm1Regs.DBCTL.bit.POLSEL = 2; // Active low complementary mode
EPwm1Regs.DBCTL.bit.OUT_MODE = 3; // Deadband fully enabled
EPwm1Regs.DBRED.bit.DBRED = deadband_value; // Rising edge delay
EPwm1Regs.DBFED.bit.DBFED = deadband_value; // Falling edge delay
// Configure ePWM2 similarly
EPwm2Regs.TBPRD = pwm_period;
EPwm2Regs.TBCTL.bit.CTRMODE = 2; // Up-down count mode
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;
EPwm2Regs.TBCTL.bit.CLKDIV = 0;
EPwm2Regs.CMPA.bit.CMPA = pwm_period/2; // 50% duty cycle
EPwm2Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLA.bit.CAD = AQ_SET;
EPwm2Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm2Regs.AQCTLB.bit.CAD = AQ_SET;
// Dead band configuration for ePWM2
EPwm2Regs.DBCTL.bit.IN_MODE = 1;
EPwm2Regs.DBCTL.bit.POLSEL = 2;
EPwm2Regs.DBCTL.bit.OUT_MODE = 3;
EPwm2Regs.DBRED.bit.DBRED = deadband_value;
EPwm2Regs.DBFED.bit.DBFED = deadband_value;
// Enable PIE interrupts for ePWM1 and ePWM2
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;
// Enable group interrupts in IER
IER |= M_INT3;
// Enable global interrupts
EINT;
// Setup GPIO pins for ePWM1 and ePWM2
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // ePWM1A
GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1; // ePWM1B
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; // ePWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3 = 1; // ePWM2B
EDIS;
// Infinite loop
for (;;);
}
// ISR for ePWM1
__interrupt void epwm1_ISR(void)
{
// Clear interrupt flag
EPwm1Regs.ETCLR.bit.INT = 1;
// Acknowledge interrupt in PIE
PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}
// ISR for ePWM2
__interrupt void epwm2_ISR(void)
{
// Clear interrupt flag
EPwm2Regs.ETCLR.bit.INT = 1;
// Acknowledge interrupt in PIE
PieCtrlRegs.PIEACK.bit.ACK3 = 1;
}

