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 Experimental kit ADC continuous code from control suite

Other Parts Discussed in Thread: TMS320F28335

I have downloaded the following adc code(adc soc) from contol suite however the  variables voltage 1 and voltage 2 when monitored show fluctuating value between 0-2000 even when no AN pins are comnnected with dc voltages? I expect these result buffer to be zero when no dc volatges are provded instead of fluctuating value. Please help?

TI File $Revision: /main/2 $
// Checkin $Date: July 30, 2009   18:44:13 $
//###########################################################################
//
// FILE:   Example_2833xAdc.c
//
// TITLE:  DSP2833x ADC Example Program.
//
// ASSUMPTIONS:
//
//   This program requires the DSP2833x header files.
//
//   Make sure the CPU clock speed is properly defined in
//   DSP2833x_Examples.h before compiling this example.
//
//   Connect signals to be converted to A2 and A3.
//
//    As supplied, this project is configured for "boot to SARAM"
//    operation.  The 2833x Boot Mode table is shown below.
//    For information on configuring the boot mode of an eZdsp,
//    please refer to the documentation included with the eZdsp,
//
//       $Boot_Table:
//
//         GPIO87   GPIO86     GPIO85   GPIO84
//          XA15     XA14       XA13     XA12
//           PU       PU         PU       PU
//        ==========================================
//            1        1          1        1    Jump to Flash
//            1        1          1        0    SCI-A boot
//            1        1          0        1    SPI-A boot
//            1        1          0        0    I2C-A boot
//            1        0          1        1    eCAN-A boot
//            1        0          1        0    McBSP-A boot
//            1        0          0        1    Jump to XINTF x16
//            1        0          0        0    Jump to XINTF x32
//            0        1          1        1    Jump to OTP
//            0        1          1        0    Parallel GPIO I/O boot
//            0        1          0        1    Parallel XINTF boot
//            0        1          0        0    Jump to SARAM        <- "boot to SARAM"
//            0        0          1        1    Branch to check boot mode
//            0        0          1        0    Boot to flash, bypass ADC cal
//            0        0          0        1    Boot to SARAM, bypass ADC cal
//            0        0          0        0    Boot to SCI-A, bypass ADC cal
//                                              Boot_Table_End$
//
// DESCRIPTION:
//
//   This example sets up the PLL in x10/2 mode.
//
//   For 150 MHz devices (default)
//   divides SYSCLKOUT by six to reach a 25.0Mhz HSPCLK
//   (assuming a 30Mhz XCLKIN).
//
//   For 100 MHz devices:
//   divides SYSCLKOUT by four to reach a 25.0Mhz HSPCLK
//   (assuming a 20Mhz XCLKIN).
//
//   Interrupts are enabled and the ePWM1 is setup to generate a periodic
//   ADC SOC on SEQ1. Two channels are converted, ADCINA3 and ADCINA2.
//
//   Watch Variables:
//
//         Voltage1[10]     Last 10 ADCRESULT0 values
//         Voltage2[10]     Last 10 ADCRESULT1 values
//         ConversionCount  Current result number 0-9
//         LoopCount        Idle loop counter
//
//
//###########################################################################
//
// Original Author: D.F.
//
// $TI Release: 2833x/2823x Header Files V1.32 $
// $Release Date: June 28, 2010 $
//###########################################################################

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

// Prototype statements for functions found within this file.
interrupt void adc_isr(void);

// Global variables used in this example:
Uint16 LoopCount;
Uint16 ConversionCount;
Uint16 Voltage1;
Uint16 Voltage2;


main()
{

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


   EALLOW;
   #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
   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

// 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();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected register
   PieVectTable.ADCINT = &adc_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers

// 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

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

// Enable ADCINT in PIE
   PieCtrlRegs.PIEIER1.bit.INTx6 = 1;
   IER |= M_INT1; // Enable CPU Interrupt 1
   EINT;          // Enable Global interrupt INTM
   ERTM;          // Enable Global realtime interrupt DBGM

   LoopCount = 0;
   ConversionCount = 0;

// Configure ADC
   AdcRegs.ADCMAXCONV.all = 0x0001;       // Setup 2 conv's on SEQ1
   AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv.
   AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv.
   AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1;  // Enable SEQ1 interrupt (every EOS)

// Assumes ePWM1 clock is already enabled in InitSysCtrl();
   EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group
   EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount
   EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event
   EPwm1Regs.CMPA.half.CMPA = 0x0080;      // Set compare A value
   EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1
   EPwm1Regs.TBCTL.bit.CTRMODE = 0;          // count up and start

// Wait for ADC interrupt
   for(;;)
   {

   }

}


interrupt void  adc_isr(void)
{

 Voltage1 = AdcRegs.ADCRESULT0 >>4;
 Voltage2 = AdcRegs.ADCRESULT1 >>4;



  // Reinitialize for next ADC sequence
  AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
  AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
  PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE

  return;
}



  • Hi Amit,

    If there is no signal driven onto the ADC pin erratic and random results are expected.

  • Hi Devin,

    which pin is associated with AdcRegs.ADCRESULT0 >>4 buffer
    & which pin is associated with AdcRegs.ADCRESULT1 >>4 buffer and why is the 16bit result shifted 4 bits right
  • Hi Amit,

    Any pin can be associated to the ADCRESULT0 register.  It depends on the configuration of the channel select register for conversion 0.  The relevant portion of your code is here:

       AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // Setup ADCINA3 as 1st SEQ1 conv.

    The ADCRESULT registers are a 12-bit value, left aligned.  The mirror registers are a 12-bit value, right aligned.

    Have a read-through of the ADC user guide here:

     

  • Thank you Devin for above. I tried v141 adc soc code from control suite and it WORKS. I am also trying to set sampling time (I am assuming sampling time and interrrupt time for adc is the same and set by follwing code.

      EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group

      EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount

      EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event

      EPwm1Regs.CMPA.half.CMPA = 0x0080;      // Set compare A value

      EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1

      EPwm1Regs.TBCTL.bit.CTRMODE = 0;          // count up and start

    What value should I set to EPwm1Regs.CMPA.half.CMPA  &  EPwm1Regs.TBPRD to get 1ms sampling time?

     

     

  • Thank you Devin for above. I tried v141 adc soc code from control suite and it WORKS. I am also trying to set sampling time (I am assuming sampling time and interrupt time for adc is the same and set by following code.

     EPwm1Regs.ETSEL.bit.SOCAEN = 1;        // Enable SOC on A group

     EPwm1Regs.ETSEL.bit.SOCASEL = 4;       // Select SOC from from CPMA on upcount

     EPwm1Regs.ETPS.bit.SOCAPRD = 1;        // Generate pulse on 1st event

     EPwm1Regs.CMPA.half.CMPA = 0x0080;      // Set compare A value

     EPwm1Regs.TBPRD = 0xFFFF;              // Set period for ePWM1

     EPwm1Regs.TBCTL.bit.CTRMODE = 0;          // count up and start

    What value should I set to EPwm1Regs.CMPA.half.CMPA  &  EPwm1Regs.TBPRD to get 1ms sampling time?

  • Hi Amit Aryal,

    First, you should define what frequency you supply for ePWM module. (TBCLK)

    Then you will know how long it takes for counter to increase +1 (assuming x_value). After that 1ms/x_value = TBPRD

    You can set for count up mode and CMPA = TBPRD at value of 1ms. Or count up and count down mode (interrupt appear at CMPA=0 and CMPA = TBPRD) 

    Thanks & Regards

    Duc-Dung Le

  • Clock for TMS320F28335 is 150Mz, does this mean TBCLK will also be 150MHZ?
  • Hi Amit Aryal,

    Clock for TMS320F28335 is 150Mz, does this mean TBCLK will also be 150MHZ?

    Yes, If you do not prescale TBCLK from SYSCLKOUT.

    Ex:  F=150Mhz. => T_TBCLK=1/(150.10^6) s   (frequency -> time cycle)

    T1=1ms=(TBPRD+1)xT_TBCLK

    So now you can calculate TBPRD. It is just example. You can refer or prescale TBCLK from TBCTL register in datasheet.

    Anyway I think you should read reference guide of ePWM module, after that you can understand it clearly.

    Thanks & Regards

    Duc-Dung Le

  • One last question, how do I prescale 150MHz  down to 50MHz, what control register is used to change the prescale factor.

    Thanks,

    Amit aryal