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.

[参考译文] TMS320F28P650DK:ADC SOC EOC IRQ 生成问题。 应在 SOC 链中的特定 SOC EOC 之后进入 ISR。 相反、只有在对该 SOC 链中的所有 SOC 进行采样后才会进入 ISR。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1410960/tms320f28p650dk-problems-with-adc-soc-eoc-irq-generation-isr-should-be-entered-after-specific-soc-eocs-in-a-soc-chain-instead-isr-is-only-entered-after-all-socs-in-that-soc-chain-are-sampled

器件型号:TMS320F28P650DK
主题中讨论的其他器件:SysConfig

工具与软件:

您好!

我将轮盘分离为"SOC0至 SOC6":高初级(使用 SOC0-SOC5、未使用 SOC6 )和"SOC7至 SOC15":轮询低初级(使用 SOC7-SOC15、3倍大小3突发、冲洗重复)。

SOC0至 SOC5 ePWM1 ADCSOCA 事件触发、RoundRobin -bush (burstsize = 3)也 由同一个 ePWM1 ADCSOCA 事件触发。

生成4个 ADC IRQ:SOC1 EOC 时的 ADC INT1 (仅用于测试目的)、 SOC3 EOC 时的 ADC INT2 (仅用于测试目的)、 SOC5 EOC 时的 ADC INT3 (主要 感兴趣的 IRQ)、  

SOC15为 EOC 时的 ADC INT4 (仅用于测试目的)

对于我的问题:

Im 很难理解、因为我认为 IRQ:ADC INT1、 ADC INT2、ADC INT3 始终会提出、并且 在 SOC EOC 事件发生时始终执行我的 ISR。

调试应该会向我显示类似的内容。 下载+调试、按"开始"、ADC INT1发生、调用 ISR、命中断点、 内核停止、只有 ADCRESULT0和 ADCRESULT1的值不为0x0000、  

但调试似乎显示、此时我最终首次进入 ISR、所有值"SOC0至 SOC5"和"SOC7至 SOC9"均已 获取(ADCRESULT0 至 ADCRESULT5和 ADCRESULT7至 ADCRESULT9的值 不为0x0000)。

我想要什么:ePWM1 ADCSOCA 事件出现一个触发器 HighPrio-SOC 和 RR-Burst --> HighPrio-SOC 首先出现 --> SOC0到 SOC5被获取--> SOEOC IRQ 被生成(由 ISR 处理)--> RR-Burst SOC 被 获取(与 ISR 在后台执行并行、说实话、我真的不关心这么多)。 必须重要的一点是、Im 在 SOC5 EOC 发生后立即获取我的 ISR 调用。

但对我来说、看起来所有由同一事件触发的 SOC 都是先获取的、而不是调用 ISR。  

请有人向我解释发生了什么?

或者、我尝试使用中继器1 (也由 ePWM1 ADCSOCA 事件触发)来延迟降压块的触发、直到 采集所有高优先级 SOC。 在这种情况下、胸块由中继器1触发。

但遗憾的是、在 ADC bu 初始化  ADC_setBurstModeConfig ()-->  assert ((uint16_t) trigger &~(uint16_t) 0x1FU)== 0U 时、会得到一个断言。 初始化代码是 生成的 CCS Theia 1.4.1。 这里的问题是什么?

还有一个问题是、有一种更智能的方法来获得我需要的内容。 使用纯轮循 采集不起作用。 我的 SOC 总共有很多。 在实际工程中、每个 ADC 内核始终具有4个高优先级 SOC 和7到9个轮循 SOC。

此致、Martin

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

    尊敬的 Martin:

    看起来根据提供的快照、您的代码中只有一个 ISR 函数、即__interrupt void INT_myADC0_1_ISR ()、该函数仅映射到 ADCINT1 (INT_ADCA1)。  清除和确认其他 ISR 似乎正在该 ISR 例程中发生。  这可能是您没有看到预期结果的原因。

    您需要为每个 ISR INT_ADCA2、INT_ADCA3和 INT_ADCA4另外创建3个 ISR 函数、使用 Interrupt_register ()函数将这些额外的 ISR 映射/寄存到中断控制器、并使用 Interrupt_enable ()函数启用它们。  最后、取消清除和确认  INT_myADC0_1_ISR ()中的其他中断、并将其相应地传输到相应的 ISR。

    此致、

    Joseph

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

    尊敬的 Joseph:

    非常感谢您的答复。 实际上、 INT_myADC0_1_ISR ()被映射到 ADCINT1 (INT_ADCA1)、 ADCINT2 (INT_ADCA2)和 ADCINT3 (INT_ADCA3)。   不过、所有三个 IRQ 的一个 ISR 并不严格、所以 我就执行了你们的建议以便确定下来。

    遗憾的是、行为完全相同。 此时我在  按下 RUN (运行)后第一次输入 INT_myADC0_1_ISR ()(应该在 SOC1 EOC 之后输入)、所有其他 SOC (SOC2至 SOC5)和"SOC7至 SOC9")均已获取。

    简而言之、我对代码的期望是: ePWM1 ADCSOCA 事件 触发 HighPrio-SOC、而且 RR-Burst --> HighPrio-SOC 应该首先出现-->  获取 SOC0 -->获取 SOC1 --> 发出 SOEOC IRQ --> INT_myADC0_1_ISR ()被称为-->当我在寄存器中断开、且 所有寄存器中具有0x0以外的值。 他们没有。

    对我来说、似乎所有由 ePWM1 ADCSOCA 触发的 SOC 都将 首先被收购、 然后所有在 收购 SOC 时提出的 IRQ 都 将被处理、这似乎是不对的。

    我添加了所有相关配置、希望这对您有所帮助。 也许我忘了勾选一个方框。

    此外、在断点挂起时、是否有机会停止 ADC 内核。 其他控制器具有类似的东西:"在中断时停止 PWM/定时器"、可以借助函数、ASM 指令或寄存器进行配置。 可能 Im 被调试器欺骗了。 我的理论是、代码还行、但 ADC 内核不会停在断点处、并继续获取所有其他 SOC、此时 IDE 最终收到通知/更新所有结果都写入 ADC 结果寄存器。

    我希望你能帮我解决这个问题。

    此致、

    Martin

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

    尊敬的 Martin:

    好的、让我们检查一些 ADC 寄存器中的内容、看看会发生什么。  在"Register"视图中、您能否显示 AdcaRegs。 ADCINTOVF (ADC 溢出寄存器)如下所示:

    还显示一些外设中断寄存器、特别是 PieCtrlRegs。 PIEIER1和 PIEIER10并展开以显示各个字段、如下所示:

    在 ADC ISR 内设置断点会暂停转换并防止 ADC 结果寄存器的更新。

    此致、

    Joseph

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

    尊敬的 Joseph:

    在 ADC ISR 内设定一个断点将暂停转换并且防止 ADC 结果寄存器的更新。

    看起来更像、SOC 都是在调用第一个 ISR 之前被采集的。

    这里是您向我提问的屏幕截图。 再一次、 在(假设) SOC1 EOC 事件之后、在 ADCA_INT1_ISR INT_myADC0_1_ISR ()中按下"Run"后、程序是第一次保持的。

    请注意、我继续将整个程序从断点逐步执行到断点、但在任何  AdcaRegs 中都标为"1"。 ADCINTOVFS 寄存器从未出现。

    我希望你能看到一些我不会看到的东西。

    此致、

    Martin

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

    尊敬的 Martin:

    感谢您提供注册快照。  我能够根据寄存器内容获取所需的信息。  中断1-4映射是正确的、中断似乎根据标志被触发。  我还可以看到、SOC0映射到 ADC CH1、而 SOC1到 SOC5映射到 ADC CH0、SOC0-5的 TRIGSEL 为 ePWM。  SOC7-9由 SW (TRIGSEL=0)触发、通道分别映射到 CH0、CH1和 CH2。  只是想确认一下这样做的目的、即将物理通道连接到信号源。

    此致、

    Joseph

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

    尊敬的 Joseph:

    Im 使用 TI LauchPad 套件且其上装有 TMS320F28P650DK9。 使用的软件 Im 基于 TI 代码示例"adc_ex11_burst_mode_epwm"、因此得出了我的项目的名称。

    PWM 的配置方式如下:

    PWM 配置与"adc_ex11_BURST_MODE_EPWM"中的配置保持不变。 我对 ADC 器件进行了修改、目的是测试我预期的高 prio/rr 设置、作为我们即将开展的项目的概念验证。  

    回答您的问题:没有任何物理信号源连接到通道。 它就是 LauchPad 。 所有采样的 ADC 通道都是悬空的。 这可能是 问题吗?

    对于我的概念证明、我只想看看我的高基准/RR 设置是否 有效、以及控制器是否在一个可理解的问题中发挥作用。 在本例中、对我来说、SoC 通道映射 无关紧要。 我只想说明一下、值被采样、并且按照我想要的顺序对值进行采样和提出中断。

    高优先级:"SOC0-5的 TRIGSEL 是 ePWM":  我的意思是、 TRIGSEL ePWM 触发 SOC0-5、ADC 首先采样 SOC0、 然后采样 SOC1、之后采样 SOC2、...  而 不是 SOC5。

    轮询:"SOC7-9的 TRIGSEL 为 SW (TRIGSEL=0)":我的目的、BURSTTRIGSEL 也是 ePWM、突发模式触发器覆盖   SOC7-9的 SW TRIGSEL。

    我希望我可以提供您需要的所有信息。

    此致

    Martin

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

    尊敬的 Martin:

    是的、这很可能就是问题所在。  我建议您为 SOC 分配物理通道、以便您观察转换后的值。  您可以尝试使用1.2V VDD 作为信号源并配置 VREFHI (作为内部或外部)、但还要注意是否连接跳线 M4 (在这种情况下、它配置为外部 VREF、移除 M4将是内部 VREF 模式)。  您可以连接的其他信号电平为 GND。  将1.2V 和 GND 作为可连接到 SOC 通道的信号源、与浮动通道中的不确定值相比、您应该能够具有更可预测的转换值。

    此致、

    Joseph

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

    尊敬的 Joseph:

    "我要你帮我!"

    但可悲的是,它没有影响。 器件/软件的行为与之前类似。 EOC 时无 IRQ、仅在需要所有 SOC 后调用第一个 ISR。

    我做了什么:

    -已连接(只进行硬接线、不使用额外的电阻器) GND 至 ADC_CH0、并已将1.2V VDD 连接至 ADC_CH4和  ADC_CH5  

    -拉 M4以确保使用内部 VREF

    -额外重新配置了.syscfg 文件中的 ASYSCTRL 以使用2.5V 的内部 VREF

    在.syscfg 文件中重新配置 ADC SOC ,如下所示:

     高优先级:SOC0 --> CH4 (VDD)、  SOC1 --> CH0 (GND)、  SOC2 --> CH4 (VDD)、  SOC3 --> CH0 ( GND)、SOC4  --> CH4 (VDD)、  SOC5 --> CH0 ( GND)

     LowPrio RR: SOC7 --> CHN5 (VDD)、 SOC8 --> CHN0 (GND)、   SOC9 --> CHN5 (VDD)、

                SOC10 ->CHN0 (GND)、   SOC11 ->CHN5 (VDD)、   SOC12 ->CHN0  (GND)、

                SOC13 ->CHN5 (VDD)、   SOC14 --> CHN0 (GND)、   SOC15 --> CHN5 (VDD)

    我得到的:

    合理的选择。 对于 SOC0、我得到0x0793h:=> 1939 ->(1939/4096 ~ 1.2V/2.5V)

    其他 SOC 显示了我配置的 VDD -> GND -> VDD ->...模式。

    我再次附上了所有寄存器屏幕截图。 我希望这能进一步帮助我们找到问题所在。

    (但乍一看、重新配置前后的寄存器值似乎相当)

    此致、

    Martin

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

    尊敬的 Martin:

    您是否可以将您生成的 adc_init()函数发送给我?  我想看看如何设置高优先级和低优先级转换以及如何设置突发模式的顺序。

    谢谢!

    Joseph

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

    尊敬的 Joseph:

    我附加了生成的 board.c 文件、 其中包含 adc_init ()。

    e2e.ti.com/.../5488.board.c

    此致、

    Martin

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

    Martin、您好!

    缺少一些依赖项、例如 ISR、由于代码是通过 SysConfig 自动生成的、因此我无法真正覆盖您所做的更改、因此我从 adc_ex11_burst_mode_epwm 示例开始、并通过 SysConfig 进行了以下更改、但步骤4除外、在 c 文件中手动添加 ISR 函数。  步骤如下:

    1.) 寄存器 PIE 中断处理程序

    • 添加中断4
    • 点击 Enable Interrupt on PIE

    2.) ADC INT 配置

    • 添加 ADCINT4中断
    • INT4 ADC 中断4
      • 点击 Enable ADC Interupt4
      • 中断4 SOC 源–添加源、根据高优先级 SoC 的配置方式从 SOC/EOC0选择到 SOC/EOC6

    3.) SoC 配置

    • 将 SOC0设置为 SOC6 (分配通道、SOC 触发器(在本例中为 EPWM1SOCA)和采样窗口

    4.) 在 adc_ex11_burst_mode_epwm.c 文件底部为高优先级转换添加 ISR:

    _interrupt 空洞 INT_myADC0_4_ISR ( 空洞 )

     

       //在此处添加代码以读取高优先级 SOC 结果值

       // adcAResult0 = ADC_readResult (ADCARESULT_BASE、ADC_SOC_NUMBER0);

       // adcAResult1 = ADC_readResult (ADCARESULT_BASE、ADC_SOC_Number1);

       

       ADC_clearInterruptStatus (ADCA_BASE、ADC_INT_Number4);

       interrupt_clearACKGroup (interrupt_ack_group10);

    }

    原始示例中的 ISR 处理 INT1至 INT3的轮询优先级。  附加的 ISR 处理高优先级转换并使用 INT4。  基本上、您可以在高优先级转换以及现有 adcAburstISR 内的轮询 ISR 中针对每次突发设置断点并对其进行单步执行。  我认为这就是你正在努力实现的目标。 我可以单步执行高优先级转换中的断点以及  adcAburstISR 内的各个突发、而不会出现任何问题。  请告诉我这是否对您有用。

    此致、

    Joseph

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

    尊敬的 Joseph:

    我根据  adc_ex11_BURST_MODE_EPWM 示例设置了一个新工程、然后根据用户的建议步骤1至4对其进行了相应地扩展。

    我没有再添加任何内容。 对于 HighPrimo I 使用的 SOC0至 SOC3、所有 SOC 都设置为 CH4、 所有 SOC 都由 ePWM1、ADCSOCA 触发、并对电压 VDD = 1.2V 进行采样(tsample = 15个周期)、以 VREF (intern)= 1.65V 作为基准。

    SOC7至 SOC 15使用旧的 VDD、GND、VDD 模式。

    很遗憾、我再次看到在 ADC_INT4 ISR 断开时收购了低 PRIO SOC7至 SOC9。 这应该不会发生、因为 应在 SOC3 EOC 后立即调用 ADC_INT4 ISR、并且 ADC0内核应在 ADC_INT4 ISR 断开时处于保持状态。   

    我再次强烈地感受到我的高 PRIO ISR (在本例中为 ADC_INT4 ISR)是在 SOC9 EOC 之后调用的。

    INTx1 Flag 在 PIEIFR1寄存器中发出这一事实进一步强化了该理论。

    为什么我如此热衷于让我的 ISR 不再延迟地被调用。

    在我们的项目中、ePWM1以100kHz 的频率运行、在中心对齐、上-下模式。 从 Z 到 Z = 10 µs 的时间、从 P 到 Z 的时间= 5 µs。 我们希望在最后一次以 P 位调用我们的控制器之前开始对重要(高优先级)值进行采样:因此、我们有5 µs 时间"采样并将 soc0转换为 soc3"、"处理我们的交流控制器"并"影子化我们的新 dutycycle "、直到 Z 到达。

    我们的一个 SOC 需要大约500ns:

    --> 4 (仅高基波) x 500 ns = 2 µs --> 5 µs - 2 µs = 3 µs (有足够的时间处理我们的 AC 控制器)

    --> 7 (高基波+ RR) x 500 ns = 3、5 µs --> 5 µs - 3、5 µs = 1、5 µs (没有足够的 时间处理我们的 AC 控制器)

    我想再次询问您、这种行为是否是 C2000 ADC 的典型行为。 也许我需要开始处理权变措施。

    请您提供此信息或更多信息吗?

    此致、

    Martin

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

    尊敬的 Martin:

    好的、让我来详细研究这个。  高优先级和轮询触发器都来自同一个 EPWMSOC、因此不确定这对优先级和 RR 有何影响。  此外、我还假设 SOCA 计数器触发器是 P 到 Z?

    此致、

    Joseph

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

    尊敬的 Joseph:

    向上/向下计数 EPWM 上的 P 事件是 SOCA 触发器、该触发器将启动高优先级 SOC 和 RR 突发。 您是对的。

    我们还需要在从 ePWM 到达 Z (更新事件)之前完成所有(采样+计算)。

    作为一种可能的权变措施、我们无论如何都会有一些 ePWM 同步。 我可以使用 ePWM1 SOCA 来按原样触发所有高优先级 SOC、并且可以与固定单元同步额外的(牺牲) ePWM、以便在 ePWM1  P 事件(ePWM1 SOCA)之后一个周期内生成额外的 SOCA 触发、从而触发所有 RR 突发。 对我来说、听起来有点刻意、但如果它能正常工作、就能正常工作。

    此致、

    Martin

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

    尊敬的 Martin:

    好的、下面是我通过示例发现的情况:如果高优先级和 RR 突发转换都由 EPWMSOCA 触发、我们将以高优先级和 RR 突发运行:

    第一个触发器:SOC 0–6、然后是 SOC 7、8、9

    第二个触发器:SOC 0-6、然后是 SOC 10、11、12

    第三个触发条件:SoC 0-6、然后是 SOC 13、14、15

    关于您的应用、您分享的最后一张图表现在向我明确了您要实现的目标。  您为3ph 电网交流电压转换和负载电流采样分配高优先级、而 RR 用于直流链路采样、风扇、温度+一些其他监控信号。   您可以做的或许是为 RR 分配另一个 ISR、并专门对每个 ISR 进行计算。  是否仅 RR 信号的计算/处理时间更短?  如果是这种情况、您也许可以按下图组织1个 ADC 的转换/ISR:

    另一种选择是提前设置 P、以便 ePWM SOC 触发更早发生、可能在 Z 初始化为0后计数为1us。  这将为100kHz PWM 周期的优先级 SOC 和 RR 提供足够的采样+计算时间(9us)。

    最后、我们可以回顾500ns 转换的推导过程。  这与转换模式、ADC 速度和输入网络的计划有关。  如果正确处理信号调节和缓冲、您应该能够获得最快的采样时间并进一步减少 SH+conversion 时间。

    此致、

    Joseph

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

    尊敬的 Joseph:

    很抱歉这么晚才回复。

    我想我找到了解决我的问题的方法。 感谢您的宝贵意见。

    高 PRIO SOC 每个周期2次、触发在例如 ePWM7 ADCSOCA 附近 (ETINTMIX = 0 ||周期)

    低 PRIO 突发 每个周期也出现2次、 触发间隔、例如 ePWM8 ADCSOCA (ETINTMIX = CMPA_INCREMENT || CMPA_递减)

    周期为10 µs、因此4个样本的时间窗口为2.5 µs、如果必须的话、我可以重新排列我的 SOC 块、我会有点喜欢它。 我想成功了。

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    最后还有一件事。

    另外我还发现、如果遇到调试器断点、ADC 内核实际上并不会停止。

    但至少中断会在我需要触发它的确切时刻发生。 n`t ,整个时间我有点追逐一个问题,这是真的存在.

    我想我在这里有证据:

    我构建一个新项目。

    ADCA 由 200 MHz 处的 SYSCLK 馈送、并在50 MHz (4分频器)下运行

    ADCA SOC0至 SCO3都是15个 SYSCLK 周期进行采样  

    ADCA SOC7至 SCO9都是15个 SYSCLK 周期进行采样  

    ePWM1也由  SYSCLK 馈电 并以200 MHz (时基时钟分频器和高速时钟分频器都为1)运行、因此 ePWM1 TBCTR 也兼作  SYSCYL 计数器

    ePWM1周期在1999、递增计数、仿真器停止后、计数器在下一次递增时停止

    ePWM1 CMPA 为1000

    ePWM1 ADCSOCA 由 CMPA_INUTRANT 触发、这会触发 ADCA SOC 0至3和 ADCA 突发  SOC 7至9

    ePWM1 CMPA_INULTING 还会触发 PWM 中断"INT_myEPWM1_ISR"

    ADCA SOC3 ECO 会触发 ADC 中断"INT_myADC0_1_ISR"

    ADCA SOC9 ECO 会触发 ADC 中断"INT_myADC0_2_ISR"

    与往常一样、当 IDE 向我显示"INT_myADC0_1_ISR"时、SOC7至 SOC9已进行采样和转换 。 n`t ADCA 内核未在刚好到达断点时停止。 内核继续以解析突发触发、然后仅在完成采样和转换的所有突发 SOC 之后才最终停止。

    我在 "INT_myEPWM1_ISR"中设置了一个断点。 ePWM1 TBCTR 的值(在事件 CMPA_IN递增 之后、在 ISR 中的断点处)为 0x3FBh ( 1019十进制 )

    ( 1019十进制 很遗憾、即使是1000个 CMPA 值也不是100%、但该值是合理的、因为一些 SYSCLK 周期在 CMPA_Incrementing 事件之后和进入 ISR 之前传递)

    我在 "INT_myADC0_1_ISR"中设置一个断点。  ePWM1 TBCTR 的值(在发生 ADCA SOC3 ECO 事件之后的 ISR 中的断点处)为 0x472h ( 1138十进制 )

    ( 1138十进制 - 1019十进制  等于的频率 119dec . 乍一看、这可能等于4倍30个 SYSCLK 周期、用于采样并将 SOC0转换为 SOC3)

    我在 "INT_myADC0_2_ISR"中设置一个断点。   ePWM1 TBCTR 的值(在   事件 ADCA SOC9 ECO 之后、在 ISR 中的断点处)为 0x546h ( 1350dec )

    ( 1350dec - 1138十进制  等于的频率 212dec . 乍一看、情况似乎有所不同、但 INT_myADC0_1_ISR 可从中获取 0x472h  最终目的 0x530h、  因此、  在进入此 ISR 之前、已超过3倍30个用于 SOC7采样和转换为 SOC9的 SYSCLK 周期)

     n´t 我来说、观察 ePWM1 TBCTR 值(等于 SYSCLK 周期)确认 ADCA 内核在中断时确实停止。 尤其是查看两者之间的差值   0x3FBh  ( 1019十进制 ) "INT_myEPWM1_ISR"(SOC 触发器)和  0x472h  ( 1138十进制 ) "INT_myADC0_1_ISR" (最终高电平 PRIO SOC EOC 触发)。

    有一个´s 有点奇怪。

    我早就告诉过你  1138十进制 -  1019十进制  等于的频率  119dec 相当于4乘以 30个 SYSCLK 周期、用于采样并将 SOC0转换为 SOC3。 这是可悲的n´t 累积!

    SOC0至 SOC4的 Tsample 全部配置为15个 SYSCLK 周期。 此外、ADCA 时钟分频器为4、这意味着 Tconvert 为41  个 SYSCLK 周期。 使用通道切换(2个 SYSCLK 周期)和向寄存器写入数据(2个 SYSCLK 周期)时、这些结果相加   每个 SOC 60个 SYSCLK 周期 . 看到我预期的差值 240dec 信号 119dec . 这意味着我的项目中需要 SOC 快速实现。 我n´t 和搜索,但无法找到我配置的任何不正确的东西。  

    您是否知道我做了什么错/发生了什么?

    此致。

    Martin

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

    尊敬的 Martin:

    您能检查一下 PERCLKDIVSEL 的值吗? 是否在寄存器视图中选择了 EPWMCLKDIV?  在进入 EPWM 之前、只需确保 SYSCLK 未预分频。  此外、检查 ePWM 时基的计数模式。  它是仅向上计数模式还是向上/向下计数?  在向上计数模式计数中、周期为时基周期计数(TBPRD)。  在向上/向下计数模式下、周期将是2*TBPRD。

    此致、

    Joseph

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

    尊敬的 Joseph:

    我想他们看起来很好。

    I`m 在纯向上计数模式下。  

    (只需检查:例如、对于任何 ePWM、基本配置都是200 MHz GO、时基时钟分频器设置为1、 高速时钟分频器设置为1

    ePWM 处于向上计数模式:1999时的 TBPRD 等于100kHz 时的 PWM、

    ePWM 处于向上/向下计数模式:  100kHz 时的 TBPRD 为999、也等于 PWM、 对吧?)

    此致 Martin

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

    尊敬的 Martin:

    时钟预分频器令人困惑 :"0"是1分频、"1"是2分频。  我们通常添加1以获得时钟预分频器的实际分频器。  在时基分频器和高速分频器之前、ePWM 似乎在100MHz 上计时。

     

    您可以在设置 ePWM 之前在 main 中添加以下代码:

     SYSCTL_setEPWMClockDivider (SYSCTL_EPWMCLK_DIV_1);

    给这一个镜头,让我知道。  如果这可行、我们必须检查时钟树工具、看看这一点为什么不明显。

    此致、

    Joseph

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

    尊敬的 Joseph:

    感谢您的建议。 它起作用了!

    "INT_myEPWM1_ISR"来自 ePWM1 TBCTR 1036dec  "INT_myADC0_1_ISR"来自 ePWM1 TBCTR 1272十进制 大约差值进行舍入 240dec

    这是时钟树工具。

    我添加了"SysCtl_setEPWMClockDivider (SysCtl_EPWMCLK_DIV_1);"并将其返回到100 MHz。 时钟树工具仍然位于 div 1 (在 reg 中应等于0)。

    此致 Martin

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

    尊敬的 Martin:

    很高兴知道这对你有用。  我来咨询时钟树工具人员、看看他们是否有什么可以推荐或需要修复的地方。

    此致、

    Joseph

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

    尊敬的 Joseph:

    我记得、当我创建一个新工程时、我手动将 EPWMCLKDIV 从/2设置为/1。

    现在、我再次创建了一个完整的新空项目。

    EPWMCLKDIV 默认为/2。 我手动将 EPWMCLKDIV 从/2再次设置为/1、并重新清理、重新生成、下载和调试。

    无影响(请参阅屏幕截图)   

    也许这可能是一个 Theia 的事情,希望这有助于。 ;-)

    有关 Info I´m ó n on Theia 1.5.0

    此致、

    Martin

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

    尊敬的 Martin:

    是的、这对于时钟树工具来说是有用的信息。  我会将这一反馈分享给团队。

    此致、

    Joseph

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

    尊敬的 Martin:

    能否检查一下是否可以访问时钟树工具中的这些屏幕和设置?

    这会将时钟设置为 EPWM 等于 SYSCLK。  请通过此更改告知我、您的代码是否通过 EPWM 时钟分频器进行了更新、并反馈给时钟树工具人员。

    此致、

    Joseph

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

    尊敬的 Joseph:

    这是我设置的内容:

    我分别选择了 SYSCLKDIVSEL 和 EPWMCLKDIV、并将它们设置为/1。

    已保存全部、已清理、重新编译、下载和调试。

    附加功能、此时钟来自:

    但没有任何效果。

    -------------------------------------------------------------------------------------------------------------------------------------------

    我还尝试了其他版本(修改后的 SYSCLKDIVSEL、 LINACLKDIV 和 LINBCLKDIV、

    已保存全部、已清理、重新编译、已下载和调试。)、结果如下:

    看起来、树配置工具中的配置(对我来说是这样)对代码生成没有影响。  

    此致 Martin

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

    尊敬的 Martin:

    感谢您观看本视频。  我将与我们的钟树工具专家分享这一点、以便更深入地了解可能发生的情况。

    此致、

    Joseph

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

    尊敬的 Martin:

    另外一个步骤是、您需要启用器件支持、以便将时钟树的更改填充到 device.c 文件中:

    忽略上述其他时钟设置...片段显示了添加器件支持后 EPWM 时钟分频器在此处发生了变化。  查看一下、然后告诉我这是否适合您。

    此致、

    Joseph

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

    尊敬的 Joseph:

    它起作用了! ;-)感谢您的帮助。

    ------------------------------------------------------------------------------------------------------------------------------------------------------

    一项附加功能。 仅添加器件支持后、出现了重新定义链接器错误。 第10056章

    我尝试了 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1309451/ccstudio-sysconfig-with-adding-device-support 但没有成功。

    如果有人在这个线程上遇到同样的问题。

    请访问 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1404876/tms320f28377d-sysconfig-clock-tree/5378564?tisearch=e2e-sitesearch&keymatch=SysConfig%20Device%20Support%20redefined%20error%20%2310056#5378564

    您需要排除整个设备文件夹并让标记为"Use Standard Code Start Branch"的代码。

    比它编译时不会出现问题。

    此致、

    Martin

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

    尊敬的 Joseph:

    很抱歉这么晚才回复。

    我想我找到了解决我的问题的方法。 感谢您的宝贵意见。

    高 PRIO SOC 每个周期2次、触发在例如 ePWM7 ADCSOCA 附近 (ETINTMIX = 0 ||周期)

    低 PRIO 突发 每个周期也出现2次、 触发间隔、例如 ePWM8 ADCSOCA (ETINTMIX = CMPA_INCREMENT || CMPA_递减)

    周期为10 µs、因此4个样本的时间窗口为2.5 µs、如果必须的话、我可以重新排列我的 SOC 块、我会有点喜欢它。 我想成功了。

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    最后还有一件事。

    另外我还发现、如果遇到调试器断点、ADC 内核实际上并不会停止。

    但至少中断会在我需要触发它的确切时刻发生。 n`t ,整个时间我有点追逐一个问题,这是真的存在.

    我想我在这里有证据:

    我构建一个新项目。

    ADCA 由 200 MHz 处的 SYSCLK 馈送、并在50 MHz (4分频器)下运行

    ADCA SOC0至 SCO3都是15个 SYSCLK 周期进行采样  

    ADCA SOC7至 SCO9都是15个 SYSCLK 周期进行采样  

    ePWM1也由  SYSCLK 馈电 并以200 MHz (时基时钟分频器和高速时钟分频器都为1)运行、因此 ePWM1 TBCTR 也兼作  SYSCYL 计数器

    ePWM1周期在1999、递增计数、仿真器停止后、计数器在下一次递增时停止

    ePWM1 CMPA 为1000

    ePWM1 ADCSOCA 由 CMPA_INUTRANT 触发、这会触发 ADCA SOC 0至3和 ADCA 突发  SOC 7至9

    ePWM1 CMPA_INULTING 还会触发 PWM 中断"INT_myEPWM1_ISR"

    ADCA SOC3 ECO 会触发 ADC 中断"INT_myADC0_1_ISR"

    ADCA SOC9 ECO 会触发 ADC 中断"INT_myADC0_2_ISR"

    与往常一样、当 IDE 向我显示"INT_myADC0_1_ISR"时、SOC7至 SOC9已进行采样和转换 。 n`t ADCA 内核未在刚好到达断点时停止。 内核继续以解析突发触发、然后仅在完成采样和转换的所有突发 SOC 之后才最终停止。

    我在 "INT_myEPWM1_ISR"中设置了一个断点。 ePWM1 TBCTR 的值(在事件 CMPA_IN递增 之后、在 ISR 中的断点处)为 0x3FBh ( 1019十进制 )

    ( 1019十进制 很遗憾、即使是1000个 CMPA 值也不是100%、但该值是合理的、因为一些 SYSCLK 周期在 CMPA_Incrementing 事件之后和进入 ISR 之前传递)

    我在 "INT_myADC0_1_ISR"中设置一个断点。  ePWM1 TBCTR 的值(在发生 ADCA SOC3 ECO 事件之后的 ISR 中的断点处)为 0x472h ( 1138十进制 )

    ( 1138十进制 - 1019十进制  等于的频率 119dec . 乍一看、这可能等于4倍30个 SYSCLK 周期、用于采样并将 SOC0转换为 SOC3)

    我在 "INT_myADC0_2_ISR"中设置一个断点。   ePWM1 TBCTR 的值(在   事件 ADCA SOC9 ECO 之后、在 ISR 中的断点处)为 0x546h ( 1350dec )

    ( 1350dec - 1138十进制  等于的频率 212dec . 乍一看、情况似乎有所不同、但 INT_myADC0_1_ISR 可从中获取 0x472h  最终目的 0x530h、  因此、  在进入此 ISR 之前、已超过3倍30个用于 SOC7采样和转换为 SOC9的 SYSCLK 周期)

     n´t 我来说、观察 ePWM1 TBCTR 值(等于 SYSCLK 周期)确认 ADCA 内核在中断时确实停止。 尤其是查看两者之间的差值   0x3FBh  ( 1019十进制 ) "INT_myEPWM1_ISR"(SOC 触发器)和  0x472h  ( 1138十进制 ) "INT_myADC0_1_ISR" (最终高电平 PRIO SOC EOC 触发)。

    有一个´s 有点奇怪。

    我早就告诉过你  1138十进制 -  1019十进制  等于的频率  119dec 相当于4乘以 30个 SYSCLK 周期、用于采样并将 SOC0转换为 SOC3。 这是可悲的n´t 累积!

    SOC0至 SOC4的 Tsample 全部配置为15个 SYSCLK 周期。 此外、ADCA 时钟分频器为4、这意味着 Tconvert 为41  个 SYSCLK 周期。 使用通道切换(2个 SYSCLK 周期)和向寄存器写入数据(2个 SYSCLK 周期)时、这些结果相加   每个 SOC 60个 SYSCLK 周期 . 看到我预期的差值 240dec 信号 119dec . 这意味着我的项目中需要 SOC 快速实现。 我n´t 和搜索,但无法找到我配置的任何不正确的东西。  

    您是否知道我做了什么错/发生了什么?

    此致。

    Martin

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

    尊敬的 Martin:

    您在 ISR 中的哪个点设置了断点?  你还可以检查 TBCTL 的值。 FREE_SOFT 字段?  该字段的值应该为0、以便任何断点都会停止时基计数器。  在 CCS 中设置断点的另一种替代方法是在您想要放置断点的行中编写一个 ESTOP0;宏。

    我猜计数器可能没有反映寄存器中的当前值。  似乎您想要为控制环路配置 SOC 组合的准确转换时间。  您也可以通过 GPIO 切换来执行此操作、并从示波器观察切换持续时间。  GPIO 函数 GPIO_writePin()将设置 GPIO 的输出、前提是该 GPIO 配置为输出。  此函数需要很少的时钟周期来执行、因此 这是一种分析代码中不同点之间时间持续时间的可靠方法。

    此致、

    Joseph

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

    尊敬的 Joseph:

    是在第一个设置断点的最佳行处设置断点(函数名称后的第一行、请参阅上面的屏幕截图)。

    TBCTL。 FREE_SOFT 也设置为0。 但精确的周期计数并不是问题。 问题更大的是、4 SOC 似乎需要119个周期、而不是最少240个周期。

    --------------------------------------------------------

    但有一个问题:就像我写的"ePWM1 TBCTR 的 INT_myEPWM1_ISR 处的 SW 中断  1036dec "、  中断在 ePWM1 TBCTR 上触发  1000解码  应执行的操作  36个十进制 CPU 从 IRQ 触发到 ISR 中断的周期是否合理?  

    --------------------------------------------------------

    但我会很高兴尝试 ESTOP0;在未来、通过 GPIO 进行分析也听起来像一个真正的想法。

    我并不是在 SOC EOC 触发中断、而是确实计划在 SOC S+H 时通过偏移触发中断。

    因此、正确的分析肯定是必需的。 再次感谢您提供建议。

    此致、

    Martin

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

    尊敬的 Martin:

    进入 ISR、处理和确认涉及几个 CPU 周期、但是36个周期可能太多。  我必须在其他文档上检查这实际上需要多少钱。   

    同时、最好使用 GPIO 切换来分析这些步骤。  还有另一个选项、我不熟悉、但可以有人指导您如何使用。  这涉及使用 ERAD 及其用于软件分析的用途。  但是、一个缺点是它在 Theia 中尚不受支持、但在 CCS 上适用于旧版本。  如果 GPIO 分析不可靠、这可能是另一种选择。

    此致、

    Joseph