zoukankan      html  css  js  c++  java
  • MSP430G2553 模数转换器 ADC10

    一、ADC10组成

    ADC10模块是MSP430 MCU内部的一个高性能、10位的模数转换器,包含了SAR(Successive-Approximation-Register) core、采样选择控制、基准源发生器和DTC(Data Transfer Controller)。DTC功能允许采样结果直接内部存储,而不需要CPU的干预。

    ADC10的框图和主要寄存器的含义,如下图所示。虽然ADC10牵扯的寄存器配置很多,但实际使用起来并不复杂。

    二、相关寄存器

    主要寄存器及功能有:

    ADC10AEx:模拟输入使能,用于使能某个管脚的模拟输入功能

    ADC10MEM:保存AD转换的结果

    ADC10CTL0:

    - ADC10ON:开启/关闭ADC10

    - ENC:Enable conversion。几乎所有的ADC10设置都要在ENC=0时进行。

    - ADC10SC:Start conversion。开始转换后会自动清零。

    - SREFx:选择正负基准源

    - REFOUT、REFBURST、REF2_5V、REFON:选择内部基准源及其工作方式

    - ADC10SHTx:选择采集和保持的时钟周期数目

    - ADC10SR:选择reference buffer drive capability,影响最大采集速率

    - ADC10IE、ADC10IFG:中断使能和中断标志位

    - MSC:多次采集转换设置,只用于序列(sequence)或反复(repeated)模式采样。

    ADC10CTL1:

    - INCHx:输入通道选择,可选择外部管脚、基准源、内部温度传感器等。

    - SHSx:选择采样信号由谁触发,默认是ADC10SC位,也可以是TimerA.OUTx。

    - ADC10DF:转换数据格式,直接二进制或者二补码。

    - ADC10SSELx、ADC10DIVx:选择ADC10的时钟,分频比。时钟默认采用ADC10内部的专门时钟ADC10OSC,频率约在5MHz左右。

    - CONSEQx:选择模式,有单通道单次(默认)、多通道单次、单通道重复、多通道重复四种。

    - ADC10BUSY:标志ADC10是否采样、转换完成。

    如果使用到DTC的功能,还需要操作ADC10DTC0、ADC10DTC1、ADC10SA寄存器,具体可查看MSP430x2xx Family User's Guide。

    三、代码示例

    利用ADC10,每2秒读取一次A6(P1.6)通道上的电压,通过串口打印显示。

      1 // voltage meter 2015.10.1
      2 // for MSPG2 launchpad, VCC = 3.6V; and if Vcc changes,
      3 // ref_vcc should be modified.
      4 
      5 #include "io430.h"
      6 
      7 #define A6 BIT6 // ADC input pin P1.6
      8 #define RXD BIT1 //P1.1
      9 #define TXD BIT2 //P1.2
     10 
     11 #define IDLE 0
     12 #define BUSY 1
     13 
     14 // function definitions
     15 void initADC10(void);
     16 void initTA0(void);
     17 
     18 void sendByte(unsigned char);
     19 void printf(char *, ...);
     20 void initUART(void);
     21 
     22 // global variables
     23 float volts = 0.0; // unit: mV
     24 float ref_vcc = 3600.0;
     25 char i = 0;
     26 char status = IDLE;
     27 
     28 void main( void )
     29 {
     30   // Stop watchdog timer to prevent time out reset
     31   WDTCTL = WDTPW + WDTHOLD;
     32   
     33   // DCO setup
     34   BCSCTL1 = CALBC1_1MHZ;
     35   DCOCTL = CALDCO_1MHZ;
     36   
     37   // ADC10 setup
     38   initADC10();
     39   
     40   // UART setup
     41   initUART();
     42   
     43   // Timer0 setup
     44   initTA0();
     45   
     46   __enable_interrupt();
     47   
     48   LPM0;
     49 
     50   while(1)
     51   {
     52       switch(status)
     53       {
     54       case IDLE:
     55           break;
     56       case BUSY:
     57           ADC10CTL0 |= ADC10SC;   // start a new conversion
     58           while ((ADC10CTL1 & ADC10BUSY) == 0x01);   // wait for conversion to end
     59           volts = ADC10MEM * ref_vcc /1023.0;
     60           printf("Voltage:  %i mV
    ", (int)volts);
     61           status = IDLE;
     62           break;
     63       }
     64       LPM0;
     65   
     66   }
     67 }
     68 
     69 void initADC10(void)
     70 {
     71     // Use Vcc(3.6V)/GND for Refs, 16 x ADC10CLKs, reference buffer on, turn on ADC
     72     ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10SR + ADC10ON;
     73     
     74     // A6 input, use ADC10CLK div 1, single channel mode  
     75     ADC10CTL1 =  INCH_6 + SHS_0 + ADC10SSEL_0 + ADC10DIV_0 + CONSEQ_0;
     76     
     77     // ADC input on P1.6
     78     ADC10AE0 = A6; 
     79     
     80     // Enable conversions
     81     ADC10CTL0 |= ENC;     
     82 }
     83 
     84 void initTA0(void)
     85 {  
     86     TA0CCR0 = 62550 - 1;
     87     TA0CCTL0 = CCIE; // enable compare interrupt
     88     TA0CTL = TASSEL_2 + ID_3 + MC_1 + TACLR;
     89     // input clock: SMCLK/8 -> 125kHz; Up to CCR0 mode
     90     // timer overflow freq: 125k/(TA0CCR0+1) -> 2Hz -> 500ms
     91     // clear and start the timer, up mode
     92 }
     93 
     94 void initUART(void) {  
     95     //config P1.1 RXD, P1.2 TXD
     96     P1SEL |= TXD + RXD;
     97     P1SEL2 |= TXD + RXD;
     98         
     99     //reset UCA0, to be configured
    100     UCA0CTL1 = UCSWRST;
    101     //config
    102     UCA0CTL1 |= UCSSEL_2; //SMCLK
    103     UCA0BR0 = 104;
    104     UCA0BR1 = 0;//1MHz baut rate = 9600
    105     UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
    106     //make UCA0 out of reset
    107     UCA0CTL1 &= ~UCSWRST;
    108 }
    109 
    110 void sendByte(unsigned char byte )
    111 {
    112     while (!(IFG2&UCA0TXIFG));            // USCI_A0 TX buffer ready?
    113     UCA0TXBUF = byte;                // TX -> RXed character
    114 }
    115 
    116 //interrupt service routines
    117 #pragma vector = TIMER0_A0_VECTOR
    118 __interrupt void CCR0_ISR(void)
    119 {
    120     if(++i == 4) // interval: 1/2 * 4 = 2s, freq: 0.5Hz
    121     {
    122         // automatic flag clearing
    123         i = 0;
    124         status = BUSY;
    125         LPM0_EXIT;
    126     }
    127 }

     

  • 相关阅读:
    AFO NOI2018退役——菜鸡一直是菜鸡
    NOI前总结
    洛谷3732:[HAOI2017]供给侧改革——题解
    BZOJ4037:[HAOI2015]数字串拆分——题解
    洛谷4717:【模板】 快速沃尔什变换——题解
    BZOJ3192:[JLOI2013]删除物品——题解
    BZOJ2288:[POJ Challenge]生日礼物——题解
    BZOJ1150:[APIO/CTSC2007]数据备份——题解
    BZOJ3155:Preprefix sum——题解
    Codility---FrogRiverOne
  • 原文地址:https://www.cnblogs.com/zlbg/p/4850881.html
Copyright © 2011-2022 走看看