launchpad_adc10学习笔记

523335234   2012-5-27 00:03 楼主

ADC10特性:

 八通道输入,其中两通道用于测试内部VCC以及内部温度。高达200Ksps的采样率,可以软件选择内部的2.5V1.5V作为参考电压,四种采样模式,比其他系列多出的功能最明显的就是数据传输控制器,能直接把转换结果送到用户指定的地址,而不需CPU干预,有点像DMA

1.jpg

ADC10的时钟源:

ACLK,SMCLK,MCLK以及ADC10OSC

ADC10的转换结果数字表示:

NADC=1023  *  ((Vin-Vr-) /(Vr+- Vr-))

ADC10输入口的选择:

通过ADC10AEx选择通道:

如选择通道1: ADC10AE0=INCH_1;

关于ADC10时钟和采样保持时间的区别:

2.jpg

一个模拟到数字的转换从SHI上升沿开始,SHI时钟源可以通过设置ADC10CTL0中的SHSx来选择,有ADC10SC位,以及定时器A

因此我们见到启动ADC10时,会有ADC10CTL0 |= ENC + ADC10SCADC10CTL0中的MSC位时用在多次转换中,只需第一次需要ADC10SC触发采样,后面的都不用了。下一个采样会自动开始于上一个转换结束时。当用于单次重复采样时,假如复位ENC后,重新开始重复采样时,也必须这样开始ADC10CTL0 |= ENC + ADC10SC

Tsample可以通过设置ADC10CTL0中的ADC10SHTx来选择,4*ADC10CLK8*ADC10CLK等。

因此一次实际的电压采样转换速度并不是ADC10CLK,而是ADC10CLK/Tsync+Tsample+ADC10CLK*13)


回复评论 (2)

下面贴个源码,一起学习
//******************************************************************************
//  MSP430G2x33/G2x53 Demo - ADC10, DTC Sample A10 32x, 1.5V, Repeat Single, DCO
//
//  Description: Use DTC to sample A10 32 times with reference to internal 1.5v.
//  Vref Software writes to ADC10SC to trigger sample burst. In Mainloop MSP430
//  waits in LPM0 to save power until ADC10 conversion complete, ADC10_ISR(DTC)
//  will force exit from any LPMx in Mainloop on reti. (ADC10OSC/4)/64
//  determines sample time which needs to be greater than 30us for temperature
//  sensor. DTC transfers conversion code to RAM 200h - 240h. P1.0 set at start
//  of conversion burst, reset oncompletion. Temperature sensor offset and slope
//  will vary from device to device per datasheet tolerance.
//
//                MSP430G2x33/G2x53
//             -----------------
//         /|\|              XIN|-
//          | |                 |
//          --|RST          XOUT|-
//            |                 |
//            A7          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  "msp430g2553.h"
unsigned short tempdata[32];
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                   // Stop WDT
  ADC10CTL1 = INCH_7 + ADC10DIV_3 + CONSEQ_2;  
  ADC10CTL0 = SREF_1 + ADC10SHT_3 + MSC + REFON + ADC10ON + ADC10IE+REF2_5V;
  ADC10AE0  = 0x80;                         // A7
  __enable_interrupt();                     // Enable interrupts.
  TACCR0 = 30;                              // Delay to allow Ref to settle
  TACCTL0 |= CCIE;                          // Compare-mode interrupt.
  TACTL = TASSEL_2 + MC_1;                  // TACLK = SMCLK, Up mode.
  LPM0;                                     // Wait for delay.
  TACCTL0 &= ~CCIE;                         // Disable timer Interrupt
  __disable_interrupt();
  ADC10DTC1 = 0x20;                         // 32 conversions
  P1DIR |= 0x01;                            // Set P1.0 output
  
  for (;;)
  {
    ADC10CTL0 &= ~ENC;                      //Sampling and conversion  stop  
    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = (unsigned short)tempdata;     // Data buffer start
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
   
    if(tempdata[0]>0x1ff)
     P1OUT |= 0x01;
    else P1OUT &= ~0x01;
  }
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
  __bic_SR_register_on_exit(CPUOFF);        // Clear CPUOFF bit from 0(SR)
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void ta0_isr(void)
{
  TACTL = 0;
  LPM0_EXIT;                                // Exit LPM0 on return
点赞  2012-5-27 00:03
学习中
点赞  2012-5-27 21:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复