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.

[参考译文] TMDSCNCD28379D:如何正确设置 ADC?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1467619/tmdscncd28379d-how-to-adc-setup-properly

器件型号:TMDSCNCD28379D

工具/软件:

您好、

有人能帮助这个简单的问题,但我不清楚。 如果我的中断设置为 ADCD1、我是否需要在另一个 AdcxReg 下添加 EOC 信息和中断标志信息。 ****、如下所示 AdcbRegs.********* 、亮红灯?

AdcbRegs.ADCSOC0CTL.BIT.CHSEL = 0;

AdcbRegs.ADCSOC0CTL.BIT.ACQPS = 14;

AdcbRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;

AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;

AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;  

   

AdcdRegs.ADCSOC0CTL.BIT.CHSEL = 3;

AdcdRegs.ADCSOC0CTL.BIT.ACQPS = 14;

AdcdRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;         

AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;     

谢谢、

红梅湾

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

    如果所有 ADC 都来自同一个触发器、我同意您只需使用一个 ADC (在本例中为 D)中断、然后读取所有结果、因为所有 ADC 的时序都是一致的;例如、当上述 ADCD 完成时、也将完成 ADCB 转换。

    此致、

    马特

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

    尊敬的 Matt:

    非常感谢。 您可以回顾以下问题吗?

    在同一触发器下、ADCSOC0CLT 用于 ADC 转换、使用一个中断 ADCD1。 "这是好的。

    如果使用了其他 ADC 中断(例如 ADCB1 )、只需修改最后三行(如果使用了中断 ADCB1、则 AdcdRegs 替换为 AdcbRegs)、对吧?

    AdcbRegs.ADCSOC0CTL.BIT.CHSEL = 0;

    AdcbRegs.ADCSOC0CTL.BIT.ACQPS = 14;

    AdcbRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;    

    AdcdRegs.ADCSOC0CTL.BIT.CHSEL = 3;

    AdcdRegs.ADCSOC0CTL.BIT.ACQPS = 14;

    AdcdRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;        

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;  

    2.在不同的触发器中、ADCSOC0CLT 用于 ADC 转换、使用一个中断 ADCD1。  我必须添加蓝色线、对吧? 这种情况还需要做些什么?

    AdcbRegs.ADCSOC0CTL.BIT.CHSEL = 0;

    AdcbRegs.ADCSOC0CTL.BIT.ACQPS = 14;

    AdcbRegs.ADCSOC0CTL.BIT.TRIGSEL = 10;   

    AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;    

    AdcdRegs.ADCSOC0CTL.BIT.CHSEL = 3;

    AdcdRegs.ADCSOC0CTL.BIT.ACQPS = 14;

    AdcdRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;        

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;  

    3.在同一触发器中、使用不同的 ADCSOCxCLT 进行 ADC 转换、使用一个中断 ADCD1。 它适合以下设置、还是需要添加一些代码行(如上面的项目2)?

    AdcbRegs.ADCSOC10CTL.BIT.CHSEL = 0;

    AdcbRegs.ADCSOC10CTL.BIT.ACQPS = 14;

    AdcbRegs.ADCSOC10CTL.BIT.TRIGSEL = 12;    

    AdcdRegs.ADCSOC0CTL.BIT.CHSEL = 3;

    AdcdRegs.ADCSOC0CTL.BIT.ACQPS = 14;

    AdcdRegs.ADCSOC0CTL.BIT.TRIGSEL = 12;        

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;   

    4. ADCA、ADCB、ADCC 和 ADCD 是否同时进入 SOCx 转换并完成转换、直至最后一个 SOC15、然后触发中断? 如果我使用 SOC1至 SOC10、ADC 仍然会完成到 SOC15的转换吗?

    非常感谢、

    红梅湾

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果使用其他 ADC 中断(例如 ADCB1 )、则只需修改最后三行(如果使用中断 ADCB1、AdcdRegs 将替换为 AdcbRegs)、对吧?

    在 ADC 级别、这是正确的。  在 PIE (器件的中断硬件)、ADCINTD1和 ADCINTB1的外部具有不同的中断使能和矢量地址位置。  这也需要处理、只需完成所有步骤即可。

    2. 在不同触发条件下、ADCSOC0CLT 用于 ADC 转换、使用一个中断 ADCD1。  我必须添加蓝色线、对吧? 此案例还需要执行任何其他操作?

    正确(以及上述 PIE)

    3. 在同一触发器中、使用不同的 ADCSOCxCLT 进行 ADC 转换、使用一个中断 ADCD1。 它适合以下设置、还是需要添加一些代码行(如上面的项目2)?

    这也很好、即使 SOC10用于 ADCB、因为触发器是相同的(并且假设 ADCB 没有其他可能预先发送 SOC10的触发器)、这是可以的。  如果 ADCB 针对不同 SOC 有其他触发器、您可能需要考虑将其发送回 SOC0并将其置于高优先级模式、以便您知道当触发信号跨越多个通道时、这不会等待其他 SOC 循环完成。  同样、这是一个很大的假设、如果示例中这里显示了所有 SOC、这很好(因为轮询将立即发生 SOC10、假设没有其他触发器挂起 ADCB)

    4. ADCA、ADCB、ADCC 和 ADCD 是否同时进入 SOCx 转换并完成转换、直至到达最后一个 SOC15、然后触发中断? 如果我使用 SOC1至 SOC10、ADC 是否仍完成到 SOC15的转换?

    默认情况下、ADC 的所有通道都采用轮询类型方案。  因此、从复位开始、轮循逻辑中的"指针"将位于 SOC0。  现在、如果所有 SOC0-10同时触发、它将按数字顺序进行转换。  用户可将 INTSEL 配置为= 10、这样 ISR 将在发生 SOC10时触发(还能够等待转换完成或在采样时触发、以在 ADC 转换时吸收一些 ISR 代码分支周期)。

    INTSEL 确定哪个 SOC (或实际 EOC)触发 ISR。  例如、如果您知道对每个 ADC 结果进行一些需要时间的计算、则可以选择 INTSEL = 5或比 SOC10更早、以便您可以在后续通道上使用一些 ADC 转换时间来处理更早的通道、而不是等待所有11个通道都完成、然后启动 ISR。  这只是一个想法、重点是它可以很好地配置为您想要在系统中执行的操作。

    完成此操作后、指针将位于 SOC11;但如果 SOC0-10再次出现、则会首先发生 SOC 0、以此类推  因此、如果不使用 SOC、它们不需要任何 ADC 周期等   

    唯一需要注意的是 SOC 不在同一触发器上、即 SOC5处于与 SOC0-4;6-10不同的触发器上。  如果首先出现 SOC5、它会将 RR 指针保留在 SOC6、这样当另一组 SOC6-10触发时、SOC0-4将进行处理。  如果您保留 INTSEL = 10、则进入 ISR、可能导致 SOC0-4无法完成。

    所有这些都是重要的分组一样触发器相应.

    此致、
    Matthew

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

    尊敬的 Matt:

    非常感谢、这对我有很大帮助。

    我使用"step into"进入 ADC 函数、代码行的运行顺序以红色数字显示。 我想知道为什么它会随机来回运行、而不是按顺序运行、并且运行所需的总行数为3、但运行起来就像有5行代码一样。 这将需要比我想象的更多的时间来执行代码。 这是正常的吗?

       EALLOW;

        AdcaRegs.ADCSOC0CTL.BIT.CHSEL = 2;                      (1、3)        

        AdcaRegs.ADCSOC0CTL.BIT.ACQPS = 14;                    (4)         

        AdcaRegs.ADCSOC0CTL.BIT.TRIGSEL = 0x0D;           (2、5)        

        EDIS;

    再次感谢、

    红梅湾

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

    洪梅、

    您可能需要"View Disassembly"、并了解如何将 C 指令转换为 C28x 的 ASM。  这可能会解释跳转、或者至少显示 CCS 正确显示了跳转。

    如果调试是预定义的、您可能还需要在工程中看到"predefines"。  这增加了大量检查以确保模块选择有效、但可能会导致额外的代码开销、一旦您的设置正常运行、就不需要这些开销。  如果删除并重新编译、最好查看上述顺序是否仍然存在。

    此致、

    Matthew

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

    您好、Matthew、

    您是要在此处检查预定义吗?

    反汇编是自动生成的。 它可以在代码行和反汇编行之间跳转。 只有函数 main ()按顺序正常工作、但它不是在所有函数内按顺序运行。 如果我在函数中添加更多行、有时 CCS 会冻结、大多数情况下正常。 在我的工程中使用它会很危险。 我可以用它做什么?

    谢谢、

    红梅湾

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

    尊敬的 Matt:

    拆解是否不断变化? 例如、如今的 ADC 执行顺序如下所示、如"Disassembly"中所示。 如何正确排列?

    谢谢、

    红梅湾

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

    很抱歉、我错过了一行、结果没有变化、和以前一样。

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

    洪梅、
    我将把这个帖子重新分配给我们软件工具团队的某个人、看看他们是否可以更直接地回答 CCS 与 C 语句中代码的执行情况。

    此致、
    Matthew

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

    非常感谢!

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

    洪梅、

    对源代码行重新排序和代码"跳转"之类的最常见原因是优化的影响。

    https://dev.ti.com/tirex/explore/node?node=A__AEm7LJjS34iFPa5fpT7ttQ__ccs_devtools__FUz-xrs__LATEST

    您使用什么优化设置来构建应用程序?

    谢谢

    Ki

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

    尊敬的 Ki:

    它看起来像这样。 如何设置?

    谢谢、

    红梅湾

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

    是的、它设置为-02、这相当激进。

    请尝试关闭优化功能并查看问题是否消失:

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

    尊敬的 Ki:

    关闭后、它会忽略断点、只是保持连续运行。 如果我想进入断点的函数、我必须手动单步执行从开始到断点的所有操作、这是很长的路要走。 是的、我尝试进入一个功能、问题确实会消失。

    在设置断点之前、它可以直接进入断点、然后单步进入。 我不知道。 我认为这种变化不会导致这个问题。

    谢谢、

    红梅湾

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将其关闭后、它会忽略断点、只是保持连续运行。 [/报价]

    您是否尝试过清除和复位断点?

    如果是、断点未被触发、但您知道源行正在执行、请提供一个小型测试用例。

    谢谢

    Ki

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

    尊敬的 Ki:

    非常感谢您的帮助!

    一切正常!

    再次感谢您、祝您度过美好的一天!

    红梅

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

    您好、Matthew、

    您能帮我解决以下问题吗? 每个 ADC 模块都有4个 ADC 中断。 何时使用 ADCINTSEL1N2以及何时使用 ADCINTSEL3N4? PIE 中要设置什么中断、 ADCA1中断... ADCD3中断?

    如果只有 ADCD3物理用于 ADC、我是否可以使用 ADCA1中断、ADCD1中断或任何 ADC 中断、或者我必须使用 ADCD3中断?

    EALLOW;

       AdcdRegs.ADCSOC0CTL.BIT.CHSEL = 3;// SOC0将转换引脚 D3

       AdcdRegs.ADCSOC0CTL.BIT.ACQPS = SAH_TIME;

       AdcdRegs.ADCSOC0CTL.BIT.TRIGSEL = 0x0D;

    EDIS;

    //设置1

    EALLOW;

     AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;

     AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

     AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    EDIS;

    //或设置2.

    EALLOW;

     AdcdRegs.ADCINTSEL1N2.bit.INT2SEL = 0;

     AdcdRegs.ADCINTSEL1N2.bit.INT2E = 1;

     AdcdRegs.ADCINTFLGCLR.bit.ADCINT2 = 1;

    EDIS;

    //或设置3.

    EALLOW;

     AdcdRegs.ADCINTSEL3N4.bit.INT3SEL = 0;

     AdcdRegs.ADCINTSEL34.bit.INT3E = 1;

     AdcdRegs.ADCINTFLGCLR.bit.ADCINT3 = 1;

    EDIS;

    //或设置4.

    EALLOW;

     AdcdRegs.ADCINTSEL3N4.bit.INT4SEL = 0;

     AdcdRegs.ADCINTSEL34.bit.INT4E = 1;

     AdcdRegs.ADCINTFLGCLR.bit.ADCINT4 = 1;

    EDIS;

    // PIE 设置

    PieVectTable.ADCD1_INT =&adcd1_ISR;

    //或

    PieVectTable.ADCA1_INT =&adca1_ISR;

    //或

    PieVectTable.ADCD3_INT =&adcd3_ISR;

    非常感谢!

    红梅湾

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

    洪梅、

    很抱歉、这里耽误了你的时间、我出于某种原因错过了你的答复。

    中断是完全可定制的、因此任何 SOC 都可以用作任何 ISR 的触发源。  与转换 SOC 使用的 ADC 通道无关。   

    如果系统需要、我们提供了多个选项、但并非所有系统都需要所有 ISR。

    此致、

    Matthew

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

    谢谢马修!

    看来你回答得非常清楚、但很抱歉我仍然感到困惑。

    我使用 ADCD 的 EOC0进行 ADCINT1触发。 但我在 main()中使用中断 ADCA1_INT、 PieVectTable.ADCA1_INT =&adca1_ISR。 没有使用 ADCA1进行任何 ADC 转换。   

    我能否按如下方式进行设置、或者必须将其更改为 PieVectTable.ADCD1_INT =&adcd1_ISR?

    在 ADC 设置中、

    //中断的 SOC 触发标志结束

    EALLOW;

    AdcdRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// EOC0是 ADCINT1触发器

    AdcdRegs.ADCINTSEL1N2.bit.INT1E = 1;

    AdcdRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;

    EDIS;

    在 main ()中、

    PieVectTable.ADCA1_INT =&adca1_ISR。

    提前感谢您宝贵的时间和指导、

    红梅

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

    洪梅、

    我误解了您的问题;ADCA 只能触发 ADCAINT、ADCD 只能触发 ADCDINTS 等  我想您指的是 ADC 的本地 EOC 到 ADCINT 的自定义设置。  在 PIE 级别、如果您有 ADCD INT1、则只会进入 ADCD1_INT。

    此致、

    Matthew