我使用28035的ad采样中断进行控制计算,但发现很奇怪的事情,问题如下:
我用PWM触发ad中断,ad中断函数进行控制计算,PWM的周期为50us,当ad中断函数的执行时间在40us左右时,出现了下如图所示的波形,蓝色为一个io口的输出,当进入ad中断时,将此io口置高,推出中断前,将此io口置0。结果出现ad采样中断不定期的进入,间隔时间远远超过50us。粉色为其它波形,不用考虑。
而当我将ad函数的计算时间缩减为30us时,这个io口就正常了,如下图:
而如果我把这个ad中断函数的计算时间放的再长一点,由于一个周期不能计算完成,io口的周期改为了100us,也就是两个控制周期才能完成一次计算,我觉得这个也是正常的,我不能理解的是,为什么会出现第一个图的情况,按理说,如果即使一个周期完成不了任务,也应该像第二张图那样周期改为100us。
ad中断的函数如下,通过修改for循环的周期可以修改ad中断函数的执行时间:
interrupt void ADCFinishedISR (void)
{
// INT16S wMidGridVolt;
INT16S wMidGridCurr;
INT16S wMidInvVolt;
INT16U TempPVVolt1;
INT16U TempPVVolt2;
//新控制板对应的采样
GpioDataRegs.GPASET.bit.GPIO6 = 1;
livPVArrayCurr[1] = AdcResult.ADCRESULT2;
livPVArrayCurr[0] = AdcResult.ADCRESULT3;
TempPVVolt1 = AdcResult.ADCRESULT4;
TempPVVolt2 = AdcResult.ADCRESULT6;
hiMGridVoltAdr = AdcResult.ADCRESULT7;
hiMGridCurrentAdr = AdcResult.ADCRESULT9;
hiMDCIAdr = AdcResult.ADCRESULT10;
hiMInvVoltAdr = AdcResult.ADCRESULT11;
hiMGFCIAdr = AdcResult.ADCRESULT12;
livPVISO = AdcResult.ADCRESULT13;
livDCBusVolt = AdcResult.ADCRESULT14;
for(ii=0;ii<150;ii++)
{
}
GpioDataRegs.GPACLEAR.bit.GPIO6 = 1;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //clear ADCINT1 flag reintialize for nest SOC
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //Acknowledge interrupt to PIE
}
望大牛帮忙,十分感谢!
