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.

[参考译文] TMS320F28388D:是否可以在第一个 SoC 完成之前将 ADC 后处理块重新分配到不同的 SoC?

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1122435/tms320f28388d-is-it-possible-to-reassign-the-adc-post-processing-blocks-to-different-socs-before-the-first-of-those-socs-finish

器件型号:TMS320F28388D
主题中讨论的其他器件:C2000WARE

您好!

我对使用 ADC 模块的后处理块(PPB)对 SoC 的结果应用偏移校正和基准漂移感兴趣。 但是、每个 ADC 模块只有4个 PPB、我计划使用 4个以上的 SoC。

因此、 我想知道 是否可以通过使用中断服务例程 将 PPB 结果存储在不同的存储器位置、然后重新配置 PPB、在下一组 SoC 中的第一组完成之前处理不同 SoC 集的结果 转换(然后切换回第一组)。

例如、假设 SoC 以轮循方式工作、SoC 0首先启动、然后我首先分配 PPB 来处理 SoC 0-3的结果。 一旦 SoC 3的 EOC 发生、我会快速存储 SoC 0至3的 PPB 结果、并重新分配 PPB 以处理 SoC 4至7。 我必须能够 在 SoC 4完成之前完成上述任务、否则我将失去执行快速偏移校正和基准漂移的机会。  最后、SoC 7完成后、我将执行与 SoC 3完成之前几乎相同的操作、但现在我重新分配了 PPB 以再次处理 SoC 0至3。

当然、这也取决于每个 SoC 的长度采集窗口。 采集窗口越长、SoC 所需的时间就越长、 上述任务越有可能按时完成。 因此、如果确实能够以这种方式操作 PPB、我还想了解需要设置的最小采集窗口、以了解为了 读取 PPB 并更改 PPB 分配给哪些 SoC 而需要设置的系统周期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Howard、

    PPB 在转换结束(EOC)后需要一个 SYSCLK 周期来处理 ADC 结果-换句话说、在 ADCxRESULT 可用后的一个周期内、已处理的结果在 ADCPPBxRESULT 中可用。 在转换完成之前、可以随时更改 ADCPPBxCONFIG 的值。 由于您将通过中断服务例程执行此操作、因此您需要检查中断完成所需的时间。 额外的周期无关紧要、这是因为 ISR 由 EOC 触发并且中断延迟需要一些时间(管线清空、CPU 运行环境保存等)。 直到 ADCPPBxCONFIG 被修改的总 ISR 处理时间将是采样+保持时间+转换时间的最小约束:你必须能够在下一个转换结束前至少一个周期更新这个寄存器。

    有关 ISR 总延迟的更详细分析、请查看此 E2E 帖子

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我计划中断类似于以下代码段:

    // Assume that the ADC module of interest is ADC_A 
    // and this ISR happens at the EOC of SoC 3. No result reading
    // code is present because results will be copied using DMA.
    // ADC interrupt flag clearing is also not present because
    // ADC continuous mode is enabled.
    const uint16_t soc_nums_1[4] = {4,5,6,7,1};
    __interrupt void DMA_CH4_ISR(void) {
        EALLOW;
        HWREGH(0x00007440U) = soc_nums_1[0];
        HWREGH(0x00007448U) = soc_nums_1[1];
        HWREGH(0x00007450U) = soc_nums_1[2];
        HWREGH(0x00007458U) = soc_nums_1[3];
        EDIS;
        
        HWREGH(0x0CE1) = soc_nums_1[4]; // Acknowledge Interrupt Group 1
    }

    使用-O4优化进行编译时、反汇编包含以下内容:

    00cccc:   761B        ASP          
    00cccd:   FFF0        PUSH         RB
    00ccce:   A8BD        MOVL         *SP++, XAR4
    00cccf:   E20000BD    MOV32        *SP++, STF
    00ccd1:   E6300600    SETFLG       RNDF32=1,RNDF64=1
    00ccd3:   2942        CLRC         OVM|PAGE0
    00ccd4:   5616        CLRC         AMODE
    00ccd5:   7622        EALLOW       
    00ccd6:   8F00AB52    MOVL         XAR4, #0x00ab52
    00ccd8:   F4C47440    MOV          *(0:0x7440), *+XAR4[0]
    00ccda:   F4CC7448    MOV          *(0:0x7448), *+XAR4[1]
    00ccdc:   F4D47450    MOV          *(0:0x7450), *+XAR4[2]
    00ccde:   F4DC7458    MOV          *(0:0x7458), *+XAR4[3]
    00cce0:   761A        EDIS         
    00cce1:   F4E40CE1    MOV          *(0:0x0ce1), *+XAR4[4]
    00cce3:   E28000BE    MOV32        STF, *--SP
    00cce5:   8ABE        MOVL         XAR4, *--SP
    00cce6:   FFF1        POP          RB
    00cce7:   7617        NASP         
    00cce8:   7602        IRET         

    对代码进行性能评测后发现、运行中断需要30个 CPU 周期、设置所有4个 PPB 需要24个周期。 16位差动转换的采集窗口的最小长度为63个 CPU 周期。

    ADC 由 ePWM 模块触发。 每个 ADC 触发周期具有其中2个中断、这意味 着每个 ADC 触发周期将花费60个 CPU 周期来更改 PPB。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Howard、

    我想、通过使用 C2000ware (f2838x_adc.h)中提供的位字段标头、也许您可以获得稍微更高效的代码、这种情况与以下情况类似、而不是对寄存器地址进行硬编码:

        AdcaRegs.ADCPPB1CONFIG.all = soc_nums_1[0];
        AdcaRegs.ADCPPB2CONFIG.all = soc_nums_1[1];
        AdcaRegs.ADCPPB3CONFIG.all = soc_nums_1[2];
        AdcaRegs.ADCPPB4CONFIG.all = soc_nums_1[3];

    无论哪种方式 、它看起来是您在这里的主要制约因素、即您尝试 处理所有结果、并在一个中断内重新配置所有 PPB 、然后在一个转换窗口内完成该过程。 您可能需要增加 ACQPS 以适应、或者延迟下一组 SOC 的触发、以便您可以执行需要执行的操作。 一个有用的选项是使用 DMA 读取 ADC 结果、而不是在 ISR 中手动读取、这也会为您节省一些 CPU 周期。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一个 ePWM 触发器将启动8个 SoC。

    ePWM 触发器之间的时间将远长于所有8个 SoC 完成所需的时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Howard 、您的 ADC 总转换时间包括 ACQPS +转换时间(tLAT)。 假设50MHz ADC 时钟和200MHz SYSCLK (200/50 * 29.5=118)、16位模式的转换时间将至少为118个 SYSCLK 周期。 因此、总共应该有181个 SYSCLK 周期来处理结果并更新 PPB 配置。 我认为这足以满足您的需求。