Thread 中讨论的其他器件:controlSUITE
工具/软件:Code Composer Studio
我正在尝试了解如何在 F28069中配置 ADC。 我在 controlSUITE 中使用了示例 ADC 程序(按原样)、并将电源连接到 ADCINA2引脚。 但是、当我读取结果时、我得到的是3.3V 时的1480、而应该是4095。 是否有人可以解释可能是什么问题? 下面是我使用的程序。
//######################################################################################################################
//描述:
//! addtogroup f2806x_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 版本:F2806x C/C++头文件和外设示例 V151 $
//$Release Date: 2016年2月2日$
//版权所有:版权所有(C) 2011-2016德州仪器(TI)公司-
// 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、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
InitSysCtrl();
//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio(); //针对此示例跳过
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2806x_PIECTRL.c 文件中。
InitPieCtrl();
//禁用 CPU 中断并清除所有 CPU 中断标志:
IER = 0x0000;
IFR = 0x0000;
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
EALLOW; //这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.ADCINT1 =&ADC_ISR;
EDIS; //这是禁止写入 EALLOW 受保护寄存器所必需的
//步骤4. 初始化所有器件外设:
//此函数可在 F2806x_InitPeripherals.c 中找到
// InitPeripherals ();//此示例不需要
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
EALLOW;
AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; //启用非重叠模式
AdcRegs.ADCCTL1.bit.INTPULSEPOS = 1; // ADCINT1在 AdcResults 锁存后跳闸
AdcRegs.INTSEL1N2.bit.INT1E = 1; //启用 ADCINT1
AdcRegs.INTSEL1N2.bit.INT1CONT = 0; //禁用 ADCINT1连续模式
AdcRegs.INTSEL1N2.bit.INT1SEL = 1; //设置 EOC1以触发 ADCINT1触发
AdcRegs.ADCSOC0CTL.bit.CHSEL = 4; //将 SOC0通道选择设置为 ADCINA4
AdcRegs.ADCSOC1CTL.bit.CHSEL = 2; //将 SOC1通道选择设置为 ADCINA2
AdcRegs.ADCSOC0CTL.bit.TRIGSEL = 5; //设置 SOC0在 EPWM1A 上启动触发器,因为轮询 SOC0先转换,然后 SOC1
AdcRegs.ADCSOC1CTL.bit.TRIGSEL = 5; //设置 EPWM1A 上的 SOC1启动触发器,因为 SOC0先转换,然后 SOC1
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)
EDIS;
//假设 ePWM1时钟已在 InitSysCtrl()中启用;
EPwm1Regs.ETSEL.bit.SOCAEN = 1; //启用组上的 SOC
EPwm1Regs.ETSEL.bit.SOCASEL = 4; //在递增计数时从 CMPA 中选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1; //在发生第一个事件时生成脉冲
EPwm1Regs.CMPA.half.CMPA = 0x0080; //设置比较值
EPwm1Regs.TBPRD = 800; //为 ePWM1设置周期
EPwm1Regs.TBCTL.bit.CTRMODE = 0; //向上计数并启动
//等待 ADC 中断
for (;;)
{
LoopCount++;
}
}
_interrupt void ADC_ISR (void)
{
Voltage1[ConversionCount]= AdcResult.ADCRESULT0;
Voltage2[ConversionCount]= AdcResult.ADCRESULT1;
//如果记录了20次转换,则重新开始
if (ConversionCount = 9)
{
ConversionCount = 0;
}
else ConversionCount++;
AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //清除 ADCINT1标志为下一个 SOC 重新初始化
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1; //确认 PIE 中断
返回;
}