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.
您好!
该程序不会在中断时停止。
*****
#include "F28x_Project.h"
//
//函数原型
//
void ConfigureADCB (void);
void SetupADCBEpwm (uint16通道);
中断空 ADCB_ISR (空);
void ePWM_initEpwm (void);
UINT16 TBPRD = 5000;
void main (void)
{
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCB1_INT =&ADCB_ISR;// ADCB 中断1的函数
EDIS;
ePWM_initEpwm();
SetupADCBEpwm (0);
ConfigureADCB();
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//启用 PIE 中断
//
组中的 PieCtrlRegs.PIEIER1.bit.INTx2 = 1;// ADCB INT
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
EDIS;
//
//循环无限地进行转换
//
操作
{}
while (1);
}
中断空 ADCB_ISR (空)
{
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
空配置 ADCB (空)
{
EALLOW;
//
//写入配置
//
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为晚期
//
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//为 ADC 加电
//
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
void SetupADCBEpwm (uint16通道)
{
uint16 acqps;
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcbRegs.ADCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x5;// ePWM1 SOCA 上的触发
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0x0;// SOC0结束将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
//
// ConfigureEPWM -配置 ePWM SOC 并比较值
//
void ePWM_initEpwm (void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//关闭 ePWM 时钟
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.TBPRD = TBPRD;//将周期设置为 TBPRD 计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//清零 PWM1A
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EDIS;
}
//
//文件结束
//
小图标
谢谢 Vadim
抱歉、
我没有正确放置它。 如果我放置一个断点、它将在断点处停止、并且它将在 大约2000年的时间内显示 AdcbResultRegs.ADCRESULT0中的值。 在我的板上、ADCB0和 ADCA0均连接到1.6V。 如果我删除断点、运行它并暂停、则该值始终为0。 ADCB0只能在软件中断断点时读取电压、如果我暂停并运行它、它始终为0、永不改变。 我对 ADC0没有这样的问题,因为它的电压是相同的。 无论我使用暂停还是断点、ADCA0都可以读取正确的值。 在我的 ADCB0代码中应该有什么不同
这是适用于 ADCA 的代码
****
#include "F28x_Project.h"
//
//函数原型
//
void ConfigureADCA (void);
void SetupADCAEpwm (uint16通道);
中断 void adca_isr (void);
void ePWM_initEpwm (void);
UINT16 TBPRD = 5000;
void main (void)
{
InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCA1_INT =&adca_ISR;// ADCB 中断1的函数
EDIS;
ePWM_initEpwm();
SetupADCAEpwm (0);
ConfigureADCA();
IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//启用 PIE 中断
//
组中的 PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCB INT
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
EDIS;
//
//循环无限地进行转换
//
操作
{}
while (1);
}
中断 void adca_isr (void)
{
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;
}
空配置 ADCA (空)
{
EALLOW;
//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
void SetupADCAEpwm (uint16通道)
{
uint16 acqps;
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x5;// ePWM1 SOCA 上的触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0x0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
//
// ConfigureEPWM -配置 ePWM SOC 并比较值
//
void ePWM_initEpwm (void)
{
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//关闭 ePWM 时钟
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.TBPRD = TBPRD;//将周期设置为 TBPRD 计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//清零 PWM1A
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EDIS;
}
//
//文件结束
//
*****
我使用 XDS100V2在 Launchpad 上运行了代码、没有任何问题。 我在电路板上使用 XDS110
谢谢 Vadim
您好!
只需确认一下,此问题是否与定制板有关,而不是与 Launchpad 有关?
谢谢
Vasudha
这是管道。 我必须将 JTAG 的 nTRST 从2.2k 更改为10k、因为电路板上没有通信。 此外、当我将示波器 GND 连接到电路板 GND 以探测某个时间时、电路板会挂起并给出以下错误:
C28xx_CPU1:GEL 输出:
内存映射初始化完成
C28xx_CPU1:错误:(错误-1137 @ 0x0)器件保持在复位状态。 使器件退出复位状态、然后重试此操作。 (仿真包8.1.0.00005)
C28xx_CPU1:20次尝试后无法确定目标状态
C28xx_CPU1:在断开连接之前无法从目标中删除调试状态。 程序存储器中仍可能嵌入了断点运算代码。 建议您在连接之前重置仿真器、并在继续调试之前重新加载程序
谢谢 Vadim
您好!
由于代码在 Launchpad 上工作、因此电压基准生成电路可能存在一些问题。 您能否检查定制板中是否正确提供了 ADC 的 Vref。
谢谢
Vasudha
Vasudha、您好!
这似乎是一个奇怪的问题、可能与 JTAG 复位有关。 它突然消失了
谢谢 Vadim