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.

PMSM电机控制例程是否需要等待AD转换结束标志位置位再读取AD转换结果?



TI提供的PMSM例程大多都是用PWM触发SOC启动AD转换,同时用PWM触发电机控制中断,在电机控制中断MotorISR中读取AD转换结果,进行FOC算法控制。

PWM在触发SOC启动AD转换时,也触发了电机控制中断MotorISR,从逻辑上说,在MotorISR中是否应当等AD转换结束标志位置位再读取AD结果?

但是我看大多数例程里面都是进入MotorISR直接读取,就是如下所示:

interrupt void MotorControlISR(void)
{

// Verifying the ISR

IsrTicker++;

clarke1.As = (float)IFB_SV_PPB* ADC_PU_PPB_SCALE_FACTOR;
clarke1.Bs = (float)IFB_SW_PPB* ADC_PU_PPB_SCALE_FACTOR;

}

但是偶尔看到有另外一个例程里是如下写的:

interrupt void MotorControlISR(void)
{

// Verifying the ISR

IsrTicker++;

while(!AdcaRegs.ADCINTFLG.bit.ADCINT1); //wait on ADC EOC
asm(" NOP"); //1 cycle delay for ADC PPB result

clarke1.As = (float)IFB_SV_PPB* ADC_PU_PPB_SCALE_FACTOR;
clarke1.Bs = (float)IFB_SW_PPB* ADC_PU_PPB_SCALE_FACTOR;

}

多了一个查询AdcaRegs.ADCINTFLG.bit.ADCINT1标志位的等待过程,查了下是等待AD 的EOC结束标志位,该过程会增加程序时间,并且在大多数例程里都没有。

我想问的是,是否应该去查询AdcaRegs.ADCINTFLG.bit.ADCINT1这个标志位再读取结果?

从逻辑上想,我觉得应该去查询这个标志位,等待AD转换结束再读取AD标志位,但是为何大多数例程,包括HVPM_Sensorless,IDDK_PM_SERVO等都没有这句语句。如果不等待,读取的AD结果应该是上一个周期的?这样就有一个控制周期的延时了,跟实时系统的思想不符。但是如果去等待查询这个标志位,会导致程序执行时间变长一些,好纠结

  • 多了一个查询AdcaRegs.ADCINTFLG.bit.ADCINT1标志位的等待过程,查了下是等待AD 的EOC结束标志位,该过程会增加程序时间,并且在大多数例程里都没有。

    我想问的是,是否应该去查询AdcaRegs.ADCINTFLG.bit.ADCINT1这个标志位再读取结果?

    从逻辑上想,我觉得应该去查询这个标志位,等待AD转换结束再读取AD标志位,但是为何大多数例程,包括HVPM_Sensorless,IDDK_PM_SERVO等都没有这句语句。如果不等待,读取的AD结果应该是上一个周期的?这样就有一个控制周期的延时了,跟实时系统的思想不符。但是如果去等待查询这个标志位,会导致程序执行时间变长一些,好纠结”

    Eric

    这个要看一下这个中断是由什么来触发的。如果是PWM来触发中断,且ADC的转换是通过PWM来触发的,那么则需要在PWM的中断里面去查询ADC是否转换完成,因为ADC的转换需要一定的时间,而PWM的中断触发是立即出发的。

    如果是PWM触发ADC采样,然后由ADC转换完去触发这个中断,则不需要在中断服务函数里面去查询这个标志位,因为ADC已经转换完成了。