大家好!
我想在 ISR 中读取 ADC 电压、但不知何故、isrCount 没有增加。
我使用的是 ADCA3/C5
使用 epwm1 SOCA...触发 ADC
注意:我运行演示代码"adc_ex2_epwm_tempsensor"。 此代码正常运行、并且 isrCount 也会增加。
我正在为您的参考号附加一个代码。 请检查。
//
//包含的文件
//
#include "F28x_project.h"
//
//定义
//
#define results_buffer_size 256
//
//全局变量
//
uint16_t sensorSample = 0;
uint16_t isrCount = 0;
int16_t sensorTemp = 0;
//
//函数原型
//
void initADC (void);
void initEPWM (void);
void initADCSOC (void);
__interrupt void AdcA3ISR (void);
//
//主菜单
//
空 main (void)
{
//
//初始化设备时钟和外设
//
InitSysCtrl();
//
//初始化 GPIO
//
InitGpio();
//
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态是所有 PIE 中断都被禁用并且标志
//被清除。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
InitPieVectTable();
//
//映射 ISR 函数
//
EALLOW;
PieVectTable.ADCA3_INT =&AdcA3ISR;// Adca 中断1的函数
EDIS;
//
//配置 ADC 并为其加电
//
initadc();
//
//配置 ePWM
//
initEPwm();
//
//为通道1上的 EPWM 触发转换设置 ADC
//
initADCSOC();
EALLOW;
//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER10.bit.INTx3 = 1;
//
//同步 ePWM
//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT10;//启用组10中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//InitTempSensor (3.3f);
//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//解冻、并进入向上计数模式
//
//等待 ePWM 会引起 ADC 转换,然后会引起中断,
//这将填充结果缓冲区,最终设置 bufferFull
//标记
//
while (1)
{
}
}
//
// initADC -用于配置和启动 Adca 的函数。
//
void initADC (void)
{
//
//将 VREF 设置为内部
//
SetVREF (ADC_ADCA、ADC_INTERNAL、ADC_VREF3P3);
EALLOW;
//
//将 AdcaLK 分频器设置为/4
//
AdcaRegs.ADCCTL2.bit.prescale = 6;
//
//将脉冲位置设置为 Late EOC
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//给 ADC 上电,然后延迟1ms
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
EDIS;
DELAY_US (1000);
}
//
// initEPWM -用于配置 ePWM1以生成 SOC 的函数。
//
void initEPWM (void)
{
EALLOW;
EPwm1Regs.ETSEL.bit.SOCAEN = 0;//在组上禁用 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在向上计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第1个事件时生成脉冲
EPwm1Regs.CMPA.bit.CMPA = 0x0800;//将 A 值设置为2048个计数
EPwm1Regs.TBPRD = 0x1000;//将周期设置为4096个计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EDIS;
}
//
// initADCSOC -用于配置 ADCA 的 SOC0由 ePWM1触发的函数。
//
void initADCSOC (void)
{
//
//选择要转换的通道以及转换结束标志
//
EALLOW;
AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0x03;// SOC0将转换引脚 A3
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 45;//采样窗口为10个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//针对 ePWM1 SOCA 触发
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0;// SOC0结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;
}
__interrupt void AdcA3ISR (void)
{
isrCount++;
//
//将最新结果添加到缓冲区中
// ADCRESULT0是 SOC0的结果寄存器
sensorSample = AdcaResultRegs.ADCRESULT0;
//
//清除中断标志
//
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
//检查是否发生了溢出
//
if (1 == AdcaRegs.ADCINTOVF.bit.ADCINT1)
{
AdcaRegs.ADCINTOVFCLR.bit.ADCINT1 = 1;//清除 INT1溢出标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
}
//
//确认中断
//
PieCtrlRegs.PIEACK.all = PIEACK_group10;
}