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.

[参考译文] TMS320F28032:非常慢的中断执行

Guru**** 2392095 points
Other Parts Discussed in Thread: TMS320F28032

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/899518/tms320f28032-very-slow-interrupt-execution

器件型号:TMS320F28032

您好!

我将 TMS320F28032用于多级反激式设计。
到目前为止、一切都是有目的的。

控制器由一个20Mhz XTAL 计时。 SYSCLOCK 为(用 GPIO18测量) 60MHz、LSPCLK 为15MHz。
我已经设置了3个相移 PWM、每个 PWM 的频率为100kHz (在先递增计数模式下周期寄存器为600)。 我在示波器上看到、这些 PWM 有目的地工作(每个 PWM 为100kHz、每个 PWM 为120°相移)

ePWM1在计数器计数值为零时立即生成 SOC 脉冲。 这会触发我的高优先级 SOC 0... 2至 ADCIN0A、ADCIN0B 和 ADCIN1A 采样
SOC2配置为抛出中断。 (到目前为止我的控制器上唯一的一个!)

EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 0; //当 ADC 开始转换时产生 INT 脉冲->早期中断
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 1; // ADCINT1
AdcRegs.INTSEL1N2.bit.INT1SEL 的连续采样= 0x02; // SOC2的转换结束将触发 ADCINT1

AdcRegs.INTSEL1N2.bit.INT2E = 1; //启用 ADCINT2
AdcRegs.INTSEL1N2.bit.INT2CONT = 1; // ADCINT2
AdcRegs.INTSEL1N2.bit.INT2SEL 的连续采样= 0x07; // SOC7转换结束将触发 ADCINT2

AdcRegs.SOCPRICTL.bit.SOCPRIORITY = 0x03;// SOC0-SOC2为高优先级,SOC3-SOC15处于轮询模式
EDIS; 

在 SOC2_EOC 之后、中断会定期在右侧的 MANNOR 中抛出。 但是、我们已经看到了一些愚蠢的数据移位、甚至只是在确认中断服务需要很长时间时才会看到。

typedef 结构 ADC_Sampledata ADC_Sampledata;

/
* UNION :ADC_Data
* description:
*允许将 int 直接写入_IQ 变量。
秘书长的报告 /
UNION Sample_ARG
{
_iq15 m_IQ15;
unsigned int M_Int;
};
/*********
*结构 :ADC_Sampledata
*说明:
*包含高速采样 ADC 值
/
struct adc_Sampledata
{
SAMPLE_ARG AC_Input;
SAMPLE_ARG 轨反馈;
SAMPLE_ARG VIN_REECT;
};

//对齐样本数据数组*/
#pragma DATA_ALIGN (Sampledata,8);
ADC_Sampledata Sampledata; 

//在高优先级快速 ADC 转换结束时调用的 ISR
__interrupt void ADC1_EOC (void)
{
GpioDataRegs.GPASET.bit.GPIO10=1; //开+关需要260ns

Sampledata.ac_Input.m_Int =(AdcResult.ADCRESULT0)<<3;//需要大约580ns
Sampledata.Rail Feedback.m_Int =(AdcResult.ADCRESULT1)<<3;//需要大约580ns
Sampledata.VIN_rect.m_Int =(AdcResult.ADCRESULT2)<<3;//需要大约580ns

//GpioDataRegs.GPACLEAR.bit.GPIO10=1;

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除 ADCINT1标志为下一个 SOC 重新初始化-需要540ns
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断 需要240ns
GpioDataRegs.GPACLEAR.bit.GPIO10=1;
返回;
} 

我的程序正在闪存中运行。

备注:这不是我使用此处理器的第一个项目。
我已经设置了一个多 kW 有源 PFC。 在这里、我从2个 ADC 中收集 ADC 数据、计算32位2类控制器(在汇编器中)、并在2µs μ s 内的 EOC 中断中设置新的 PWM 值。 我想我可能错过了某个地方、也许您可以给我一个正确的方向提示。

谢谢!

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

    我自己发现了这家酒店的缺点!
    我没有初始化闪存。
    默认情况下、设置了15个等待状态、每次闪存操作都会占用这么高的周期数。

    设置正确的等待状态值后、一切正常!

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

    Fabian、

    好本能。  我将询问您是否在闪存之外执行。  如果您有可用的 RAM、最好将 ISR 移动到 RAM 以获得最佳执行速度。

    Tommy