主题中讨论的其他部件:C2000WARE
工具/软件:Code Composer Studio
大家好,
这是塞纳特。 我需要您提供一些建议,以便我可以将比较器输出连接到TIDSP的中断引脚 ,以便在比较器输出高时生成中断。
我是否可以直接将比较器输出连接到中断引脚,或者是否需要与它同时连接任何其它电路? 如果您有一些示例代码,说明如何在此触发外部中断,这将非常有用
特定的TIDSP。
提前感谢。
此致,
Sainath Reddy
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.
工具/软件:Code Composer Studio
大家好,
这是塞纳特。 我需要您提供一些建议,以便我可以将比较器输出连接到TIDSP的中断引脚 ,以便在比较器输出高时生成中断。
我是否可以直接将比较器输出连接到中断引脚,或者是否需要与它同时连接任何其它电路? 如果您有一些示例代码,说明如何在此触发外部中断,这将非常有用
特定的TIDSP。
提前感谢。
此致,
Sainath Reddy
实际上,我找到了 一个在控制套件中将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。