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.

28335两次进入ADC中断函数的时间间隔



首先配置好ADC,每个序列结束时申请中断。再自定义的ADC中断函数,在函数体里对结果寄存器的值进行读取,清除中断标志,重新启动ADC转换等(总之可以进行连续采样,没有问题),但观察到每两次进入中断相隔的时间都不相同,即从进入第一个中断到进入第二个中断所花费的时钟周期数每次都在变化有(在我的配置下,几次分别为584、584、592、576、596、580、588、568、572等)。这是为什么?岂不是不能以固定的采样间隔进行采样?还是我哪里配置不对?

  • 你是怎么测试时钟数的?

  • 在中断函数的第一句设置间断点,单步运行,使用CCS自带的clock时钟功能观察两次采样的间隔。这么做是否有问题?

  • 是的 这样做不准的,CCS的定时器是纯软件的定时器。你可以用定时器的计数器来看。

  • 我试了用定时器观察,依然不同。仍然在中断函数开头设间断点,观察cuptimer0tim的值,依次递减:246、246、24E、24E、22E,第二次我又试了依次,这次的结果是:24A、23E、23A、246、23A

  • 你的ADC 是怎么触发采样的,一个序列是多少个采样

  • 一个序列只采一个通道A0,级联模式,启动停止模式,顺序采样,在每个SEQ1序列结束时置位INT_SEQ1。以下为中断函数

    __interrupt void TT_ADC_ISR(void)
    {

    SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);
    if(array_index>(BUF_SIZE-1))
    array_index=0;

    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//写1清除中断标志INT_SEQ1(.0),该位对EOS_BUF1无影响
    AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位SEQ1到初始状态
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 告知PIE收到了中断,写1清除该组的PIEACK寄存器
    AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//SEQ1重新启动转换的触发信号
    DELAY_US(2.2);//16/7.5M=2.13(us)是在此配置下完成一次转换所需的时间

    }

  • 一个序列只采一个通道A0,级联模式,启动停止模式,顺序采样,在每个SEQ1序列结束时置位INT_SEQ1。以下为中断函数

    __interrupt void TT_ADC_ISR(void)
    {

    SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);
    if(array_index>(BUF_SIZE-1))
    array_index=0;

    AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;//写1清除中断标志INT_SEQ1(.0),该位对EOS_BUF1无影响
    AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//复位SEQ1到初始状态
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // 告知PIE收到了中断,写1清除该组的PIEACK寄存器
    AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;//SEQ1重新启动转换的触发信号
    DELAY_US(2.2);//16/7.5M=2.13(us)是在此配置下完成一次转换所需的时间

    }

  • 你用了DELTAY_US,这个函数本身就不是精确到一个系统时钟的精度,所以会测出来有偏差

  • 我去掉了DELTAY_US()函数之后验证了一下,每次进入中断函数的时间依然不同,