您好!
我使用的是 TMS320F280025C 控制器。 我需要使用 PWM 作为触发源来读取 ADC 数据。 我需要使用通道 A3。 我使用过本身一样的演示代码、该代码是为通道 C1提供的。 在该代码中、我对通道 A3进行了相关更改。 我在适当的地方突出显示了我所做的更改。 我无法读取 ADC 值。 请仔细检查一下代码、知道错误在哪里。
代码:-
//
//包含的文件
//
#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);
__中断无效 ADcA3ISR (空);
//
//主菜单
//
空 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;
EDIS;
//
//配置 ADC 并为其加电
//
initadc();
//
//配置 ePWM
//
initEPwm();
//
//为通道1上的 EPWM 触发转换设置 ADC
//
initADCSOC();
// EALLOW;
//
//启用全局中断和更高优先级的实时调试事件:
//
IER |= M_INT10 ;//启用组10中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//启用 PIE 中断
//
PieCtrlRegs.PIEIER10.bit.INTx3 = 1;
//
//同步 ePWM
//
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1;
//
//启用全局中断和更高优先级的实时调试事件:
//
//IER |= M_INT1;//启用组1中断
// InitTempSensor (3.3f);
//
//启动 ePWM
//
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//解冻、并进入向上计数模式
//
//等待 ePWM 会引起 ADC 转换,然后会引起中断,
//这将填充结果缓冲区,最终设置 bufferFull
//标记
//
while (1)
{
}
}
// initADC -用于配置 ADCC 并为其加电的函数。
//
void initADC (void)
{
//
//将 VREF 设置为内部
//
SetVREF ( ADC_ADCA 、ADC_EXTERNAL、ADC_VREF3P3);
EALLOW;
//
//将 ADCCLK 分频器设置为/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 = 3; // SOC0将转换引脚 C12
AdcaRegs.ADCSOC0CTL.bit.ACQPS = 45;//采样窗口为10个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//针对 ePWM1 SOCA 触发
AdcaRegs。 ADCINTSEL3N4 位。 INT3SEL = 0;// SOC0结束将设置 INT3标志
AdcaRegs。 ADCINTSEL3N4 位。 INT3E = 1;//启用 INT3标志
AdcaRegs.ADCINTFLGCLR.bit。 ADCINT3 = 1;//确保 INT3标志被清除
EDIS;
}
__中断无效 ADcA3ISR (空)
{
isrCount++;
如果(isrCount==1000)
{
isrCount=0;
}
//
//将最新结果添加到缓冲区中
// ADCRESULT0是 SOC0的结果寄存器
sensorSample = AdcaResultRegs.ADCRESULT0;
sensorTemp = GetTemperatureC (sensorSample);
//
//清除中断标志
//
AdcaRegs.ADCINTFLGCLR.bit。 ADCINT3 = 1;
//
//检查是否发生了溢出
//
if (1 == AdcaRegs.ADCINTOVF.bit。 ADCINT3 )
{
AdcaRegs.ADCINTOVFCLR.bit。 ADCINT3 = 1;//清除 INT1溢出标志
AdcaRegs.ADCINTFLGCLR.bit。 ADCINT3 = 1;//清除 INT1标志
}
//
//确认中断
//
PieCtrlRegs.PIEACK.all = PIEACK_group10 ;
}
谢谢!