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.
您好!
对于 ADC、我必须使用三种不同的采样频率、分别为 fs1 (200kHz)、fs2 (50kHz)和 fs3 (1KHz)。 频率必须彼此具有固定的相位关系、以确保我始终获得所有 SOC 的等距和采样 I DO 配置所有 ADC 的 I use。 下面的示波器截图是从控制卡获取的。 在此示例中、我使用 ePWM0为 ADC 的 SOCA 触发器和 SOCB 触发器创建两个触发器。 源是完全相同的 ePWMx。 但是、对于 SOCB-Trigger、我将触发器数除以4、得到 fs2等于50 KHz。
问:如何通过组合另一个 ePWM 单元(例如 ePWM1)使 FS3 (1KHz)? 我尝试将 ePWM0与 ePWM1同步。 但到目前为止还没有运气。 此外、很难验证、因为此时在控制卡上、我只能探测 GPIO-Pin R3。 在示波器屏幕截图上、fs1以蓝色显示。
示波器屏幕截图上的图例如下:
-通道1 (黄色)是来自函数发生器的10KHz 正弦波
-通道2 (洋红色)是控制卡上的 DAC 输出(每个 DMA 通道)由在 ADC0通道0上采集的样本每 fs2 (50kHz)加速
-通道3 (蓝色)是 SOCA 触发器、引出至控制卡上的引脚 R3。
我们可以看到、正如我们预期的那样、两个触发器(fs1和 fs2)是相位对齐的。 现在、一个好主意和一点帮助也需要使 FS3相位对齐。 请提供任何帮助。
Markus
您好!
我将对此进行研究、并很快与您联系。
此致、
弗兰克
Markus、您好!
[引用 userid="3843" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1126075/am2634-epwm2-sync-in-sync-out-option-how-does-it-need-to-be-configured ]I 尝试将 ePWM0与 ePWM1同步。 但到目前为止还没有运气。 [/报价]有关 ePWM 同步的详细信息、请参阅 AM263x TRM (https://www.ti.com/lit/pdf/spruj17):)
MCU+SDK 提供了使用 SysConfig 或 API 函数配置 EPWM 同步的方法。
在 SysConfig ePWM 配置中、请参阅以下 ePWM 时基选项:
有关 SDK API 函数、请参阅:
我看不到使用 ePWM 同步和 SOCA/B 实现这一目标的简单方法
如果 ePWMx 与 EPWM0同步、它将在 SyncI 事件上将 TBPHS 加载到 TBCTR 中。 这会将 ePWMx 周期与 EPWM0周期关联。 因此、ePWMx 周期内的任何事件都不能用于生成 SOCA/B、其频率为 EPWM0 SOCA 的1/20。
ePWMx SOCA 输出生成可被预分频多达15个(请见 TRM、《ePWM 事件触发子模块的操作概述》、7.4.5.11.1)、但是这对于 EPWM0 SOCA 的1/200不足以进行分频。
我已将一些在这些主题上拥有更多专业知识的同事圈出来、以防他们有更多想法。
此致、
弗兰克
您好、Frank、
一个简单的示例显示了 ePWM 单元之间的同步输入同步输出选项的工作方式会有所帮助。 我确实检查了"ti_drivers_open_close"部分中生成的代码。 我使用 ePWM1作为 FS3 1KHz 信号。 我想使用该事件重新同步生成200kHz SOCA 信号和50kHz SOCB 信号的 ePWM0。
根据 TRM 第409页的图7-109、这应该可以正常工作。 生成的 c 代码执行以下操作:
(笑声) ePWM1...
ePWM_enableSyncOutPulseSource (CONFIG_EPWM1_BASE_ADDR、ePWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
ePWM0...
ePWM_setSyncInPulseSource (CONFIG_EPWM0_BASE_ADDR、ePWM_SYNC_IN_PULSE_SRC_SYNCOUT_EPWM1);
此外、我还将所有 SOCx 映射到输出引脚 GPIO-Pin-R3、以便对"触发器"进行示波器探测。 但是、我会感觉 ePWM0没有同步输入功能、这与 TRM 中图7-109所示的方式是相同的。
CH1 (绿色)是1KHz 输入正弦波3Vpp
CH2 (洋红色)是 DAC 输出。 ADC0每4个200kHz SOCA 触发一次、从而产生一个50KHz 的触发信号。 与之前一样、来自 ePWM0的这两个触发器是相位对齐的。
CH3 (蓝色)显示200KHz 触发器。 从 ePWM1发出的1KHz 信号在2个连续的200kHz 触发器之间突然出现。 但它没有影响。 我所期望的是根据 TRM 中的图7-109重新加载。
对此有任何意见吗? 是否有一个使用 AM2634-CC 来演示同步输入同步输出功能的示例?
谢谢
Markus
您好、Markus、
感谢您在这里的耐心等待。 我相信 AM263x 器件中不提供同步输入到同步输出连接选项。 我正在我们的设计和软件专家中进行循环、以确认并决定是否有其他方法可用于同步这3个 ePWM 信号。
我还想让您知道与 AM263x 控制卡兼容的 TMDSHSECDOCK。 控制卡集线站提供对其余大部分引脚的访问、包括额外的 GPIO 信号。
https://www.ti.com/tool/TMDSHSECDOCK
此致、
Zackary Fleenor
您好、Zackary、
我会有与 Markus 相同的问题、您能否确认 AM263x 器件上确实没有此问题?
谢谢你。
BR、Nicolas
Markus、Nicolas、
我有几个解决此问题的解决方案。 今天稍后我将分享详细信息。
此致、
弗兰克
Markus、您好!
很抱歉耽误你的回答。
我有一个示例、其中提供了您针对用例所描述的行为:频率为 fs1 (200kHz)、频率为 fs2 (50kHz)的同步 ADC SOC 事件和具有固定相位关系的 FS3 (1kHz)。
此示例使用 AM263x MCU+SDK 08.03.01.06并在 AM263x CC (https://www.ti.com/tool/TMDSCNCD263)+ HSECDOCK (https://www.ti.com/tool/TMDSHSECDOCK)上运行。
此示例是 SDK ePWM HR 占空比示例的修改版本: https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/08_03_01_06/exports/docs/api_guide_am263x/EXAMPLES_DRIVERS_EPWM_HR_DUTY_CYCLE.html
首先、我想说、可以通过控制 SS XBAR 将 ePWM SOCA 和 SOCB 信号路由到可以在 HSECDOCK 上观察到的引脚。 我使用这些 XBAR 连接将以下信号路由到 AM263x 引脚和 HSECDOCK:
虽然我在这个示例中不使用这个 XBAR 配置、但是也可以通过控制 SS XBAR 路由 ePWM SYNCO 信号。 例如、EPWM1 SYNCOUT 信号可使用 XBAR 进行路由、如下所示:
该示例涉及通过写入 CONTROLSS_CTRL_ePWM_CLKSYNC 来同时启用 EPWM0和 EPWM1 TBCTR。 该寄存器包含每个 EPWM 实例的 ETPWM 时钟同步、其中每个位的位置对应一个 EPWM 实例。 如果两个 EPWM 的 TBCTR 同时启用、则 ePWM TBCTR 相位对齐。 因此、来自每个 ePWM 的 SOC 信号也会对齐。
下面是 EPWM0/1 SOC 信号的逻辑分析仪捕获、其所需频率处于不同的缩放级别。
EPWM0 SOCA、SOCB 和 EPWM1 SOCA 信号保持同步、从 EPWM0 SOCA/SOCB 的上升沿和 EPWM1 SOCA 的上升沿算起、延迟仅为20 ns。
我在下面的 zip 文件中附加了完整的 CCS 项目和源代码。
该示例有一些注意事项:
1) 1)写入 CONTROLSS_CTRL_ePWM_CLKSYNC
/* finally we initialize all peripheral drivers */ /* EPWM */ { /* Enable time base clock for the selected ePWM */ SOC_setEpwmTbClk(0, TRUE); SOC_setEpwmGroup(0, 0); SOC_setEpwmTbClk(1, TRUE); SOC_setEpwmGroup(1, 0); }
2) 2)控制 SS OUTPUTXBAR 配置
AM263x MCU+SDK 08.03 (MCUSDK-7342)中存在一个错误、该错误仅允许从 SysConfig 配置单个 OUTPUTXBAR。 我使用 SysConfig 配置了 OUTPUTXBAR1、但为了配置 OUTPUTXBAR2、3、4 (和关联的引脚多路复用器)、我必须向 EPWM_hr_Duty_cycle_main ()添加代码。 此错误将在 SDK 版本08.04中修复。
我正在研究另一个使用 EPWM1 SYNCO 到 EPWM0 SYNCI 机制的示例。 我计划尽快完成、并在完成后与您分享。
此致、
弗兰克
/cfs-file/__key/communityserver-discussions-components-files/908/epwm_5F00_init.c.xdt
您好、Frank、
这听起来不错。 我将在我的设置中进行设置、并告诉您结果。
BR
Markus
Markus、您好!
我有第二个使用 ePWM SYNCO - SYNCI 功能的示例。 该示例提供了您针对用例所描述的行为。 该示例使用与第一个示例相同的硬件和 SDK。
这是 ePWM 配置的简要概述。
EPWM0
EPWM1
我在下面的 zip 文件中附加了完整的 CCS 项目和源代码。
运行该示例时、请确保将更改从示例1恢复到 ePWM_init.c.xdt。
我对此示例有一个担忧。 对于 SOCB 触发器、SYNCI 事件用于清零事件计数器并使事件计数器递增(通过在 SYNC 上 TBCNT 变为零间接实现)。 因此、在事件计数器清零和递增之间可能存在竞态条件。 我正在开发第三个示例、以避免任何可能的比赛情况。 完成后、我将与您分享。
此致、
弗兰克
在第一个 EPWM1 SYNCOUT 处捕获逻辑分析仪
EPWM0 SOCA、B 和 EPWM1 SOCB 的逻辑分析仪捕捉
您好、Frank、
我在我的背景下实施了您的建议1、其中包括 ADC、DAC 和一个 EDMA 通道。 它似乎起作用。 但是、例如、如果我在调试器环境中重新启动应用程序、我确实会获得 FS3相对于 fs1和 fs2的相位跳转。
我需要按下控制卡上的复位按钮、以摆脱这种相移。 复位后、配置始终有效。 我第二次或更多地得到相移。
对于您建议的解决方案的第一版、这是事实、其中 ePWM 单元不会相互同步、但通过对您提到的寄存器进行原子写入来启用时钟。
因此、需要类似于"设置所有 ePWM 单元"的东西。
BR
Markus
一切之上的示波器快照是良好的、并且处于相位。 复位后。
黄色(Ch1)表示 DAC 输出。 输入是 ADC0_AIN0上的5kHz 正弦波
在这种情况下、ADC 触发信号是以蓝色(Ch3)显示的50 KHz fs2信号
CH2是 fs1 200 KHz 信号
CH4 (绿色)为 FS3。 到目前为止一切都很好。
通过调试器重新加载映像 A 相跳转结果。 需要进一步调查为什么会发生这种情况...
1KHz 触发器 FS3与之前的相位位置不同...
Markus、您好!
您是否尝试了示例2以查看它是否显示了您观察到的问题?
我开发了第三个示例、如示例2、使用 ePWM SYNCO - SYNCI 功能。
下面简要概述了 ePWM 配置:
EPWM0
EPWM1
与示例2不同、我在 EPWM0事件触发 SOCB 脉冲发生器中看不到可能的硬件竞态条件。 SYNCI 事件由 EPWM1 TBCTR=CMPC 驱动、而事件计数器增量由 EPWM0 TBCTR=0驱动。
我在下面的 zip 文件中附加了完整的 CCS 项目和源代码。
我尝试暂停(Alt-F8)、复位(Ctrl+Shift+R)和恢复 CPU (F8)、PWM 波形看起来正确。 我还尝试了停止(Alt-F8)和重新启动(Run->Restart),PWM 波形看起来也是正确的。
此致、
弗兰克
在第一个 EPWM1 SYNCOUT 处捕获逻辑分析仪
EPWM0 SOCA、B 和 EPWM1 SOCB 的逻辑分析仪捕捉
您好、Frank、
非常感谢您的建议。 许多东西需要测试和检查。 目前、我确实使用了略微修改的版本#1。 我的版本使用3个 ePWM 单元、而不是我们之前讨论的两个。 我这么做的原因是我们在重新启动时看到的相位跳转。 每次在重新启动应用程序时不涉及硬件重置时、相位对齐似乎不能保证。 仍然是我不知道的根本原因。 可能是任何东西。
为了消除这种情况、我不再使用 EPWM0_SOCB 触发器。 我仅使用*_SOCA 触发器来触发来自 ePWM0、1和2的 fs1、fs2和 fs3。
在向 ADC 发出实际触发信号之前、之前的触发 EPWM0_SOCB 确实用于对 ADC 进行4分频。 对于我来说、当您开始停止应用#1时、处理四分频的内部计数器看起来不会被重置。 使用一个额外的 ePWM (32个中的3个)可以解决这个问题、因为我不需要除以1分频...没有任何相位跳转、它一直有效。
BR
Markus
P.S. 我将测试#3。 这可能需要一些时间。 现在、我们可以关闭该线程。 谢谢你。