尊敬的 TI 成员:
我尝试仅在检测到 ADC 并从 ADC 读取的输入交流电压的过零处实现跳闸区域。 如果 Vin (输入交流电压)介于-3<Vin<3、则使用 TZ 强制 PWM 信号为低电平、如果 Vin>3或 Vin<-3、则 PWM 信号应继续常规 PWM 操作。 为了实现这一点、我使用了以下代码、
中断 void adca1_ISR (void)
{
random=random+1;
if (random=2048)
random=0;
VIN[2]=(0.1690*(AdcaResultRegs.ADCRESULT3)-348);//调节感测到的电压
if (Vin[2]>3)(输入电压[2]>3)
{
D_八分之一= 0;
D_80B = 500;
DIS=0;
}
if (Vin[2]<-3)
{
D_八分 线 A = 500;
D_80B = 0;
DIS=0;
}
if ((-3<=Vin[2])&&(Vin[2]<=3))
{
DIS = 1;
EALLOW;
EPwm8Regs.TZCTL.bit.TZA = TZ_FORCE_LO;
EPwm8Regs.TZCTL.bit.TSB = TZ_FORCE_LO;
EDIS;
}
其他
{
DIS = 0;
}
EPwm8Regs.CMPA.bit.CMPA = d_eutA;
EPwm8Regs.CMPB.bit.CMPB = d_eutb;
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
空配置 ADC (空)
{
EALLOW;
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
void SetupADCepwm (uint16通道)
{
uint16 acqps;
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC2CTL.bit.CHSEL = 2;//SOC3将转换引脚 A3
AdcaRegs.ADCSOC2CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcaRegs.ADCSOC2CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C 上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 3;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;
//AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
//AdcaRegs.ADCINTSEL1N2.bit.INT1CONT = 1;//启用 INT1标志
EDIS;
}
空 InitEPwm8Examples()
{
EPwm8Regs.TBPRD = 500;//设置定时器周期
EPwm8Regs.TBPHS.bit.TBPHS = 0;//相位为0
EPwm8Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO;
EPwm8Regs.TBCTR = 0x0000;//清除计数器
//
//设置 TBCLK
//
EPwm8Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数
EPwm8Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm8Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm8Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm8Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE;//每0加载一次寄存器
EPwm8Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm8Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm8Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm8Regs.AQCTLA.bit.CAD = AQ_CLEAR;//将 PWM1A 设置为零
EPwm8Regs.AQCTLA.bit.CAU= AQ_SET;
EPwm8Regs.AQCTLB.bit.CBD = AQ_CLEAR;//将 PWM1A 设置为零
EPwm8Regs.AQCTLB.bit.CBU = AQ_SET;
}
中断空 RESET_ISR (空)
{
EALLOW;
如果(dis = 1)
EPwm8Regs.TZFRC.bit.CBC = 1;
其他
EPwm8Regs.TZCLR.bit.CBC = 1;
EDIS;
}
我使用的上述代码使所有 ePWM 信号变为低电平、但当输入电压大于3V 或小于-3V 时、无法使它们正常运行。 所需的 PWM 应该是这样的、

