器件型号: MSPM0G3507
您好支持团队、
我在通过 DMA (FIFO_EN) 的重复序列模式下使用 ADC。
转换由 PWM 计时器触发。 我想在运行时更改不同 CCx 事件之间的触发事件、但当我在运行时更改 ADC 触发事件时、会遇到 ADC 上溢/下溢中断。
您能否提及执行此过渡的正确平滑序列?
此致、
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
您好支持团队、
我在通过 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 和切换事件。
至少需要手动停止 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 中设置的采样时间。
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);
我是否需要停止 PWM 而不仅仅是事件?
只需再避免使用 PWM 触发 ADC、通常只需停止 PWM 的计数器就可以了。
如何检查当前是否正在进行转换? 正如我提到的、一旦在启动过程中启用转换、就会始终设置 BUSY 标志、即使所有触发事件都被禁用也不会清除该标志。
忙碌标志。
但根据您的反馈、它不应该。
最大 ADC 转换时间应在 5us 以内(实际上 ADC1 转换时间约为 2.7us)、ADC 有足够的时间完成转换。