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.

[参考译文] TMS320F280049C:ADC SOC 序列问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1653514/tms320f280049c-adc-soc-sequence-issue

器件型号: TMS320F280049C

你(们)好  

我遇到 ADC SOC 序列问题。

以下是我的 ADC 配置
             (1) ADC-A SOC0、SOC1、SOC2、SOC3、SOC5、SOC6、SOC7 转换共享相同的触发源(当计时器递增时,时基计数器等于 CMPA (Event1)。
             (2) ADC-A SOC4 转换触发源是时基计数器、当计时器递减 (Event2) 时等于 CMPA
             (3) CMPA 值= 50%周期值
             (4) 计时器基本模式为向上和向下
             (5) 每两个 PWM 周期触发一次所有 SOC 转换
             (6) 所有 SOC ACQPS 配置都相同
             (7) 请勿设置任何高优先级

我认为 Event1 首先发生、然后 Event2 第二次发生、SOC 转换序列应该是 SOC0、SOC1、SOC2、SOC3、SOC5、SOC6、SOC7、但实际上我看到序列是 SOC5、SOC6、SOC7、SOC0、SOC1、SOC2、SOC3、所以我不知道为什么会这样? 您能否就此提供一些指导?

我 放置了一个有关 ADC 配置 ADC_Configuration.png的图表以供您参考。

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

    尊敬的 Xu:

    您能否提供更多有关时序的详细信息? SYSCLK 的速度有多快、ADC 配置为多快以及 ACQPS 设置是多少?  对于 PWM、什么是 TBPRD 设置、什么是 CMPA 值、什么是 PWM 速度?  对于 PWM、选择向上/向下计数、对吗?  让我们得出这些值、看看 SOC 顺序可能会发生什么情况。

    此致、

    Joseph

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

    您好、Joseph:

    (1) SYSCLK = 100MHz、ADC 时钟= 50MHz、所有通道 ACQPS= 30
    (2) TBPRD = 500、CMPA = 250、PWM 频率= 100kHz、已检查 PWM 上/下设置是否正确

    此致、

    Lucas

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

    您好、Lucas:

    感谢您提供更多信息、因为时序分析需要此信息。   根据您的配置、您看到的行为是预期行为。 原因是轮询指针 (RRPOINTER) 从上一个转换周期中保留其位置 — 这不是错误。

    当新的触发器触发时、C28x ADC 轮询仲裁器不会复位其指针。 它从 RRPOINTER + 1 恢复扫描、无论最后一次转换离开它。

    在您的设置中、SOC4 始终是每个周期中完成的最后一个 SOC、因为 Event2 (CMPA=、DOWN) 在 Event1 和 SOC4 队列后面剩余的 CTR 后触发。 这会使 RRPOINTER = SOC4 在每个周期结束时。

    当 Event1 在下一个周期触发并同时触发 SOC01,2,3,5,6,7 时、仲裁器从 RRPOINTER+1 = SOC5 进行扫描。 SOC4 未挂起、因此会跳过它、首先找到 SOC5、序列变为:

    SOC5 -> SOC6 -> SOC7 -> SOC0 -> SOC1 -> SOC2 -> SOC3(绕过 SOC7)

    这与您观察到的完全匹配。

    以下是基于您提供的 SYSCLK、ADCLK、ACQPS 的计时演示:

       -每个 SOC 的 ADC 转换时间=(31 + 14) x 20ns =~900ns

    当 TBPRD=500、CMPA=250,向上 — 向下计数模式,PWM=100kHz:
       - Event1 (CMPA=CMPA, UP) 在 t = 2.5us 时触发进入 CTR 周期
       - Event2 (CMPa=CMPA, DOW) 在 t = 7.5us 时触发进入 CTR 周期
       - Event1 和 Event2 之间的间隔= 5.0us

    在稳态下 (RRPOINTER=SOC4 进入 Event1):

       t=2.5us Event1 火灾-> SOC01,2,3,5,6,7 全部待定
             RRPOINTER = SOC4、从 SOC5 进行仲裁器扫描

       SOC5 转换时 (2.5 -> 3.4us)
       SOC6 转换 (3.4 -> 4.3 μ s)
       SOC7 转换器 (4.3 -> 5.2us)[包装回 SOC0]
       SOC0 转换器 (5.2 -> 6.1us)
       SOC1 转换器 (6.1 -> 7.0us)

       t=7.5us Event2 触发-> SOC4 挂起
             SOC2 此时正在主动转换

       SOC2 转换器 (7.0 -> 7.9us)
       SOC3 转换 (7.9 -> 8.8us) RRPOINTER = SOC3、SCAN -> SOC4
       SOC4 转换 (8.8 -> 9.7us) RRPOINTER = SOC4【相同的结束状态】

    完整循环顺序:SOC5、SOC6、SOC7、SOC0、SOC1、 SOC2、SOC3、SOC4
    结束时的 RRPOINTER:SOC4 <-锁定、每个周期重复

    您的结果仍然有效。  结果寄存器采用 SOC 索引 、而不是采用转换顺序索引。 无论哪个 SOC 先转换、SOC0 结果始终位于 ADCRESULTA0、ADCRESULTA1 中的 SOC1 中、依此类推。 如果您从其专用结果寄存器读取每个通道、则数据正确。

    仅当您需要知道最早采样哪个通道(例如,相位敏感或紧密同步采样)时、订购才很重要。

    您有三个选项:

    选项 1 — 接受行为:从正确的 ADCRESULT 寄存器读取结果。 无需更改代码。 如果采样时间订购对您的应用不重要、则建议使用。

    选项 2 — 使用高优先级 SOC (ADCPRICTL)【如果顺序很重要,建议使用】: 设置 SOCPRIORITY = 4。 SOC0-SOC3 变为高优先级、并且始终在循环 SOC (SOC5-SOC7) 之前转换、无论 RRPOINTER 状态如何都是如此。

       AdcaRegs.ADCPRICTL.bit.SOCPRIORITY = 4;// SOC0-3 高优先级

    这样可保证 SOC0->SOC1->SOC2->SOC3 始终在 Event1 之后首先运行、然后 SOC5->SOC6->SOC7 以循环顺序跟随。

    选项 3 — 对 SOC7 以上的 Event2 SOC 重新编号:将 SOC4 通道重新分配到 SOC8 或更高版本。 SOC8 绕回到 SOC0 之后的 RRPOINTER、因此 Event1 仲裁自然从 SOC0 开始。  无需更改 ADCPRICTL。

    如果您还有其他问题、请告诉我。

    此致、

    Joseph

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

    您好、 Joseph:

    感谢您的详细分析和建议,我认为它可以解决我的问题。 谢谢!

    最好 (&G

    Lucas