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.

[参考译文] TMS570LC4357:由 PWM 模块触发的 ADC 单次转换

Guru**** 2470720 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054315/tms570lc4357-adc-single-conversion-triggered-from-pwm-module

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

我正在尝试将 ADC 配置为 在单次转换模式下从 PWM 触发、但我正在努力触发它。

我已经设置了 SOC A、并且根据我的配置设置了该标志、但不会触发 ADC 转换。

是否有一个可用于配置 ADC 模块以从 PWM 模块触发的示例?

我正在尝试触发组1。

/*复位 ADC */
ADC_1->RSTCR =(uint32)(1U);
ADC_1->RSTCR =(uint32)(0U);


/* ADC 12位 ADC 转换*/
ADC_1->OPMODECR |=(uint32)(2147483648U);

/* ADC 时钟*/
ADC_1->CLOCKCR =(uint32)(9U);

/* 12位读取格式*/
ADC_1->GxMODECR[1U]=(uint32)(8U);

/*事件触发源*/
ADC_1->G1SRC =(UINT32)(16U);

/*转换结束中断*/
ADC_1->GxINTENA[1U]=(uint32)(4U);

ADC_1->BNDCR =(uint32)((uint32) 8U << 16U)|(8U + 8U);
ADC_1->BNDEND =(ADC_1->BNDEND & 0xFFFF0000U)|(2U);

ADC_1->G1SAMP =(UINT32)(1U);

ADC_1->GxSEL[1U]=(uint32)(15U);

/*启用 ADC */
ADC_1->OPMODECR |=(uint32)(1U);

/*-等待缓冲区初始化完成*/
while (((adcREG1->BNDEND & 0xFFFFFF0000U)>> 16U)!= 0U)

ADC_1->PARCR =(uint32)(5U);

ADC_1->GxINTCR[1]=(uint32)(12U);

请告诉我出错了。

谢谢

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

    您好!

    每个 PWM 模块有两个 ADC 转换开始信号:SOCA 和 SOCB。  您是否启用了 ePWMxSOCA 或 ePWMxSOCB?

    您可以使用 HALCOGen GUI 来启用它:

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

    您好、是的、启用了 SOCB、当触发发生时、我可以看到每个周期都设置了 SOB 状态标志。 我认为这与 Pinmuxing 有关。

    另一个问题是、我需要将 ADC 通道设置为输入引脚、还是在 HALCOGen 中选择 ADC 通道时、它会自动执行该操作?

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

    您好、Ali、

    除 EVT 引脚外的所有 ADC 引脚均为输入引脚。 它不可配置。  

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

    请仔细检查 您的代码中是否调用了 etpwmStartTBCLK()。

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

    是的、PWM 模块已启动、现在我可以看到触发器正在生成、ADC 会扫描结果、但是、在第一次采样后、ADC 数据寄存器根本不会更新、即使我已经检查了每个 PWM 周期都要发送触发器。

    我正在直接从 ADC RAM 读取数据、而不是从 FIFO 读取数据、这可能是一个问题。  

    因此、我认为正在发送触发信号、但 ADC 在1个周期后不会扫描端口。

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

    我已将 ePWM4 SOCB 配置为向 ADC 发送触发信号、并且在 ADC 侧、我已设置引脚多路复用器、如上面的快照中所示  

    仍然触发仅在发生时发生

    PinMux

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

    您好、QJ Wang、

    因此、我四处看看、让 ADC 将覆盖 RAM 数据位设置为1

    现在、我在每个 PWM 触发周期后都有连续的数据更新。 我现在的问题是、如果我将覆盖 RAM 数据位保留为0、那么我如何清除 RAM、以便在下一个周期写入新结果。

    谢谢、

    Ali

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

    如果 OVR_RAM_IGN = 1,ADC 模块将用 新的转换结果覆盖组的结果存储器内容。

    如果 OVR_RAM_IGN = 0,则应用程序必须在 溢出情况下读取组的结果内存;只有这样,ADC 才能继续将新结果写入内存。

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

    您是否启用 ADC 中断并从 ISR 中组结果的存储器中读出转换结果? 如果 FIFO 大小为1、并且您未读出转换数据、 则如果 OVR_RAM_IGN = 0、新的转换数据将被丢弃。  

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

    谢谢王、

    因此、基本上、从 RAM 读取数据后、我使用 FIFO 清除标志寄存 器清除 FIFO、这允许 ADC 在下一个 PWM 周期写入新数据、同时保持 OVR_RAM_IGN = 0。  

    感谢快速响应和出色的支持。

    此致、

    Ali