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.

[参考译文] TMS320F280025C:ADC SOC 不由 PWM 触发

Guru**** 2460850 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1135321/tms320f280025c-adc-soc-not-being-triggered-by-pwm

器件型号:TMS320F280025C
Thread 中讨论的其他器件:SysConfig

我正在使用"SysConfig"为 Pinmux 等生成设置代码  

我尝试使 PWM1在 DAC 上触发 SOC 事件。 ADC 的中断处理程序设置正确、因为我可以将数据传递到寄存器并强制使用 SOC。 我在中断中设置的断点表明中断已执行。 但是、SOC do4s 不会由 PWM 触发。

下面是设置例程的代码片段...

ADC:

void adc_init(){
//myADC0初始化

// ADC 初始化:写入 ADC 配置并为 ADC 加电
//配置 ADC 模块的偏移调整
ADC_setOffsetTrimAll (ADC_reference_internal、ADC_reference_2_5V);
//配置模数转换器模块预分频器。
ADC_setPrescaler (myADC0_BASE、ADC_CLK_DIV_1_0);
//设置转换结束脉冲的时序
ADC_setInterruptPulseMode (myADC0_BASE、ADC_PULSE_END_TO_CONV);
//为模数转换器内核加电。
ADC_enableConverter (myADC0_BASE);
//延迟1ms 以允许 ADC 加电时间
DEVICE_DELAY_US (5000);

// SOC 配置:设置 ADC ePWM 通道和触发器设置
//禁用 SOC 突发模式。
ADC_DisableBurstMode (myADC0_BASE);
//设置 SOC 的优先级模式。
ADC_setSOCPPriority (myADC0_BASE、ADC_PRI_All_ROUND);
//转换0配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:0
//触发:ADC_TRIGGER_EPWM1_SOCB
//通道:ADC_CH_ADCIN10
//示例窗口:50个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (myADC0_BASE、ADC_SOC_NUMBER0、ADC_TRIGGER_EPWM1_SOCB、ADC_CH_ADCIN10、50U);
ADC_setInterruptSOCtrigger (myADC0_BASE、ADC_SOC_NUMBER0、ADC_INT_SOC_TRIGGER_NONE);
//转换1配置开始
//在 ADC 及其中断 SOC 触发器中配置转换开始(SOC)。
// SOC 编号:1.
//触发:ADC_TRIGGER_EPWM1_SOCB
//通道:ADC_CH_ADCIN15
//示例窗口:50个 SYSCLK 周期
//中断触发:ADC_INT_SOC_TRIGGER_NONE
ADC_setupSOC (myADC0_BASE、ADC_SOC_numer1、ADC_TRIGGER_EPWM1_SOCB、ADC_CH_ADCIN15、50U);
ADC_setInterruptSOCtrigger (myADC0_BASE、ADC_SOC_number1、ADC_INT_SOC_TRIGGER_NONE);

PWM:

void ePWM_init(){
ePWM_setClockPrescaler (EPWM1_RefA_base、ePWM_CLOCK 分频器_1、ePWM_HSCLOCK_divider 1);
ePWM_setTimeBasePeriod (EPWM1_RefA_base、2500);
ePWM_setTimeBaseCounter (EPWM1_RefA_base、0);
ePWM_setTimeBaseCounterMode (EPWM1_RefA_base、ePWM_COUNTER_MODE_UP);
ePWM_DisablePhaseShiftLoad (EPWM1_RefA_base);
ePWM_setPhaseShift (EPWM1_RefA_base、0);
ePWM_setCounterCompareValue (EPWM1_RefA_base、ePWM_COUNTER_COMPARE_A、1250);
ePWM_setCounterCompareShadowImage LoadMode (EPWM1_RefA_base、ePWM_COUNTER_COMPARE_A、ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setCounterCompareValue (EPWM1_RefA_base、ePWM_COUNTER_COMPARE_B、1250);
ePWM_setCounterCompareShadowImage LoadMode (EPWM1_RefA_base、ePWM_COUNTER_COMPARE_B、ePWM_COMP_LOAD_ON_CNTR_ZERO);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_high、ePWM_AQ_output_on_timebase_zero);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_period);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_low、ePWM_AQ_output_on_timebase_up_cmPA);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPA);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_A、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_zero);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_period);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPA);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPA);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_up_CMPB);
ePWM_setActionQualifierAction (EPWM1_RefA_base、ePWM_AQ_output_B、ePWM_AQ_output_no_change、ePWM_AQ_output_on_timebase_down_CMPB);
ePWM_enableADCtrigger (EPWM1_RefA_base、ePWM_SOC_A);
ePWM_setADCTriggerSource (EPWM1_RefA_base、ePWM_SOC_A、ePWM_SOC_TBCTR_U_CMPB);

中断:

void interrupt_init(){

// INT_myADC0_1的中断设置
interrupt_register (INT_myADC0_1、&INT_myADC0_1_ISR);
INTERRUPT_ENABLE (INT_myADC0_1);

这是令人发指的...:<(

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

    你(们)好、David

    我们的专家将在今天再次讨论这个问题。

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

    谢谢你。  
    昨晚我终于找到了答案。 在“触发事件”设置中。 需要正确设置“事件数”。 我不记得在以前版本的 DSP 中看到过这种情况(或使用它)。

    一旦我设置了这个、中断开始按预期运行。

    此功能不像使其清晰可见所需的那样可见。