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.

TMS320F28035: adc采样通道干扰的问题

Part Number: TMS320F28035

我现在SOC3是PWM1的中断触发,其他通道SOC0~2, SOC5~9这些是软件触发采样。 现在发现,SOC3的采样结果受到了干扰(没有关注其他通道采样是否同样存在相互干扰)。 其他通道采样频率越快,SOC3受到的干扰的频率也就越快,但是出现时机是随机的。

我以前顺序采样的时候,也有偶尔出现干扰。也就是先软件触发soc0采样,等待采样完成再用软件触发SOC1。。。以此类推。 也偶尔出现采样结果错误,但是发生的频率非常低,偶尔才会出现一次。现在这种方式出现的频率实在太高了,都影响环路是否正常工作了。

现在想问问,怎么才能消除这种干扰。

  • 个人觉得可能不是这个原因。我虽然是有SOC0->SOC1->SOC2, 但是我是先触发一个,读中断标记,等待转换完成后再触发下一个。并且,我的中断标记设置成了转换完成后设置中断标记。并不是同时触发三个采样。 应该不是这相邻通道的干扰。

    当前我其他采样都避开了SOC3的采样时刻,SOC3的采样看起来是没有问题了。

  • 相同触发源的第一个采样不可信,我看官方勘误表上是推荐不用,你PWM1的中断触发后采的第一个就是SOC3,那么SOC3就是不好的采样,你换成PWM1的中断触发后先采SOC2再采SOC3的话估计SOC3就会正常了。

  • 可能是这样的。后续我试试看。

    我之前的猜想是,可能SOC3正在采样的时候我主循环触发了SOC0,然后干扰了SOC3的采样结果。后面我主循环采样,都避开了SOC3的采样时刻,看起来就正常了。但是我还是没弄明白,第一,我的采样窗口都是设为9,并不是勘误表中的6~7.第二,我所有的采样都是一次只触发一个。如果要采样一个通道,都必须触发两个采样,再取一个的话,这个芯片也太搞笑了。

  • 也就是说两路采样是同时进行的,

    1. SOC0~2, SOC5~9,软件触发

    2. SOC3,PWM1的中断触发。是在中断中通过软件触发吗?还是EPWM1 SOCx(x=A/B)直接触发?

    虽然一个ADC模块中有两路采样保持,但是只有一个ADC转换器。

    我觉得这个问题还是与触发的时序有关,以及具体使用的采样通道。

    方便把ADC的配置代码上传上来看一下吗?

  • SOC3, 是PWM1的事件触发,TBCR = CMPB 时触发, 但是PWM1到CPU的中断没开。 也就是直接触发。 其他所有采样就是主程序里面用软件触发了。

    AdcRegs.ADCCTL1.bit.ADCBGPWD = 1; //使能上电
    AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;
    AdcRegs.ADCCTL1.bit.ADCPWDN = 1;
    AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; //中断在转换完成时产生
    AdcRegs.ADCCTL1.bit.ADCREFSEL = 0; //使用内部参考
    AdcRegs.ADCSAMPLEMODE.all = 0; //全部都是单采样
    AdcRegs.ADCCTL1.bit.ADCENABLE = 1; //使能ADC

    //SOC0, 电池电压
    AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC0CTL.bit.CHSEL = 8; //B0
    AdcRegs.ADCSOC0CTL.bit.ACQPS = 9; //9+1 采样

    //SOC1, PV电压
    AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC1CTL.bit.CHSEL = 11;//B3
    AdcRegs.ADCSOC1CTL.bit.ACQPS = 9; //9+1 采样

    //SOC2, 电池电流
    AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC2CTL.bit.CHSEL = 12; //B4
    AdcRegs.ADCSOC2CTL.bit.ACQPS = 9; //9+1 采样

    //SOC3, 输出电压
    AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5; //epwm1-socA
    AdcRegs.ADCSOC3CTL.bit.CHSEL = 14; //B6
    AdcRegs.ADCSOC3CTL.bit.ACQPS = 9; //9+1 采样

    //SOC4, Alt mos温度
    AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC4CTL.bit.CHSEL = 7; //A7
    AdcRegs.ADCSOC4CTL.bit.ACQPS = 9; //9+1 采样

    //SOC5, PVmos温度
    AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC5CTL.bit.CHSEL = 9; //B1
    AdcRegs.ADCSOC5CTL.bit.ACQPS = 9; //9+1 采样

    //SOC6, 电池温度
    AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 0; //使用软件触发
    AdcRegs.ADCSOC6CTL.bit.CHSEL = 10; //B2
    AdcRegs.ADCSOC6CTL.bit.ACQPS = 9; //9+1 采样

    这是我的配置。  我不明白的是,就算当前SOC3正在采样。我软件触发了SOC0, ADC也会等到SOC3采样结束再采样SOC0。 手册里面说了会挂起的了。

  • 好的,我看一下