Tool/software: Code Composer Studio
Hi,
i'm working on CCs7, c2000 V3 and the lastest version of compiler. I use a LaunchPAD. I use "optimization OFF"
I want to understand how to use the ADC with the best time.
I use the program "adc_soc_software_sync_cpu01.c" from COntroleSUITE. (My program is at the end)
I change the CPU clock and I look A1 and comment the other ADC input.
I measure with a GPiO and after I measur the time of GPIO (with a delay_us for to be in the same situation).
In the datasheet I up to 3.5Mhz (Window s/h = (14 + 1) * 5ns =75ns / Time conversion = 41*5ns = 205ns / period ADC = 280ns => 3.57Mhz)
I set my GPIO 22 to 1 before GPIO 0 And i set GPIO 22 to 1 after adcResult. I have : 2,53E+6Hz
I try without GPIO 0 and before adcResult i have 3.11E+6Hz.
I have three question :
Why I don't have 3.5Mhz ?
And Why when i try to synchronize 2 ADC (like in the programs, A1 and B1 with SOC1) I add 20ns to my conversion time ?
Why When I change ACQPS, the time of conversion don't change ?
//###########################################################################
//
// FILE: adc_soc_software_sync_cpu01.c
//
// TITLE: ADC synchronous software triggering for F2837xD.
//
//! \addtogroup cpu01_example_list
//! <h1> ADC Synchronous SOC Software Force (adc_soc_software_sync)</h1>
//!
//! This example converts some voltages on ADCA and ADCB using input 5 of the
//! input X-BAR as a software force. Input 5 is triggered by toggling GPIO0,
//! but any spare GPIO could be used. This method will ensure that both ADCs
//! start converting at exactly the same time.
//!
//! After the program runs, the memory will contain:
//!
//! - \b AdcaResult0 \b: a digital representation of the voltage on pin A0\n
//! - \b AdcaResult1 \b: a digital representation of the voltage on pin A1\n
//! - \b AdcbResult0 \b: a digital representation of the voltage on pin B0\n
//! - \b AdcbResult1 \b: a digital representation of the voltage on pin B1\n
//!
//
//###########################################################################
// $TI Release: F2837xD Support Library v210 $
// $Release Date: Tue Nov 1 14:46:15 CDT 2016 $
// $Copyright: Copyright (C) 2013-2016 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//###########################################################################
//
// Included Files
//
#include "F28x_Project.h"
//
// Function Prototypes
//
void ConfigureADC(void);
void SetupADCSoftwareSync(void);
void SetupInputXBAR5(void);
//
// Globals
//
Uint16 AdcaResult0;
Uint16 AdcaResult1;
Uint16 AdcbResult0;
Uint16 AdcbResult1;
void main(void)
{
//
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the F2837xD_SysCtrl.c file.
//
InitSysCtrl();
InitSysPll(XTAL_OSC,IMULT_40,FMULT_0,PLLCLK_BY_2);
//
// Step 2. Initialize GPIO:
// This example function is found in the F2837xD_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
//
InitGpio();
//
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
//
DINT;
//
// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the F2837xD_PieCtrl.c file.
//
InitPieCtrl();
//
// Disable CPU interrupts and clear all CPU interrupt flags:
//
IER = 0x0000;
IFR = 0x0000;
//
// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example. This is useful for debug purposes.
// The shell ISR routines are found in F2837xD_DefaultIsr.c.
// This function is found in F2837xD_PieVect.c.
//
InitPieVectTable();
//
// Enable global Interrupts and higher priority real-time debug events:
//
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
//
// Configure the ADCs and power them up
//
ConfigureADC();
//
// Setup the ADCs for software conversions
//
SetupADCSoftwareSync();
SetupInputXBAR5();
//
//take conversions indefinitely in loop
//
GPIO_SetupPinOptions(22 , 1, GPIO_PULLUP);
do
{
//
//convert, wait for completion, and store results
//
//
//Toggle GPIO0 in software. This will cause a trigger to
//both ADCs via input XBAR, line 5.
//
GpioDataRegs.GPADAT.bit.GPIO22 = 1;
GpioDataRegs.GPADAT.bit.GPIO0 = 1;
GpioDataRegs.GPADAT.bit.GPIO0 = 0;
//GpioDataRegs.GPADAT.bit.GPIO22 = 1;
//GpioDataRegs.GPADAT.bit.GPIO22 = 1; // début mesure
//
//wait for ADCA to complete, then acknowledge the flag
//since both ADCs are running synchronously, it isn't necessary
//to wait for completion notification from both ADCs
//
while(AdcaRegs.ADCINTFLG.bit.ADCINT1 == 0);
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
//
//store results
//
// AdcaResult0 = AdcaResultRegs.ADCRESULT0;
AdcaResult1 = AdcaResultRegs.ADCRESULT1;
// AdcbResult0 = AdcbResultRegs.ADCRESULT0;
// AdcbResult1 = AdcbResultRegs.ADCRESULT1;
GpioDataRegs.GPADAT.bit.GPIO22 = 0;
//
//at this point, conversion results are stored in
//AdcaResult0, AdcaResult1, AdcbResult0, and AdcbResult1
//
//
//software breakpoint, hit run again to get updated conversions
//
// DELAY_US(0.1);
// GpioDataRegs.GPADAT.bit.GPIO22 = 0;
asm(" ESTOP0");
}while(1);
}
//
// ConfigureADC - Write ADC configurations and power up the ADC for both
// ADC A and ADC B
//
void ConfigureADC(void)
{
EALLOW;
//
//write configurations
//
AdcaRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcbRegs.ADCCTL2.bit.PRESCALE = 6; //set ADCCLK divider to /4
AdcSetMode(ADC_ADCA, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
AdcSetMode(ADC_ADCB, ADC_RESOLUTION_12BIT, ADC_SIGNALMODE_SINGLE);
//
//Set pulse positions to late
//
AdcaRegs.ADCCTL1.bit.INTPULSEPOS = 1;
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;
//
//power up the ADCs
//
AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;
//
//delay for 1ms to allow ADC time to power up
//
DELAY_US(1000);
EDIS;
}
Think in adavance !
best regards
JJ
My program :
//
// SetupInputXBAR5 - Setup GPIO 0 to trigger input XBAR line 5. GPIO0 is used
// as an example, but any spare GPIO could be used. The
// physical GPIO pin should be allowed to float, since the
// code configures it as an output and changes the value.
//
void SetupInputXBAR5(void)
{
EALLOW;
InputXbarRegs.INPUT5SELECT = 0; //GPIO0 will trigger the input XBAR line 5
//
//GPIO0 as an output
//
GPIO_SetupPinOptions(0, GPIO_OUTPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(0, GPIO_MUX_CPU1, 0);
//
//GPIO0 set as low
//
GpioDataRegs.GPADAT.bit.GPIO0 = 0;
EDIS;
}
//
// SetupADCSoftwareSync - Setup ADC acquisition window and compare values
//
void SetupADCSoftwareSync(void)
{
Uint16 acqps;
//
//determine minimum acquisition window (in SYSCLKS) based on resolution
//
if(ADC_RESOLUTION_12BIT == AdcaRegs.ADCCTL2.bit.RESOLUTION)
{
acqps = 14; //75ns
}
else //resolution is 16-bit
{
acqps = 63; //320ns
}
//
//Select the channels to convert and end of conversion flag
//ADCA
//
EALLOW;
/* AdcaRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin A0
AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps +
//1 SYSCLK cycles
AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 4; //line 5 of the input X-BAR will
//trigger the ADC
*/
AdcaRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin A1
AdcaRegs.ADCSOC1CTL.bit.ACQPS = 22; //sample window is acqps +
//1 SYSCLK cycles
AdcaRegs.ADCSOC1CTL.bit.TRIGSEL = 4; //line 5 of the input X-BAR will
//trigger the ADC
AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 1; //end of SOC1 will set INT1 flag
AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1; //enable INT1 flag
AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1; //make sure INT1 flag is cleared
//
//ADCB
//
/*
AdcbRegs.ADCSOC0CTL.bit.CHSEL = 0; //SOC0 will convert pin B0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps; //sample window is acqps +
//1 SYSCLK cycles
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 4; //line 5 of the input X-BAR will
//trigger the ADC
*/
/*
AdcbRegs.ADCSOC1CTL.bit.CHSEL = 1; //SOC1 will convert pin B1
AdcbRegs.ADCSOC1CTL.bit.ACQPS = acqps; //sample window is acqps +
//1 SYSCLK cycles
AdcbRegs.ADCSOC1CTL.bit.TRIGSEL = 4; //line 5 of the input X-BAR will
//trigger the ADC
*/
}
//
// End of file
//