This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS320F28335

Q.1. In the below mentioned code when I am using the "sampleTable" in watch variable window   the value of the expression "sampleTable" are not giving the maximum value i.e. 4096.So What is the reason behind this fault ?

Q.2.How is the program working?

// Watch Variables:

// SampleTable - Log of converted values.
// GPIO34 - Toggles on every ADC sequencer flag
//
//###########################################################################
//
// Original source by: S.S.
//
// $TI Release: DSP2833x/DSP2823x C/C++ Header Files V1.31 $
// $Release Date: August 4, 2009 $
//###########################################################################

#include "DSP28x_Project.h" // Device Headerfile and Examples Include File

// Determine when the shift to right justify the data takes place
// Only one of these should be defined as 1.
// The other two should be defined as 0.
#define POST_SHIFT 0 // Shift results after the entire sample table is full
#define INLINE_SHIFT 1 // Shift results as the data is taken from the results regsiter
#define NO_SHIFT 0 // Do not shift the results

// ADC start parameters
#if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT
#define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz
#endif
#if (CPU_FRQ_100MHZ)
#define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz
#endif
#define ADC_CKPS 0x0 // ADC module clock = HSPCLK/1 = 25.5MHz/(1) = 25.0 MHz
#define ADC_SHCLK 0x1 // S/H width in ADC module periods = 2 ADC cycle
#define AVG 1000 // Average sample limit
#define ZOFFSET 0x00 // Average Zero offset
#define BUF_SIZE 1024 // Sample buffer size

// Global variable for this example
Uint16 SampleTable[BUF_SIZE];


main()
{
Uint16 i;
Uint16 array_index;


// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl();

// Specific clock setting for this example:
EALLOW;
SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK
EDIS;

// Step 2. Initialize GPIO:
// This example function is found in the DSP2833x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio(); // Skipped for this example
// Enable the pin GPIO34 as output
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO pin
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // Output pin
EDIS;

// 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 DSP2833x_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 DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
InitAdc(); // For this example, init the ADC

// Specific ADC setup for this example:
AdcRegs.ADCTRL1.bit.ACQ_PS = ADC_SHCLK; // Sequential mode: Sample rate = 1/[(2+ACQ_PS)*ADC clock in ns]
// = 1/(3*40ns) =8.3MHz (for 150 MHz SYSCLKOUT)
// = 1/(3*80ns) =4.17MHz (for 100 MHz SYSCLKOUT)
// If Simultaneous mode enabled: Sample rate = 1/[(3+ACQ_PS)*ADC clock in ns]
AdcRegs.ADCTRL3.bit.ADCCLKPS = ADC_CKPS;
AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode
AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0;
AdcRegs.ADCTRL1.bit.CONT_RUN = 1; // Setup continuous run

AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature
AdcRegs.ADCCHSELSEQ1.all = 0x0; // Initialize all ADC channel selects to A0
AdcRegs.ADCCHSELSEQ2.all = 0x0;
AdcRegs.ADCCHSELSEQ3.all = 0x0;
AdcRegs.ADCCHSELSEQ4.all = 0x0;
AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7; // convert and store in 8 results registers


// Step 5. User specific code, enable interrupts:


// Clear SampleTable
for (i=0; i<BUF_SIZE; i++)
{
SampleTable[i] = 0;
}

// Start SEQ1
AdcRegs.ADCTRL2.all = 0x1999;

for(;;)
{ // Take ADC data and log them in SampleTable array

// Initalize the array index. This points to the current
// location within the SampleTable
array_index = 0;

for (i=0; i<(BUF_SIZE/16); i++)
{
// Wait for int1
while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // Set GPIO34 for monitoring -optional

AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

#if INLINE_SHIFT
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT3)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT4)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT5)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT6)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT7)>>4);

#endif //-- INLINE_SHIFT

#if NO_SHIFT || POST_SHIFT

SampleTable[array_index++]= ( (AdcRegs.ADCRESULT0));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT1));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT2));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT3));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT4));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT5));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT6));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT7));

#endif //-- NO_SHIFT || POST_SHIFT

while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // Clear GPIO34 for monitoring -optional
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

#if INLINE_SHIFT

SampleTable[array_index++]= ( (AdcRegs.ADCRESULT8)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT9)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT10)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT11)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT12)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT13)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT14)>>4);
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT15)>>4);

#endif //-- INLINE_SHIFT

#if NO_SHIFT || POST_SHIFT

SampleTable[array_index++]= ( (AdcRegs.ADCRESULT8));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT9));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT10));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT11));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT12));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT13));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT14));
SampleTable[array_index++]= ( (AdcRegs.ADCRESULT15));
#endif // -- NO_SHIFT || POST_SHIFT

}


#if POST_SHIFT
// For post shifting, shift the ADC results
// in the SampleTable buffer after the buffer is full.
for (i=0; i<BUF_SIZE; i++)
{
SampleTable[i] = ((SampleTable[i]) >>4);
}
#endif // -- POST_SHIFT

GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1; // Clear GPIO34 for monitoring -optional
}
}

//===========================================================================
// No more.
//===========================================================================

  • Abhishek,

    >> Q.1. In the below mentioned code when I am using the "sampleTable" in watch variable window   the value of the expression "sampleTable" are not giving the maximum value i.e. 4096.So What is the reason behind this fault ?


    A 12-bit ADC has maximum value of 4095.  Yes, 2^12 counts, but 0 is the first value so max value is 2^12-1.

    >> Q.2.How is the program working?


    Not sure what you're asking here.  The code configures the ADC and takes some data.  Is there a specific portion that confuses you?

    Regards,

    David

     

     

     

  • First of all thank you sir for your reply.

    Q.1.Yes sir, the  maximum value is 4095.But I am not getting 4095 even though I am rotating the potentiometer/variable resistor  to its maximum level.I am attaching the screenshot with the values I got.

    Q.2.Yes sir,I am confused in some part of the code so I am mentioning one by one

    i)if we are using Inline shift so why we have to use no shift and post shift?

    ii)What is the use of GPIO34 pin?

    iii) AdcRegs.ADCCHSELSEQ1.all = 0x00;  In this statement will it initialize all the the channels of A1?

    iv) for (i=0; i<(BUF_SIZE/16); i++)

    Why we have to divide BUF_SIZE/16?

    v)What is the need of this two statements?

    while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
    GpioDataRegs.GPBSET.bit.GPIO34 = 1; // Set GPIO34 for monitoring -optional

  • Abhishek,

    >> Q.1.Yes sir, the  maximum value is 4095.But I am not getting 4095 even though I am rotating the potentiometer/variable resistor  to its maximum level.I am attaching the screenshot with the values I got.

    You're saying that you are inputting full-scale 3V, and the converted results are ~ 228 - 265 counts?  You should get 4095 (as you've been saying).  Can you measure the input voltage at the ADC input pin?  What happens if you put in zero?

    >> Q.2.Yes sir,I am confused in some part of the code so I am mentioning one by one

    I didn't write the code, but I can attempt to answer.

    >> i)if we are using Inline shift so why we have to use no shift and post shift?

    Inline shift was set to 1 at the top of the code.  No shift and post shift was set to 0.  So, only the code for inline shift is compiled and included.  Basically, there are three options: inline shift, no shift, or post shift.  You choose only one.

    >> ii)What is the use of GPIO34 pin?

    I think it's just a way to show externally that the code is running.  The pin is toggled in the code.

    >> iii) AdcRegs.ADCCHSELSEQ1.all = 0x00;  In this statement will it initialize all the the channels of A1?

    ADCCHSELSEQ1 controls the first 4 conversions.  It will set these four to convert channel A0.  The remaining 12 channels are controlled by the other three ADCCHSELSEQx registers:

    AdcRegs.ADCCHSELSEQ1.all = 0x0; // Initialize all ADC channel selects to A0
    AdcRegs.ADCCHSELSEQ2.all = 0x0;
    AdcRegs.ADCCHSELSEQ3.all = 0x0;
    AdcRegs.ADCCHSELSEQ4.all = 0x0;

    >> iv) for (i=0; i<(BUF_SIZE/16); i++)

    >> Why we have to divide BUF_SIZE/16?

    Because you are taking 16 samples at a time, so the buffer fills with 16 values each pass through the for loop.

    >> v)What is the need of this two statements?

    >> while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
    >> GpioDataRegs.GPBSET.bit.GPIO34 = 1; // Set GPIO34 for monitoring -optional

    The first statement is polling the sequencer interrupt.  It sits in the while loop until there is data to read.  Actually, the sequencer is used in a Ping-Pong fashion with an interrupt occurring after every 8 conversions.  After the first interrupt the GPIO34 is set.  After the second in the series the GPIO34 is cleared.  It can be observed on a scope.  Just how this code was written.
    -----------
    Regards,
    David
  • When  I  am giving an input of 0 volt the o/p is shown below:-

    When  I  am giving an input of 3.3 volts i.e my full scale value  the o/p is shown below:-

    Q.1. As you can see that o/p is not 0 at 0 volt and 4095 at 3.3 volts.So, what is the main reason behind this problem?

    Q.2.  while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
    >> GpioDataRegs.GPBSET.bit.GPIO34 = 1; // Set GPIO34 for monitoring -optional

    We are taking 16 samples through 4 ADC sequencers but why after 8 conversion interrupt is generated?

  • Abhishek,

    >> Q.1. As you can see that o/p is not 0 at 0 volt and 4095 at 3.3 volts.So, what is the main reason behind this problem?

    You might have a damaged input channel.  Try using a different ADC channel.

    Q.2. We are taking 16 samples through 4 ADC sequencers but why after 8 conversion interrupt is generated?

    There is only 1 sequencer.  I think you are confusing the channel selection registers (of which there are 4, for 16 conversions) with the sequencer.  You have MAXCONV set to 7, which means 8 conversions:

    AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x7; // convert and store in 8 results registers

    So, you get an interrupt after every 8 conversions.  You also have have the SEQ_OVRD bit set:

    AdcRegs.ADCTRL1.bit.SEQ_OVRD = 1; // Enable Sequencer override feature

    which makes the sequencer continue after MAXCONV conversions, and not reset to CONV00.  You can read about this in the F2833x ADC User's Guide.

    Regards,

    David