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.

adc sample timing of 4 sample

Other Parts Discussed in Thread: MSP430G2553

hi i am using 8mhz clk , & controller msp430g2553.h

BCSCTL1 = CALBC1_8MHZ; // Set range
DCOCTL = CALDCO_8MHZ;

my adc configuration is 

ADC10CTL0 = ADC10SHT_1+ ADC10IE+MSC+SREF_0+ADC10ON;
ADC10CTL1 = INCH_7 + SHS_0+CONSEQ_2;//+ADC10DIV_7;//+ADC10SSEL_0; // P1.7 A7 channel select
ADC10AE0 = 0x80; // P1.7 ADC10 option select
ADC10DTC1=0x04;
ADC10DTC0=0x40;

when an interrupt occurs at rising edge my adc starts reading,(i am giving pwm pulse at P1.7 with Ton=20us & Toff=230us @ 4khz frequency).I am setting a bit and resetting it for taking the time duration of my adc

P1OUT=0x40;        //setting a bit

ADC10CTL0 |= ENC+ADC10SC ; // ADC10 enable set
ADC10SA = (int)adc;
avg_adc=((adc[0]+adc[1]+adc[2]+adc[3])/4);
P1OUT&=~0x40;       //resetting a bit 

when i put scope at P1.6 my adc is ON for only 1.6us remaining 248.5 it is off .BUt in data sheet it given 200ksps (i.e)5us per sample For 4 (adc[0]+adc[1]+adc[2]+adc[3])samples 20us i calculated 

But for me all sample are taking at 1.6us .Am i setting and resetting the bit at correct position 

pls help me in how to find the adc timing sample

  • Hello qwert,

    I do not think you are actually waiting for the ADC conversions to finish before turning off P1.6.  Without using a while statement or interrupt you will be resetting P1.6 before making sure that the conversions have actually been completed.  Attached is some demo code, there are a few things that need to be changed but it still follows the same template of what you are trying to accomplish with your code.  Just reduce the number of conversions, conversion speed, output pin, and ADC pin input options to fit your design.  This code goes into LPM0 mode after starting conversions and will only be forced out of LPM0 after the ADC10 ISR which indicates that the conversion is finished.

    /* --COPYRIGHT--,BSD_EX
     * Copyright (c) 2012, Texas Instruments Incorporated
     * All rights reserved.
     *
     * 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.
     *
     *******************************************************************************
     * 
     *                       MSP430 CODE EXAMPLE DISCLAIMER
     *
     * MSP430 code examples are self-contained low-level programs that typically
     * demonstrate a single peripheral function or device feature in a highly
     * concise manner. For this the code may rely on the device's power-on default
     * register values and settings such as the clock configuration and care must
     * be taken when combining code from several examples to avoid potential side
     * effects. Also see www.ti.com/grace for a GUI- and www.ti.com/msp430ware
     * for an API functional library-approach to peripheral configuration.
     *
     * --/COPYRIGHT--*/
    //******************************************************************************
    //  MSP430G2x33/G2x53 Demo - ADC10, DTC Sample A1 32x, AVcc, Repeat Single, DCO
    //
    //  Description: Use DTC to sample A1 32 times with reference to AVcc. Software
    //  writes to ADC10SC to trigger sample burst. In Mainloop MSP430 waits in LPM0
    //  to save power until ADC10 conversion burst complete, ADC10_ISR(DTC) will
    //  force exit from any LPMx in Mainloop on reti. ADC10 internal oscillator
    //  times sample period (16x) and conversion (13x). DTC transfers conversion
    //  code to RAM 200h - 240h. P1.0 set at start of conversion burst, reset on
    //  completion.
    //
    //                MSP430G2x33/G2x53
    //             -----------------
    //         /|\|              XIN|-
    //          | |                 |
    //          --|RST          XOUT|-
    //            |                 |
    //        >---|P1.1/A1      P1.0|-->LED
    //
    //  D. Dang
    //  Texas Instruments Inc.
    //  December 2010
    //   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
    //******************************************************************************
    #include <msp430.h>
    
    int main(void)
    {
      WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
      ADC10CTL1 = CONSEQ_2 + INCH_1;            // Repeat single channel, A1
      ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; // ADC10ON, interrupt enabl
      ADC10DTC1 = 0x20;                         // 32 conversions
      ADC10AE0 |= 0x02;                         // P1.1 ADC option select
      P1DIR |= 0x01;                            // Set P1.0 to output direction
    
      for (;;)
      {
        ADC10CTL0 &= ~ENC;
        while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
        ADC10SA = 0x200;                        // Data buffer start
        P1OUT |= 0x01;                          // Set P1.0 LED on
        ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
        __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
        P1OUT &= ~0x01;                         // Clear P1.0 LED off
      }
    }
    
    // ADC10 interrupt service routine
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(ADC10_VECTOR))) ADC10_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
    }
    
     

    Regards,

    Ryan

  • You’re using ADC10OSC, which is running between 3,7 and 6.5MHz. This means 153 to 270ns per clock tick. Sampling takes 8 clock ticks and conversion takes 13. So each conversion cycle takes between 3.23 and 5.675µs

    However, in your code snippet, you enable conversion, set the DTC destination address and then you work on results that haven’t be sampled yet. You should wait until the ADC is done and the DTC has collected all four results.
    It appears you are starting the ADC in the timer ISR but then you don’t wait for the conversion to be complete. You should rather start the conversion in the timer interrupt and then exit the timer ISR and wait for the ADC10 interrupt.

    In the ADC10 interrupt, you should stop the ADC and process the results.
    Note that in CONSEQ_2, the ADC continues converting, even after the DTC is done with collecting 4 results. So while you’ll get one ADC10 interrupt when the DTC is done, you’re getting one additional interrupt for every further conversion result. (at 4 times the speed then)

  • sir you said conversion cycle takes between 3.23 and 5.675µs  is this for 1 sample or for 4 saples time 

    and

    i need to know the how u got 3.23µs sir

  • sir 1 question

    my adc should take sample only at every 250us

    how should i do that   

  • You could set up a timer interrupting your program every 250µs to trigger an ADC sample.

  • qwert trewq said:
    i need to know the how u got 3.23µs sir

    Easy. Read User' s manual SLAU144, chapter 22.2.5 Sample and Conversion Timing

  • Any example code is there 

  • qwert trewq said:
    Any example code is there 

    Yes. You can find sample code in product web page. Look for slac485 in your (msp430g2553) case.

    msp430x20x2_adc10_13.c shows how to use both DTC and Timer

**Attention** This is a public forum