主题中讨论的其他器件: TMDSCNCD28035、 C2000WARE
您好!
我不熟悉 TI 控制器 IC TMS320F28035。 我已下载控制套件并尝试 ADC_SOC 代码以测试 ADC 代码。 在我的实验板套件上、A2和 A4引脚已接地。 因此、我期望 ADC_Results 为零、但始终为4095! 请帮助我了解问题。
代码如下所示:
//######################################################################################################################
//描述:
//! 添加到组 F2803x_example_list
//!
ADC 转换开始(ADC_SoC)
//!
//! 此 ADC 示例使用 ePWM1来生成周期性 ADC SOC - ADCINT1。
//! 两个通道被转换、ADCINA4和 ADCINA2。
//!
//! b 监视\b 变量\n
//! - Voltage1[10]-最后10个 ADCRESULT0值
//! - Voltage2[10]-最后10个 ADCRESULT1值
//! -转换计数-当前结果编号0-9
//! -循环计数-空闲循环计数器
//
//
//######################################################################################################################
//$TI 版本:F2803x C/C++头文件和外设示例 V130 $
//$Release Date:2015年5月8日$
//版权所有:版权所有(C) 2009-2015 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
#include "DSP28x_Project.h"//器件头文件和示例 include 文件
//此文件中找到的函数的原型语句。
_interrupt void ADC_ISR (void);
void ADC_Config (void);
//此示例中使用的全局变量:
uint16环计数;
UINT16转换计数;
uint16 Voltage1[10];
uint16 Voltage2[10];
MAIN ()
{
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 DSP2803x_SYSCTRL.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 DSP2803x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 DSP2803x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 DSP2803x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 DSP2803x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT1 =&ADC_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
//步骤4. 初始化所有器件外设:
InitAdc ();//对于此示例,初始化 ADC
AdcOffsetSelfCal();
//步骤5. 特定于用户的代码、启用中断:
//在 PIE 中启用 ADCINT1
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//在 PIE 中启用 INT 1.1
IER |= M_INT1;//启用 CPU 中断1
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
LoopCount = 0;
ConversionCount = 0;
//配置 ADC
//注意:通道 ADCINA4将被双采样以解决修订版0器件勘误表的 ADC 第一个采样问题
EALLOW;
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1;//ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1;//启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0;//禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 2;//设置 EOC2以触发 ADCINT1触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4;//将 SOC0通道选择设置为 ADCINA4 (针对修订版0勘误权变措施的虚拟样本)
AdcRegs.ADCSOC1CTL.bit.CHSEL = 4;//将 SOC1通道选择设置为 ADCINA4
AdcRegs.ADCSOC2CTL.bit.CHSEL = 2;//将 SOC2通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5;//设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC1启动触发器,因为循环 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC2CTL.bit.TRIGSEL = 5;//设置 EPWM1A 上的 SOC2启动触发器,因为轮询 SOC0先转换 SOC1,然后转换 SOC2
AdcRegs.ADCSOC0CTL.bit.ACQPS = 6;//将 SOC0 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC1CTL.bit.ACQPS = 6;//将 SOC1 S/H 窗口设置为7个 ADC 时钟周期(6个 ACQPS 加1)
AdcRegs.ADCSOC2CTL.bit.ACQPS = 6;//将 SOC2 S/H 窗口设置为7个 ADC 时钟周期、(6个 ACQPS 加1)
EDIS;
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//从 CPMA 中选择 SOC、以进行递增计数
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080;//设置比较值
EPwm1Regs.TBPRD = 0xFFFF;//为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//向上计数并启动
//等待 ADC 中断
for (;;)
{
LoopCount++;
}
}
_interrupt void ADC_ISR (void)
{
Voltage1[ConversionCount]= AdcResult.ADCRESULT1;//丢弃 ADCRESULT0作为版本0的第1个样本勘误表权变措施的一部分
Voltage2[ConversionCount]= AdcResult.ADCRESULT2;
//如果记录了20次转换,则重新开始
if (ConversionCount = 9)
{
ConversionCount = 0;
}
其他
{
ConversionCount++;
}
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;//确认 PIE 中断
返回;
}
谢谢、
Akshay


