ZHCACE4 March   2023 TMS320F2800132 , TMS320F2800133 , TMS320F2800135 , TMS320F2800137 , TMS320F2800152-Q1 , TMS320F2800153-Q1 , TMS320F2800154-Q1 , TMS320F2800155 , TMS320F2800155-Q1 , TMS320F2800156-Q1 , TMS320F2800157 , TMS320F2800157-Q1 , TMS320F280021 , TMS320F280021-Q1 , TMS320F280023 , TMS320F280023-Q1 , TMS320F280023C , TMS320F280025 , TMS320F280025-Q1 , TMS320F280025C , TMS320F280025C-Q1 , TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1

 

  1.   摘要
  2.   商标
  3. 1简介
  4. 2原理
  5. 3硬件
  6. 4软件
  7. 5结果
  8. 6总结
  9. 7参考文献

软件

本应用手册中的示例使用带有 driverlib 的 SysConfig 来配置 ADC、ePWM 和其他外设。在程序代码内,应设置 ADC 来更大限度地减少开销,从而在各次转换之间留出更多时间来执行控制循环。对于本应用手册中使用的示例,SOC 配置为具有循环优先级的突发模式,以便在过采样时一起触发 SOC 并进行累加,而不会丢失任何值。中断设置为在最后一个 SOC(用于 F28003x 的 SOC15)到达转换结束时触发。中断会运行相应的 ISR,该 ISR 会存储 ADC 结果,如果启用了过采样,则累加多个 SOC 结果。

ePWM 会触发此处的 SOC,但也可以使用软件触发器和 CPU 计时器触发器。选择触发周期时应小心,使 SOC 采样保持一致,并在控制循环其余部分保持适当的转换时间。一旦突发序列中的最后一个 SOC 发出转换结束信号,ISR 便会执行控制循环。在此示例中,控制循环包含一个简单的累加函数,用于过采样和存储结果。应避免对值求平均,因为这会丢弃结果较低位中包含的信息,进而有效降低测量精度。在触发下一次突发之前,最终结果存储在存储器中。

下面是使用突发 ISR 设置进行基线采样的示例:

__interrupt void adcA1ISR(void)
{
    //
    // Clear the interrupt flag
    //
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

    //
    // 1X Oversampling
    //
    lv_results[nloops++] = ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER0);

    //
    // Check if overflow has occurred
    //
    if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
    {
        ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
        ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    }

    //
    // Check if all results are stored
    //
    if(nloops >= numBins)
    {
        //
        // Disable ADC interrupt
        //
        ADC_disableInterrupt(myADC0_BASE, ADC_INT_NUMBER1);
        ESTOP0;
    }

    //
    // Acknowledge the interrupt
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}

使用 ISR 对信号进行 8 倍过采样的示例如下:

__interrupt void adcA1ISR(void)
{
    //
    // Clear the interrupt flag
    //
    ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);

    //
    // Accumulate 8 ADC results to oversample 8X
    //
    lv_results[nloops++] = (ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER0) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER1) +
            ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER2) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER3) +
            ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER4) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER5) +
            ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER6) + ADC_readResult(myADC0_RESULT_BASE, ADC_SOC_NUMBER7));

    //
    // Check if overflow has occurred
    //
    if(true == ADC_getInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1))
    {
        ADC_clearInterruptOverflowStatus(ADCA_BASE, ADC_INT_NUMBER1);
        ADC_clearInterruptStatus(ADCA_BASE, ADC_INT_NUMBER1);
    }

    //
    // Acknowledge the interrupt
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}

一旦存储了预期数量的结果,即可禁用相应的中断,否则 ADC 可以继续转换模拟信号。使用 ePWM 触发突发转换来进行过采样的基本流程如图 4-1 所示。

GUID-A1813D9A-5C5B-483A-9744-C00ED9F9F06D-low.png图 4-1 过采样的 SoC 流程图

根据特定应用的控制循环,可能需要比 ADC 的最大采样率所允许的时间更长的时间。要解决此问题,请增加 ePWM 时基以允许更长的转换时间,从而为控制循环提供更多完成时间。这降低了可正确测量的最大频率,因为 ADC 不会经常触发。

输入频率会影响可使用的过采样因子。对于频率更高或需要以更高速率进行采样的信号,由于所需的软件开销,需要使用更低的过采样因子。为了确定不大可能丢失数据的最大输入频率,需要控制循环和过采样所需的周期数。控制循环周期计数包括任何用户相关操作(例如 ISR 处理)或每次获取新样本时需要执行的处理。图 4-2 展示了在对信号进行采样时这些时序发挥作用的地方。在此图中,过采样和控制循环时间包括用于中断延迟和 ISR 执行的系统时钟周期。请注意,控制循环结束到下一个 ADC 触发器到达之间存在一些缓冲时间,因此处理不会阻止触发发生,数据也不会丢失。图 4-3 显示,当转换、过采样和控制循环的总时间超过突发触发周期时,数据丢失了。解决此问题的方法是延长周期,在本示例中,需要延长 ePWM 时基才能进一步移动触发器。

表 5-3 展示了本应用手册中使用的过采样的时序,其中包括从 ADC 寄存器读取结果的时间(必要时累加值)以及将结果存储在 RAM 中的时间。此表的计时仅是在 --opt_for_speed = 5 下得出的,用于实现优化,因此计时不一定是可实现的最小值。有关如何提高程序速度的更多详细信息,请参阅 C2000 C28x 优化指南

如果控制循环时序未知,简单的 GPIO 切换就足够准确,可以确定该循环的周期。以下功能可用于将 SOC 事件触发器路由到相应的外部引脚。这可用于验证事件是否正确触发,以及 ISR 是否有足够的时间在突发再次触发之前运行。

SysCtl_enableExtADCSOCSource(SYSCTL_ADCSOC_SRC_PWM1SOCA)

GUID-2D325B16-080B-4024-BC7D-58C4C319C14E-low.gif图 4-2 信号采样时序
GUID-FF7FF9D6-F549-46D5-BE08-D14F2D36E9B3-low.gif图 4-3 信号采样时序不正确
表 4-1 过采样时间
过采样因子 过采样时间(时钟周期)
1X 9
两倍于 52
4X 127
8X 272
16X 551

以中断服务例程 (ISR) 中的控制循环为例,该循环大约需要 300 个周期来运行。使用 ISR 以 16 倍过采样测量正弦波需要 851 个周期。如果正弦波为 10kHz,根据奈奎斯特定理,最小采样率至少为 20kSPS(千个样本每秒)。TMS320F28003x 实时微控制器技术参考手册 ADC 时序图 一章中的表展示了 tLAT 如何随 ADC 时钟预分频值的增大而增加。SYSCLK 是系统时钟频率。TMDSCNCD280039C 默认为 120MHz。对于 TMDSCNCD280039C 上的 60MHz ADC 时钟,时钟预分频器将 SYSCLK 除以 2,tLAT 的值为 23 个 SYSCLK 周期。FSample 是特定应用所需的每秒样本数,此处为 20kSPS。

方程式 1. A C Q P S M A X   =   S Y S C L K F S a m p l e   -   t L A T   -   1
方程式 2. C y c l e s S a m p l e =   t L A T   +   A C Q P S   +   1
方程式 3. M a x i m u m   I n p u t   F r e q u e n c y   =   S Y S C L K 2   ×   C y c l e s S a m p l e   +   C y c l e s C o n t r o l   L o o p   +   C y c l e s O v e r s a m p l e

在此示例中,根据上述公式,最大采集窗口大小 (ACQPS) 为 5,976。该值非常大,只是因为采样率没有非常高的要求。由于 ACQPS 本身由输入网络决定,因此具有最大 ACQPS 值非常重要,以便有足够的时间对输入进行采样而不丢失重要数据点。有关计算 ACQPS 值的更多信息,请参阅 TMS320F28003x 实时微控制器技术参考手册ADC 一章的选择采集窗口持续时间 部分。在给定奈奎斯特速率的情况下,使用此示例设置可测量的最大输入频率约为 67kHz。为了进行比较,本应用手册中收集的数据以大约 3MSPS 的速率进行采样,这只能通过使用 16 或更低的 ACQPS 值来实现。假设 ISR 时间约为 211 个周期,则使用此采样率测量的最大输入频率约为 74kHz。