工具/软件:Code Composer Studio
您好!
我正在使用 CCs7、C2000 V3和最新版本的编译器。 我使用 Launchpad。 我使用"优化关闭"
我想了解如何在最佳时间使用 ADC。
我使用来自 COntroleSUITE 的程序"adc_soc_software_sync_cpu01.c"。 (我的程序已结束)
我更改 CPU 时钟、查看 A1并对另一个 ADC 输入进行注释。
我使用 GPIO 进行测量、并在测量 GPIO 的时间之后(延迟_us 用于处于相同的情况)。
在数据表中、I 高达3.5Mhz (窗口 s/h =(14 + 1)* 5ns =75ns /时间转换= 41*5ns = 205ns /周期 ADC = 280ns => 3.57Mhz)
我在 GPIO 0之前将 GPIO 22设置为1、 在 adcResult 之后将 GPIO 22设置为1。 我有:2,53E+6Hz
我尝试不使用 GPIO 0、在 adcResult 之前、我具有3.11E+6Hz。
我有三个问题:
为什么我没有3.5Mhz?
为什么当我尝试同步2个 ADC (如程序中的 A1和 B1与 SOC1)时,我会在转换时间中增加20ns?
为什么当我更改 ACQPS 时,转换时间不会改变?
//######################################################################################################################
//
//文件: adc_soc_software_sync_cpu01.c
//
//标题: F2837xD 的 ADC 同步软件触发。
//
//! addtogroup cpu01_example_list
//!
ADC 同步 SOC 软件强制(ADC_SoC_software_sync)
//!
//! 此示例使用的输入5转换 ADCA 和 ADCB 上的一些电压
//! 输入 X-BAR 作为软件力。 输入5通过切换 GPIO0触发、
//! 但可以使用任何备用 GPIO。 该方法将确保两个 ADC
//! 开始完全同时转换。
//!
//! 程序运行后、存储器将包含:
//!
//! -\b AdcaResult0 \b:引脚 A0\n 上电压的数字表示
//! -\b 结果1:引脚 A1上电压的数字表示\n
//! -\b AdcbResult0 \b:引脚 B0\n 上电压的数字表示
//! -\bAdcbResult1 \b:引脚 B1\n 上电压的数字表示
//!
//
//######################################################################################################################
//$TI 版本:F2837xD 支持库 V210 $
//$Release Date:Tue Nov1 14:46:15 CDT 2016 $
//版权所有:版权所有(C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"
//
//函数原型
//
void ConfigureADC (void);
void SetupADCSoftwareSync (void);
void SetupInputXBAR5 (void);
//
//全局
//
uint16 AdcaResult0;
uint16 AdcaResult1;
uint16 AdcbResult0;
uint16 AdcbResult1;
void main (void)
{
//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2837xD_SYSCTRL.c 文件中。
//
InitSysCtrl();
InitSysPll (XTAL_OSC、IMULT_40、FULT_0、PLLCLK_By_2);
//
//步骤2. 初始化 GPIO:
//此示例函数位于 F2837xD_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
//
InitGpio();
//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;
//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xD_PIECTRL.c 文件中。
//
InitPieCtrl();
//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;
//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xD_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xD_PieVect.c 中找到
//
InitPieVectTable();
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT; //启用全局中断 INTM
ERTM; //启用全局实时中断 DBGM
//
//配置 ADC 并为其加电
//
ConfigureADC();
//
//设置用于软件转换的 ADC
//
SetupADCSoftwareSync();
SetupInputXBAR5();
//
//循环无限地进行转换
//
GPIO_SetupPinOptions (22、1、GPIO_PULLUP);
操作
{
//
//convert、等待完成并存储结果
//
//
//在软件中切换 GPIO0。 这将导致触发
//通过输入 XBAR 第5行来选择两个 ADC。
//
GpioDataRegs.GPADAT.bit.GPIO22 = 1;
GpioDataRegs.GPADD.bit.GPIO0 = 1;
GpioDataRegs.GPADD.bit.GPIO0 = 0;
//GpioDataRegs.GPADD.bit.GPIO22 = 1;
//GpioDataRegs.GPADD.bit.GPIO22 = 1;//除数网格
//
//等待 ADCA 完成,然后确认标志
//由于两个 ADC 都同步运行,因此没有必要
//等待两个 ADC 的完成通知
//
while (AdcaRegs.ADCINTFlG.bit.ADCINT1 = 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
//存储结果
//
// AdcaResult0 = AdcaResultRegs.ADCRESULT0;
AdcaResult1 = AdcaResultRegs.ADCRESULT1;
// AdcbResult0 = AdcbResultRegs.ADCRESULT0;
// AdcbResult1 = AdcbResultRegs.ADCRESULT1;
GpioDataRegs.GPADAT.bit.GPIO22 = 0;
//
//此时,转换结果存储在中
//AdcResult0、AdcResult1、AdcbResult0和 AdcbResult1
//
//
//软件断点,再次点击运行以获取更新的转换
//
// delay_US (0.1);
// GpioDataRegs.GPADAT.bit.GPIO22 = 0;
asm (" ESTOP0");
} while (1);
}
//
// ConfigureADC -写入 ADC 配置并为两者加电
// ADC A 和 ADC B
//
空配置 ADC (空)
{
EALLOW;
//
//写入配置
//
AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCA、ADC_resolution_12位、ADC_SIGNALMODE_SINGLE);
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);
//
//将脉冲位置设置为晚期
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//为 ADC 加电
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);
EDIS;
}
想象一下吧!
此致
JJ.
我的计划:
//
// SetupInputXBAR5 -设置 GPIO 0以触发输入 XBAR 第5行。 使用 GPIO0
// 作为示例,但可以使用任何备用 GPIO。 。
// 应允许物理 GPIO 引脚悬空、因为
// 代码将其配置为输出并更改值。
//
void SetupInputXBAR5 (void)
{
EALLOW;
InputXbarRegs.INPUT5SELECT = 0;//GPIO0将触发输入 XBAR 第5行
//
//GPIO0作为输出
//
GPIO_SetupPinOptions (0、GPIO_OUTPUT、GPIO_PushPull);
GPIO_SetupPinMux (0、GPIO_MUX_CPU1、0);
//
//GPIO0设为低电平
//
GpioDataRegs.GPADD.bit.GPIO0 = 0;
EDIS;
}
//
// SetupADCSoftwareSync -设置 ADC 采集窗口和比较值
//
void SetupADCSoftwareSync (void)
{
uint16 acqps;
//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)
{
acqps = 14;//75ns
}
否则、//分辨率为16位
{
acqps = 63;//320ns
}
//
//选择要转换的通道和转换结束标志
//ADCA
//
EALLOW;
/* AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 4;//输入 X-bar 的线路5将会
//触发 ADC
*
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 A1
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 22;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 4;//输入 X-bar 的线路5将会
//触发 ADC
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1;// SOC1结束将设置 INT1标志
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //启用 INT1标志
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
//
//ADCB
//
/*
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0将转换引脚 B0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 4;//输入 X-bar 的第5行将会
//触发 ADC
*
/*
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1将转换引脚 B1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps;//采样窗口为 acqps +
//1个 SYSCLK 周期
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 4;//输入 X-bar 的第5行将会
//触发 ADC
*
}
//
//文件结束
//