主题中讨论的其他器件:UCD3138、
大家好、
在我的应用中、有一个频率约为110kHz 的 DPWM。 还有5个 ADC 信号需要持续测量。 我现在的问题是、ADC 结果将受 DPWM 信号的影响、我的应用将无法稳定工作!
在数据表中、我发现可以同步一个完整的序列。 但我每个 DPWM 周期需要一个采样、并以 DPWM 频率逐步进行定序! 是否有办法以这种方式将 ADC 采样与 DPWM 频率同步?
提前感谢!
此致、
Andy
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.
大家好、
在我的应用中、有一个频率约为110kHz 的 DPWM。 还有5个 ADC 信号需要持续测量。 我现在的问题是、ADC 结果将受 DPWM 信号的影响、我的应用将无法稳定工作!
在数据表中、我发现可以同步一个完整的序列。 但我每个 DPWM 周期需要一个采样、并以 DPWM 频率逐步进行定序! 是否有办法以这种方式将 ADC 采样与 DPWM 频率同步?
提前感谢!
此致、
Andy
应用是什么? 这是 PFC 吗?
为何需要将测量交流电与开关频率同步? 您是否尝试使采样 远离开关噪声?
我想测量 在110KHz 开关周期内变化的几个信号、并且希望在开关周期内的确切位置对这些信号进行采样。
如果这些是您要测量的低频交流信号、并且每200us 只需要它们、那么情况就会非常不同且更容易解决。
要将 此类 ADC 采样与 DPWM 同步、您至少有两个选项:
1) 1)使用连接到 DPWM 边沿的 ADC 外部触发引脚在两者之间同步。
2) 2)将快速中断连接到 DPWM 周期结束、因此每隔8 个开关周期就有一个中断。 在每73us 发生一次中断时、您会触发单个 ADC 测量并通过软件控制您的测量序列。 并且、应根据经验调整 ISR 内的 ADC 触发位置。
此致、
感谢您的建议。
您是对的:应用是 PFC、我希望使开关噪声远离采样。
首先、我们通过使用快速中断拒绝了处理、因为我们避开了额外的处理负载(由于额外的运行时间)。 我们担心我们的基准时间会受到太大的影响。
但我们考虑了与您建议的类似的想法。 但是、我想确保它实际上是唯一的同步方式、并且我没有忽略数据表中的某些内容。
我们使用 ADC 的外部触发机制、但这里的触发选择具有 DPWMA/B 低分辨率边沿。
更多问题:
如果 DPWM 被禁用、DPWMA / B 低分辨率边沿是否也会触发? 可能不是因为 DPWM 计时器保持不变。 是这样吗?
如何减少 ADC 中断(例如、您建议的每8次)?
此致、
Andy
如果禁用 DPWM、则禁用所有边沿。
每8个开关周期的中断与 ADC 中断无关、而是与 DPWM 中断相关。
中断配置可通过以下方式进行设置:
Dpwm0Regs.DPWMIT.bit.PRD_INT_SCALE = 4;//每 8个开关周期生成一个中断
Dpwm0Regs.DPWMIT.bit.PRD_INT_EN = 2;
write_reqmask (……。 | CIMINT_All_DPWM0 |………);
Write_firqpr (CIMINT_All_DPWM0 |…… );
此致、
Yitzhak
感谢您的帮助以及有关 DPWM 中断的提示。 遗憾的是、我们的应用中已经使用了外部触发引脚。 但我们尝试使用 HS 环路事件(EXT_TRIG_SEL = 2)来触发 ADC 采样器。
DPWM 中断按预期出现。 但 ADC 中断并不总是被触发。 这就是我们实现 IRQ 排序的方式。 在评估板上、此代码会产生 ADC 中断、但不会在我们的生产板上生成!
静态空 Dpwm1IrqHandler (void) { if (Dpwm1Regs.DPWMIT.ALL){} AdcRegs.ADCCTRL.bit.EXT_TRIG_DLY = 123; AdcRegs.ADCCTRL.bit.EXT_TRIG_EN = 1; } 静态空 AdcIrqHandlerMain (void) { IF (AdcRegs.ADCSTAT.bit.ADC_INT) { AdcRegs.ADCCTRL.bit.EXT_TRIG_EN = 0; raW_Value[idxSequence]= AdcRegs.ADCRESULT[0].bit.RESULT; idxSequence++; IF (idxSequence >= ADC_CH_COUNT) { idxSequence = 0; } AdcRegs.ADCSEQSEL0.bit.SEQ0 = sequence[idxSequence]; } }
你有线索吗?
在两个电路板上、我们都使用 UCD3138A。 ADC_INT 也不会被置位。 轮询 ADC_INT 和 ADC IRQ 处理没有区别!
似乎、通过 DPWM 事件(EXT_TRIG_SEL = 2或3)触发 ADC 在控制器中工作不正确。 但是、我们可能遇到了中断的时序问题。
DPWM IRQ 应开始对 ADC 序列进行采样。 这个序列由 ADC IRQ 中的软件处理。 因为 CIM 只能处理一个中断:当第二个快速中断发生时、当第一个快速中断已经在其处理程序例程中时、会发生什么情况? 如何处理这种情况?