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.

TMS320F28069: Measure ADC value

Part Number: TMS320F28069

hi all. I'm trying to check adc output of my mcu. i used available C2000 example for AdcSoc. there what i did was i supply 3.3V and 0V to my setup and measure the output adc value. for 0V it displays 635 digital output and for 3.3V it displays 3025 value. i measure the voltages at the pin using multimeter and it gives the exact value. i wanted to know why i got this deviated value.

  • Hello Bhashini,

    Please see the ADC: Initial Conversion advisory in the F2806x Errata, this note is made about doing an initial conversion. Do you see this problem on every/multiple conversions  in sequence, or just the first conversion in a sequence? This is most likely the reason why.

    Best regards,

    Omer Amir

  • i got this error for everytime.

  • Hello Bhashini,

    Have you verified that the VREFHI and VREFLO are correct for the ADC? Are you using internal or external reference? Are you using interrupts, and if so have you verified there is sufficient sample/hold time for sampling the ADC?

    Best regards,

    Omer Amir

  • //###########################################################################
    //
    // FILE:   Example_2806xAdcSoc.c
    //
    // TITLE:  ADC Start of Conversion Example
    //
    //! \addtogroup f2806x_example_list
    //! <h1> ADC Start of Conversion (adc_soc)</h1>
    //! 
    //! This ADC example uses ePWM1 to generate a periodic ADC SOC - ADCINT1.
    //! Two channels are converted, ADCINA4 and ADCINA2.
    //! 
    //! \b Watch \b Variables \n
    //! - Voltage1[10]    - Last 10 ADCRESULT0 values
    //! - Voltage2[10]    - Last 10 ADCRESULT1 values
    //! - ConversionCount - Current result number 0-9
    //! - LoopCount       - Idle loop counter
    //
    //###########################################################################
    // $TI Release: $
    // $Release Date: $
    // $Copyright:
    // Copyright (C) 2009-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //###########################################################################
    
    //
    // Included Files
    //
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    //
    // Function Prototypes
    //
    __interrupt void adc_isr(void);
    void Adc_Config(void);
    
    //
    // Globals
    //
    Uint16 LoopCount;
    Uint16 ConversionCount;
    Uint16 Voltage1[10];
    Uint16 Voltage2[10];
    
    //
    // Main
    // 
    void main(void)
    {
        //
        // Step 1. Initialize System Control:
        // PLL, WatchDog, enable Peripheral Clocks
        // This example function is found in the F2806x_SysCtrl.c file.
        //
        InitSysCtrl();
    
        //
        // Step 2. Initialize GPIO:
        // This example function is found in the F2806x_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 F2806x_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 F2806x_DefaultIsr.c.
        // This function is found in F2806x_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.ADCINT1 = &adc_isr; //interrupt service request
        EDIS;    // This is needed to disable write to EALLOW protected registers
    
        //
        // Step 4. Initialize all the Device Peripherals:
        // This function is found in F2806x_InitPeripherals.c
        // InitPeripherals(); // Not required for this example
        //
        InitAdc();  // For this example, init the ADC
        AdcOffsetSelfCal();//ADC Zero Offset Calibration
    
        //
        // Step 5. User specific code, enable interrupts:
        //
    
        //
        // Enable ADCINT1 in PIE
        //
        PieCtrlRegs.PIEIER1.bit.INTx1 = 1; // Enable INT 1.1 in the PIE
        IER |= M_INT1; 					   // Enable CPU Interrupt 1
        EINT;          					   // Enable Global interrupt INTM
        ERTM;          					   // Enable Global realtime interrupt DBGM
    
        LoopCount = 0;
        ConversionCount = 0;
    
        //
        // Configure ADC
        //
        EALLOW;
        AdcRegs.ADCCTL2.bit.ADCNONOVERLAP = 1; // Enable non-overlap mode - overlap sample is not allowed
        
        //
        // ADCINT1 trips after AdcResults latch
        //
        AdcRegs.ADCCTL1.bit.INTPULSEPOS	= 1; // INt Pulse generation occurs 1 cycle prior to ADC result latching into its result register
        
        AdcRegs.INTSEL1N2.bit.INT1E     = 1;  // Enabled ADCINT1
        AdcRegs.INTSEL1N2.bit.INT1CONT  = 0;  // Disable ADCINT1 Continuous mode
        
        //
        // setup EOC1 to trigger ADCINT1 to fire
        //
        AdcRegs.INTSEL1N2.bit.INT1SEL 	= 1;
        
        AdcRegs.ADCSOC0CTL.bit.CHSEL 	= 4;  // set SOC0 channel select to ADCINA4
        AdcRegs.ADCSOC1CTL.bit.CHSEL 	= 2;  // set SOC1 channel select to ADCINA2
        
        //
        // set SOC0 start trigger on EPWM1A, due to round-robin SOC0 converts
        // first then SOC1
        //
        AdcRegs.ADCSOC0CTL.bit.TRIGSEL 	= 5;
        
        //
        // set SOC1 start trigger on EPWM1A, due to round-robin SOC0 converts 
        // first then SOC1
        //
        AdcRegs.ADCSOC1CTL.bit.TRIGSEL 	= 5;
        
        //
        // set SOC0 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
        //
        AdcRegs.ADCSOC0CTL.bit.ACQPS 	= 6;
        
        //
        // set SOC1 S/H Window to 7 ADC Clock Cycles, (6 ACQPS plus 1)
        //    
        AdcRegs.ADCSOC1CTL.bit.ACQPS 	= 6;
        EDIS;
    
        //
        // 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 CMPA 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(;;)
        {
            LoopCount++;
        }
    }
    
    //
    // adc_isr - 
    //
    __interrupt void
    adc_isr(void)
    {
        Voltage1[ConversionCount] = AdcResult.ADCRESULT0;
        Voltage2[ConversionCount] = AdcResult.ADCRESULT1;
        
        //
        // If 20 conversions have been logged, start over
        //
        if(ConversionCount == 9)
        {
            ConversionCount = 0;
        }
        else
        {
            ConversionCount++;
        }
    
        //
        // Clear ADCINT1 flag reinitialize for next SOC
        //
        AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;
        
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
    
        return;
    }
    
    //
    // End of File
    //
    
    

    1.Hi. Above is the code i used to test. I used TMS320F28069 development board and supply 3.3V and 0V to  ADCINA4 and ADCINA2 pins. i used 3.3V pin in the development board to supply 3.3V and ground to supply 0V. i connected these pins using jumper wires. then build and debug the above example and use live expressions to see the values of Voltage1 and Voltage2. but as per the calculations the expected values for 0V is 0 and 3.3V is 4095. but i didnt observe those values in the live expression. i need to solve this error first.

    2. Then i need to change the above code so that it displays the output of ADCINB1 which is 29th pin in the above mentioned MCU. 

  • Hello Bhashini,

    Have you already verified that the ACQPS is sufficient for the signal connected to the pin? This value is set based on the impedance of the circuit supplying this voltage, you can see section 8.2.1 ADC Acquisition (Sample and Hold) Window for more information on this.

    What sort of device are you using, is it a controlCARD? Additionally, can you show me an image of your scope of the signals for 0V and 3.3V? Have you also scoped the rails of the device to make sure they are within the expected range?

    Best regards,

    Omer Amir

  • Hello Omer, thank you for your support. when i change the ACQPS to 25 it works as i expected. Thank you very much.