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.

[参考译文] CCS/TMS320F2.8379万D:通过将比较器输出连接到中断引脚来定义外部中断的建议。

Guru**** 2558250 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/634916/ccs-tms320f28379d-suggestions-in-defining-an-external-interrupt-by-connecting-a-comparator-output-to-the-interrupt-pin

部件号:TMS320F2.8379万D
主题中讨论的其他部件:C2000WARE

工具/软件:Code Composer Studio

大家好,

       这是塞纳特。 我需要您提供一些建议,以便我可以将比较器输出连接到TIDSP的中断引脚 ,以便在比较器输出高时生成中断。  

我是否可以直接将比较器输出连接到中断引脚,或者是否需要与它同时连接任何其它电路?  如果您有一些示例代码,说明如何在此触发外部中断,这将非常有用

特定的TIDSP。  

提前感谢。

此致,

Sainath Reddy  

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

    您好,Sainath,

    为了触发比较器中断,人们通常会通过ePWM的DC和TZ子模块。 或者,如果不想使用ePWM,可以将比较器输出路由到OUTPUTXBAR->GPIO ->INPUTXBAR->XINTx,并使用PIE的外部中断选项。

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

    实际上,我找到了  一个在控制套件中将ADC与ePWM配合使用的示例代码。 请您推荐我需要对代码进行的更改,以便与比较器配合使用。

    //###################################################################
    //
    //文件:adc_so_ePWM_cpu01.c
    //
    //标题:ADC通过ePWM触发F2837xD。
    //
    //! \addtogroup cpu01_example_list
    //! <H1>ADC ePWM触发(ADC_SOC_ePWM)</H1>
    //!
    //! 此示例设置ePWM以定期触发ADC。
    //!
    //! 程序运行后,内存将包含:\n
    //! -\b AdcaResults \b:来自的一系列模数转换示例
    //! 针脚A0。 样本之间的时间根据周期确定
    //! ePWM计时器。
    //
    //###################################################################
    //$TI发行版:F2837xD支持库V210 $
    //$发布日期:11月1日星期二14:46:15 CDT 2016 $
    //$Copyright:版权所有(C) 2013-2016 Texas2016 Texas Instruments Incorporated -
    // http://www.ti.com/ 保留所有权利$
    //###################################################################

    //
    //包含的文件
    //
    #include "F28x_Project.h"

    //
    //函数原型
    //
    void ConfigureADC (void);
    void ConfigureEPWM (void);
    void SetupADCEpwm (UINT16通道);
    中断无效adca1_isr(void);

    //
    //定义
    //
    #define results_buffer_size 256

    //
    //全局
    //
    UINT16 AdcaResults[results_buffer_size];
    UINT16结果索引;
    易失性UINT16缓冲器全;

    Void主(void)

    //
    //步骤1. 初始化系统控制:
    // PLL,看门狗,启用外设时钟
    //此示例函数可在F2837xD_sysctrl.c文件中找到。
    //
    InitSysCtrl();

    //
    //步骤2. 初始化GPIO:
    //此示例函数可在F2837xD_GPIO.c文件和中找到
    //说明了如何将GPIO设置为其默认状态。
    //
    此示例跳过InitGpio();//

    //
    //步骤3. 清除所有中断并初始化PIE矢量表:
    //禁用CPU中断
    //
    色调;

    //
    //将PIE控件寄存器初始化为其默认状态。
    //默认状态是禁用所有PIE中断和标志
    //被清除。
    //此函数位于F2837xD_PIECTRL.c文件中。
    //
    InitPieCtrl();

    //
    //禁用CPU中断并清除所有CPU中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向外壳中断的指针初始化PIE矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使中断也是如此
    //在本例中不使用。 这对于调试非常有用。
    // shell ISR例程位于F2837xD_DefaultIsr.C.中
    //此函数位于F2837xD_PieVect.C.中
    //
    InitPieVectorTable();

    //
    //映射ISR功能
    //
    EALLOW;

    PieVectorTable.ADCA1_INT =&adca1_ISR;// ADCA中断1的函数

    EDIS;

    //
    //配置ADC并将其打开
    //
    配置ADC();

    //
    //配置ePWM
    //
    配置EPWM();

    //
    //在通道0上设置ePWM触发转换的ADC
    //
    SetupADCEpwm(0);

    //
    //启用全局中断和更高优先级的实时调试事件:
    //
    IER || M_INT1;//启用组1中断
    EINT;//启用全局中断INTM
    ERTM;//启用全局实时中断DBGM

    //
    //初始化结果缓冲区
    //
    for (resultsIndex = 0;resultsIndex < results_buffer_size;resultsIndex++)

    AdcaResults[resultsIndex]=0;
    }
    结果索引=0;
    缓冲器全轮= 0;

    //
    //启用PIE中断
    //
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;

    //
    //同步ePWM
    //
    EALLOW;

    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;

    //
    //无限循环转换
    //


    //
    //启动ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;//unfreeze,并进入UP计数模式

    //
    //等待ePWM导致ADC转换,然后导致中断,
    //填充结果缓冲区,最终设置bufferFull
    //标志
    //
    while (!bufferFull);
    bufferFull = 0;//清除缓冲区已满标志

    //
    //停止ePWM
    //
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用SOCA
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器

    //
    //此时,AdcaResults[]包含一个转换序列
    //从所选频道
    //

    //
    //软件断点,再次点击"运行"以获取更新的转换
    //
    ASM (" ESTOP0");

    }同时(1);
    }

    //
    // ConfigureADC -写入ADC配置并为两者加电
    // ADC A和ADC B
    //
    void配置ADC(void)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale =6;//将ADCCLK除法器设置为/4
    AdcSetMode (ADC_ADCA,ADC_Resolution _12位,ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为延迟
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;

    //
    //打开ADC的电源
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1毫秒,以使ADC有时间开机
    //
    DELAY _US (1000);

    EDIS;
    }

    //
    // ConfigureEPWM -配置ePWM SOC并比较值
    //
    void配置EPWM (void)

    EALLOW;
    //假定ePWM时钟已启用
    EPwm1Regs.ETSEL.bit.SOCAEN = 0;//禁用组上的SOC
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在加电计数时选择SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在第一个事件上生成脉冲
    EPwm1Regs.CMPA.bit.CMPA = 0x0800;// set将值与2048个计数进行比较
    EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
    EDIS;
    }

    //
    // SetupADCEpwm -设置ADC ePWM采集窗口
    //
    void SetupADCEpwm (UINT16通道)

    UINT16 acqps;

    //
    //根据分辨率确定最小采集窗口(在SYSCLKS中)
    //
    IF (ADC_Resolution _12位== AdcaRegs.ADCCTL2.bit.Resolution)

    acqps = 14;//75ns
    }
    ELSE //分辨率为16位

    acqps = 63;//320ns
    }

    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换针A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//样例窗口为100 SYSCLK周期
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;// ePWM1 SOCA/C上的触发器
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;//SOC0的结尾将设置INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用INT1标志
    AdcaRegs.ADCINTFLGCLL.bit.ADCINT1 =1;//确保INT1标志已清除
    EDIS;
    }

    //
    // adca1_ISR -读取ISR中的ADC缓冲器
    //
    中断无效适配器1_ISR(void)

    AdcaResults[resultsIndex+]= AdcaResultRegs.ADCRESULT0;
    IF (results_buffer_size <= resultsIndex)

    结果索引=0;
    缓冲器全轮= 1;
    }

    ADcaRegs.ADCINTFLGCLL.bit.ADCINT1 = 1;//清除INT1标志
    PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
    }

    //
    //文件结束
    //

    提前感谢。

    此致,

    Sainath Reddy。

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

    请避免在线程中粘贴代码,因为这会使线程难以浏览。 您不需要从ADC示例开始。 C2000Ware中已经有示例说明了cmpss与ePWM的功能。 还有一些用于外部中断的中断。 您可以从其中任何一个开始。

    1. cmps_asynch_cpu01 ->此示例代码显示cmpss与ePWM dc & tz模块的交互。
    2. cmps_digital_filter_cpu01 ->此示例代码显示通过输出Xbar的cmpss。