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.

[参考译文] 编译器:F28069 ADC 初始化使用 epwm1int 主 ISR 失败。

Guru**** 2611705 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/690522/compiler-f28069-adc-initial-using-epwm1int-main-isr-failed

Thread 中讨论的其他器件:controlSUITE

工具/软件:TI C/C++编译器

大家好、高级工程师

我使用 F28069通过 SVPWM 驱动三相电机、现在我需要使用 ADC 读取电流反馈信息以实现闭环电流控制

在设置 ADC 初始化时、我 使用  controlSUITE 中的 F2806XILEG_VDC_PM.H 代码、 并在   MainISR 中模仿 PM_sensorless Level 2的结构

但是、当我将 Enableflag 设置为1时、epwm1 ISR 将停止、 CCS 调试跳转到 F2806x_DefaultIsr.c 中的 ILLEGAL_ISR (void)

中断 void ILLEGAL_ISR (void)//非法操作陷阱

//在此处插入 ISR 代码

//接下来的两行仅用于调试,以在此处停止处理器
//插入 ISR 代码后删除
asm (" ESTOP0");
for (;;);




我已经查阅了技术手册、以下是我的相关代码  

您能告诉我我错过了什么或 哪里出了问题吗? 非常感谢  


////////// 我的 ADC 初始代码////

#define ADC_MACRO ()\
\
DELAY_US (ADC_USDELAY);\
AdcRegs.ADCCTL1.all=ADC_RESET_FLAG;\
asm (" NOP ");\
asm (" NOP ");\
\
EALLOW;\
AdcRegs.ADCCTL1.bit.ADCBGPWD = 1;/*加电带隙*/\
\
DELAY_US (ADC_USDELAY);//在为 ADC 的其余部分加电之前的延迟*\
\
AdcRegs.ADCCTL1.bit.ADCREFSEL = 0;\
AdcRegs.ADCCTL1.bit.ADCREFPWD = 1;/*加电基准*/\
AdcRegs.ADCCTL1.bit.ADCPWDN = 1;/*为 ADC 的其余部分加电*/\
AdcRegs.ADCCTL1.bit.ADCENABLE = 1;/*启用 ADC */\
\
asm (" RPT#100 || NOP");\
\
AdcRegs.ADCCTL1.bit.INTPULSEPOS=1;\
AdcRegs.ADCCTL1.bit.TEMPCONV=0;\
\
DELAY_US (ADC_USDELAY);\
\
/***** 信道选择***** /\
\
\
AdcRegs.ADCSOC0CTL.bit.CHSEL = 1;/*选择:ADC A1->相位 U 电流*/\
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换,然后 SOC1*/\
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期,(6个 ACQPS 加1)*/\
\
AdcRegs.ADCSOC1CTL.bit.CHSEL = 9;/*选择:ADC B1->相位 V 电流*/\
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;\
\
AdcRegs.ADCSOC2CTL.bit.CHSEL = 10;/*选择:ADC B2->DC 总线电压*/\
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;\
\
AdcRegs.ADCSOC3CTL.bit.CHSEL = 15;/*选择:ADC B7->V 相位 A */\
AdcRegs.ADCSOC3CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC3CTL.bit.ACQPS = 6;\
\
AdcRegs.ADCSOC4CTL.bit.CHSEL = 7;/*选择:ADC A7->V 相位 B */\
AdcRegs.ADCSOC4CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC4CTL.bit.ACQPS = 6;\
\
AdcRegs.ADCSOC5CTL.bit.CHSEL = 12;/*选择:ADC B4->V 相位 C */\
AdcRegs.ADCSOC5CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC5CTL.bit.ACQPS = 6;\
\
AdcRegs.ADCSOC6CTL.bit.CHSEL = 2;/*选择:ADC A2->低侧直流总线返回电流*/\
AdcRegs.ADCSOC6CTL.bit.TRIGSEL = 5;\
AdcRegs.ADCSOC6CTL.bit.ACQPS = 6;\
\
EDIS;\
\
\
/*为 EPWM1的时基设置启用 CNT_ZERO 的事件触发器*/\
EPwm1Regs.ETSEL.bit.SOCAEN = 1;/*启用 SOCA */\
EPwm1Regs.ETSEL.bit.SOCASEL = 1;/*为 SOCA 启用 CNT_ZERO 事件*/\
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第1个事件上生成 SOCA *\
EPwm1Regs.ETCLR.bit.SOCA = 1;//清除 SOCA 标志*

////////// 在我的 mainisr 代码///末尾

//清除此计时器的 INT 标志
EPwm1Regs.ETCLR.bit.INT = 1;

//确认此中断以接收来自组3的更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

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

    当已启用的中断未映射到 PIE 矢量表中的 ISR()函数时,ILLEGAL_ISR()通常是一个包罗万象的函数。

    在这种情况下,可以在处于 ILLEGAL_ISR()中时检查 PIEACK 和 PIEIFRx 寄存器,以查看哪个中断导致了问题。

    Tommy
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我找到了问题。 当我使用闪存而不是 RAM 时 DELAY_US()出错
    更改延迟功能将起作用