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.

[参考译文] MSPM0G3507:在运行时更改 ADC 计时器触发事件

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580454/mspm0g3507-change-adc-timer-trigger-event-in-runtime

器件型号: MSPM0G3507

您好支持团队、

我在通过 DMA (FIFO_EN) 的重复序列模式下使用 ADC。

转换由 PWM 计时器触发。 我想在运行时更改不同 CCx 事件之间的触发事件、但当我在运行时更改 ADC 触发事件时、会遇到 ADC 上溢/下溢中断。

您能否提及执行此过渡的正确平滑序列?

此致、

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

    以下是我用于在 COMP 和 GPIO 之间切换事件的事件切换序列:

    禁用所有事件、然后切换、再启用所有事件。

                    /**
                     * Strictly forbidden to modify the switching code sequence below.
                     * Or will cause the Event switching to fail.
                     * 1. Close all Event channel by disable and set event = 0.
                     * 2. Switch GPION and GPIOP's event line.
                     * 3. Recovery all event channel
                     */
                    DL_COMP_disableEvent(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));
                    DL_TimerG_disableEvent(DEADBAND_INST, DL_TIMERG_EVENT_ROUTE_1, (DL_TIMERG_EVENT_CC0_DN_EVENT));
                    DL_COMP_setPublisherChanID(COMP_0_INST, 0);
                    DL_TimerG_setSubscriberChanID(DEADBAND_INST, DL_TIMER_SUBSCRIBER_INDEX_0, 0);
                    DL_TimerG_setPublisherChanID(DEADBAND_INST, DL_TIMERG_PUBLISHER_INDEX_0, 0);
                    DL_GPIO_setSubscriberChanID(GPIO_PWM_PORT, DL_GPIO_SUBSCRIBER_INDEX_1, 0);
                    DL_GPIO_setSubscriberChanID(GPIO_PWM_PORT, DL_GPIO_SUBSCRIBER_INDEX_0, 0);
                    DL_GPIO_configSubscriber(GPIO_PWM_PORT,
                                             DL_GPIO_SUBSCRIBER_INDEX_0,
                                             DL_GPIO_SUBSCRIBER_OUT_POLICY_SET,
                                             DL_GPIO_SUBSCRIBER0_PIN_12);
                    DL_GPIO_setSubscriberChanID(GPIO_PWM_PORT,
                                                DL_GPIO_SUBSCRIBER_INDEX_0,
                                                GPIOA_EVENT_SUBSCRIBER_1_CHANNEL);
                    DL_GPIO_configSubscriber(GPIO_PWM_PORT,
                                             DL_GPIO_SUBSCRIBER_INDEX_1,
                                             DL_GPIO_SUBSCRIBER_OUT_POLICY_CLEAR,
                                             DL_GPIO_SUBSCRIBER1_PIN_28);
                    DL_GPIO_setSubscriberChanID(GPIO_PWM_PORT,
                                                DL_GPIO_SUBSCRIBER_INDEX_1,
                                                GPIOA_EVENT_SUBSCRIBER_0_CHANNEL);
                    DL_TimerG_setPublisherChanID(DEADBAND_INST, DL_TIMERG_PUBLISHER_INDEX_0, DEADBAND_INST_PUB_0_CH);
                    DL_TimerG_setSubscriberChanID(DEADBAND_INST, DL_TIMER_SUBSCRIBER_INDEX_0, DEADBAND_INST_SUB_0_CH);
                    DL_COMP_setPublisherChanID(COMP_0_INST, COMP_0_INST_PUB_CH);
                    DL_TimerG_enableEvent(DEADBAND_INST, DL_TIMERG_EVENT_ROUTE_1, (DL_TIMERG_EVENT_CC0_DN_EVENT));
                    DL_COMP_enableEvent(COMP_0_INST, (DL_COMP_EVENT_OUTPUT_EDGE));

    您能提及执行此转换的正确平滑序列吗?

    至少需要手动停止 ADC、然后切换事件、然后启用触发源。

    或者、如果您不想禁用 ADC、则需要找到 ADC 转换完成的时序、然后禁用 ADC 和切换事件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“571933" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580454/mspm0g3507-change-adc-timer-trigger-event-in-runtime/6088760

    至少需要手动停止 ADC、然后切换事件、然后启用触发源。

    或者、如果您不想禁用 ADC、则需要找到 ADC 转换完成的时序、然后禁用 ADC 和切换事件。

    [/报价]

    如何检测 ADC 已完成、我看到一旦启用 ADC、BUSY 标志就始终为真。

    我已经尝试了以下方法、但仍然会溢出。

    		DL_TimerA_disableEvent(PWM_0_INST, DL_TIMERG_EVENT_ROUTE_1, (ALL_EVENTS));
    		DL_TimerA_setPublisherChanID(PWM_0_INST,DL_TIMERA_PUBLISHER_INDEX_0, 0);
    
    		DL_ADC12_setPublisherChanID(ADC12_1_INST,0);
    		DL_ADC12_setSubscriberChanID(ADC12_0_INST,0);
    		DL_ADC12_setSubscriberChanID(ADC12_1_INST,0);
    
    		DL_ADC12_setSubscriberChanID(ADC12_0_INST,ADC12_0_INST_SUB_CH);
    		DL_ADC12_setSubscriberChanID(ADC12_1_INST,ADC12_1_INST_SUB_CH);
    		DL_ADC12_setPublisherChanID(ADC12_1_INST,ADC12_1_INST_PUB_CH);
    
    		DL_TimerA_setPublisherChanID(PWM_0_INST,DL_TIMERA_PUBLISHER_INDEX_0, PWM_0_INST_PUB_0_CH);
    		
    		DL_TimerA_enableEvent(PWM_0_INST, DL_TIMERA_EVENT_ROUTE_1, (DL_TIMERA_EVENT_CCx_UP_EVENT));

    All_Events 为 0xFFFFFFFF

    此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将 ADC 用在重复序列模式和 DMA (FIFO_EN) 中。

    在重复模式下、除非您手动停止和禁用转换、否则 ADC 不会停止。

    或者、如果您使用事件触发重复模式、则需要停止事件源、然后等待转换完成(内存 RIS 设置)、这会更加优雅。

    您甚至可以直接以暴力方式停止 ADC、并等待 BUSY 位清除。

    但请注意、在开始转换后、BUSY 位需要设置 14 个 ULPCLK、然后转换完成后、BUSY 清零。

    ADC 转换时间:12 位模式完成转换大约需要 200ns、+在 syscfg 中设置的采样时间。

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

    那么使用上述设置有哪些选项呢?

    ADC 序列重复模式+ DMA、由 TIMA CCx 向上事件触发、如何在这些事件之间切换而不出现过冲/下溢错误?

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

    首先停止计时器、然后等待 ADC BUSY = 0、DMA 将读取 ADC 结果、然后切换事件。

    这将是我的计划。

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

    -禁用/启用转换由于某种原因不会清除 BUSY 标志(SW 卡在这个 while 循环中)。

    -另外、如果忽略 BUSY 状态、除了 禁用/重新启用 ADC 转换引起的延迟外 、我可以看到 重新启用 ADC/事件后出现下溢/上溢事件、这是不知道为什么的。

    那么、您还有其他选择吗?

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

    您使用哪种 ADC 结果读取函数?

    通常、如果 ADC 转换正在运行、则在转换完成时等待相应的 CPU_INT_RIS 位、然后读取 ADC 结果。

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

    我正在使用 DMA、因此只需在接收到 DMA_DONE ADC 中断后从 RAM 缓冲器中读取数据

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

    您可以与我共享您的 syscfg 吗? ADC 事件的详细配置。

    最好告诉我如何使用带有事件触发器的 ADC、计时器、DMA。

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

    当然、但我们如何通过电子邮件或其他方式将其移至? 不确定我可以在这里分享这些数据。

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

    没问题。

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

    似乎您的功能是一个 PWM 触发器、转换的 ADC 通道序列、然后触发 DMA 完成。

    停止 PWM

    如果 ADC 正在转换、

      然后等待 ADC0 和 ADC1 DMA 都完成

    然后切换事件

    这不奏效?

    另一个问题:

    启用 PWM 通道 1、2 和 3。

    但启用 PWM 事件 CC0 和 CC1、

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

    我是否需要停止 PWM 而不仅仅是停止事件?

    [引述 userid=“571933" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580454/mspm0g3507-change-adc-timer-trigger-event-in-runtime/6101668

    如果 ADC 正在转换、

      然后等待 ADC0 和 ADC1 DMA 都完成

    [/报价]

    如何检查转换当前是否正在进行? 正如我提到的、一旦在启动过程中启用转换、就会始终设置 BUSY 标志、即使所有触发事件都被禁用、也不会清除该标志。

    [引述 userid=“571933" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1580454/mspm0g3507-change-adc-timer-trigger-event-in-runtime/6101668

    另一个问题:

    启用 PWM 通道 1、2 和 3。

    但启用 PWM 事件 CC0 和 CC1、

    [/报价]

    CC0 只是错、因为未使用、它已在 syscfg 中灰显、这是添加额外的通道 I 设置为固定触发源、并在运行时更改了其 PWM 值、以避免更改  提到的 ADC 触发源问题。

    在 1、2、3 之间更改触发源由软件不在 syscfg 中完成:

    DL_TimerA_disableEvent (PWM_0_INST、DL_TIMERA_EVENT_ROUTE_1、0xFFFFFFFF);

    DL_TimerA_enableEvent (PWM_0_INST、DL_TIMERA_EVENT_ROUTE_1、DL_TIMERA_EVENT_CCX_UP_EVENT);   其中 x 为{1、2、3}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是否需要停止 PWM 而不仅仅是事件?

    只需再避免使用 PWM 触发 ADC、通常只需停止 PWM 的计数器就可以了。

    如何检查当前是否正在进行转换? 正如我提到的、一旦在启动过程中启用转换、就会始终设置 BUSY 标志、即使所有触发事件都被禁用也不会清除该标志。

    忙碌标志。

    但根据您的反馈、它不应该。

    最大 ADC 转换时间应在 5us 以内(实际上 ADC1 转换时间约为 2.7us)、ADC 有足够的时间完成转换。