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.

[参考译文] TIDM-1000:三相 Vienna 整流器 PWM ISR 和 ADC SOC

Guru**** 2539500 points
Other Parts Discussed in Thread: SFRA

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1301826/tidm-1000-three-phase-vienna-rectifier-pwm-isr-and-adc-soc

器件型号:TIDM-1000
主题中讨论的其他器件:SFRA

您好!

 我正在使用 Vienna 整流器代码来执行 SFRA、并且  对于 PWM ISR 和 ADC SOC 具有以下疑问。

1. 是否可以 根据硬件中的 ADC 转换时间 (每个通道约为1us)修改 ADC SOC 触发信号,使其在控制 ISR 开始之前发生。

如果 I 权利、则根据 EPW1 模块的 CMPD 值设置 ADC 触发器、该值是根据 ADC 转换时间(200ns)计算得出的、如下所示。  或者 ADC SOC 和 EPW ISR 是否同时发生。 为什么要考虑 ADC SOC 的转换时间。

================================

VIENNA_HAL_setupTriggerForADC (VIENNA_HIGH_FREQ_PWM1_BASE);

void VIENNA_HAL_setupTriggerForADC (uint32_t base)
{
//
//在 CTR = CMPBD 时从计数器选择 SOC
//
ePWM_setADCTriggerSource (base、ePWM_SOC_A、ePWM_SOC_TBCTR_U_CMPD);

//
//将值写入 CMPB
//
EPWM_setCounterCompareValue (base、EPWM_COUNTER_COMPARE_D、
((uint16_t)((float32_t) VIENNA_PFC3PH_pwm_period *(float32_t) 0.5)
-(uint16_t)((float32_t) VIENNA_IL1_ACQPS_SYS_CLKS *(float32_t) 6.0
*(float32_t)(VIENNA_PWMSYSCLOCK_FREQ_Hz /(float32_t) VIENNA_CPU_SYS_CLOCK_FREQ_Hz)
-(uint16_t)((float32_t) VIENNA_ADC_CONV_TIME
*( float32_t ) VIENNA_PWMSYSCLOCK_FREQ_Hz *( float32_t ) 6.0 ));

//
//在第1个偶数处生成脉冲
//
EPWM_setADCTriggerEventPrescale (base、EPWM_SOC_A、1);

//
//在组上启用 SOC
//
EPWM_enableADCTrigger (base、EPWM_SOC_A);

========================================

对于控制 ISR、使用 EPM1模块的相同 CMPD 值生成中断、如下所示。

================================================================

VIENNA_HAL_enablePWMInterruptGeneration (
VIENNA_C28x_ISR1_INTERRUPT_TRIG_pwm_base
EPWM_getCounterCompareValue (VIENNA_HIGH_FREQ_PWM1_BASE、
epwm_counter_compare_D);

静态内联 void Vienna_HAL_enablePWMInterruptGeneration (uint32_t base、
uint16_t CMPC_val)
{
//
//将值写入 CMPC
//
EPWM_setCounterCompareValue (base、EPWM_COUNTER_COMPARE_C、
CMPC_val);

ePWM_setInterruptSource (base、ePWM_INT_TBCTR_D_CMPC);
EPWM_setInterruptEventCount (base、VIENNA_CNTRL_ISR_FREQ_RATIO);
EPWM_enableInterrupt (base);
EPWM_clearEventTriggerInterruptFlag (base);

========================================

2.为什么 当每个 ADC 模块没有被用来轮询结果寄存器来达到转换的结束时要为它设置中断。

ADC_setInterruptPulseMode (ADCA_BASE、ADC_PULSE_END_OF_CONV);

此致、

内拉哈  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我 修改 soc 触发器以在控制 ISR 开始之前发生,基于我硬件中的 ADC 转换时间,每个通道约为1us 。

    控制 ISR 从 CMPC 触发

    ADC SOC 由 CMPB 触发时保持高电平。

    现在看看该函数的调用位置、我们可以看到 CMPC 值设置为 CMPB 值、因此它们可能会同时触发。

    话虽如此、代码中可能还有其他元素修改值、因此我建议您在运行时查看 CMPB 和 CMPC 值。 从代码的写入方式来看、我认为 ISR 期望已转换 ADC 值并准备好从结果寄存器中读取。 出于这个原因、我希望 CMPC 和 CMPB 会因转换所需的时间量而异。 奇怪的是、我认为通过 ADC EOC 脉冲可以更从容地实现这一点、但缩放 CMPB/C 值具有相同的效果。

    2. 为什么 在每个 ADC 模块不用于轮询结果寄存器以结束转换时为其设置中断。

    我没有很好的理由说明为什么设置 ADC 中断脉冲模式(这就是我假设您在指的。 请注意、这不是完全配置的中断、因此它不会更改代码执行。 我在代码中的任何地方都没有看到打算使用 ADC ISR 的内容。

    此致、
    科迪  

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

    谢谢。 我在运行时检查了 CMP 值。 二者相得益彰。 值在运行时读作815十进制。 计算值为814。

     

    ADC SOC 和 EPM ISR 似乎同时启动。

    谢谢。此致、

    内拉哈