• msp430学习笔记-ADC12


    本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013748.HTM

     MSP430单片机的ADC12模块是一个12位精度的A/D转换模块,它具有高速度,通用性等特点。从以下ADC12结构框图中可以看出,ADC12模块是由以下部分组成:输入的16路模拟开关,ADC内部参考电压源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等。

    ADC12OSC默认为5MHZ

    ADC采样频率问题:http://www.amobbs.com/thread-5509957-1-1.html

             http://bbs.elecfans.com/jishu_424114_1_1.html

    一、ADC12转换模式

    ADC12提供4种转换模式:

    单通道单次转换

    对选定的通道进行单次转换要进行如下设置:
    x=CSStartAdd,指向转换开始地址
    ADC12MEMx存放转换结果
    ADC12IFG.x为对应的中断标志
    ADC12MCTLx寄存器中定义了通道和参考电压
    转换完成时必须使ENC再次复位并置位(上升沿),以准备下一次转换。在ENC复位并再次置位之前的输入信号将被忽略。

    序列通道单次转换

    对序列通道进行单次转换要进行如下设置:
    x=CSStartAdd,指示转换开始地址
    EOS(ADC12MCTLx.7)=1标志序列中最后通道y,非最后通道的EOS位都是0,表示序列没有结束。
    ADC12MEMx,...ADC12MEM.y存放转换结果
    ADC12IFG.x,...ADC12IFG.y为对应的中断标志
    ADC12MCTLx寄存器中定义了通道和参考电压
    转换完成时必须使ENC再次复位并置位(上升沿),以准备下一次转换。在ENC复位并再次置位之前的输入信号将被忽略。

    单通道多次转换

    对选定的通道进行多次转换,直到关闭该功能或ENC=0。进行如下设置:
    x=CSStartAdd,指向转换开始地址
    ADC12MEMx存放转换结果 
    ADC12MCTLx寄存器中定义了通道和参考电压
    在这种模式下,改变转换模式,不必先停止转换,在当前正在进行的转换结束后,可改变转换模式。该模式的停止可有如下几种办法:
    使用CONSEQ=0的办法,改变为单通道单次模式。
    使用ENC=0直接使当前转换完成后停止。
    使用单通道单次模式替换当前模式,同时使ENC=0

    序列通道多次转换

    对序列通道进行多次转换,直到关闭该功能或ENC=0。进行如下设置:
    x=CSStartAdd,指示转换开始地址
    EOS(ADC12MCTLx.7)=1标志序列中最后通道y。 
    ADC12MCTLx寄存器中定义了通道和参考电压
    改变转换模式,不必先停止转换。一旦改变模式(单通道单次模式除外),将在当前序列完成后立即生效

    不论用户使用何种转换模式,都要处理以下问题:

    设置具体模式
    输入模拟信号
    关注转换结束信号
    存放转换数据以及采用查询或者中断方式读取数据

     二、ADC12寄存器说明

    ADC12模块的所有寄存器

     

    1.ADC12CTL0 控制寄存器0,各位定义:

    15~12 11~8 7

    6

    5

    4

    3

    2

    1

    0

    SHT1 SHT0 MSC 2.5V REF
    ON
    ADC12
    ON
    ADC12
    TOVIE
    ADC12
    TVIE
    ENC ADC12
    SC

    ADC12SC——采样/转换控制位。在不同条件下,ADC12SC的含义如下所示:

    ENC=1
    ISSH=0

    SHP=1 ADC12SC由0变为1启动A/D转换
    A/D转换完成后ADC12SC自动复位
    SHP=0 ADC12SC保持高电平采样
    ADC12SC复位时启动一次转换

    ENC——转换允许位。

    0:ADC12为初始状态,不能启动A/D转换;
    1:首次转换由SAMPCON上升沿启动

    ADC12TVIE——转换时间溢出中断允许位(当前转换还没完成时,又发生一次采样请求,则会发生转换时间溢出)

    0:没发生转换时间溢出
    1:发生转换时间溢出

    ADC12OVIE——溢出中断允许位(当ADC12MEMx中原有数据还没有读出,而又有新的转换结果数据要写入时,则发生溢出)

    0:没发生溢出
    1:发生溢出

    ADC12ON——ADC12内核控制位

    0:关闭ADC12内核
    1:打开ADC12内核

    REFON——参考电压控制位

    0:内部参考电压发生器关闭
    1:内部参考电压发生器打开

    2.5V——内部参考电压的电压值选择位

    0:选择1.5V内部参考电压
    1:选择2.5V内部参考电压

    MSC——多次采样转换位(CONSEQ<>0表示当前转换模式不是单通道单次转换)

    有效条件

    MSC值

    含义

    SHP=1
    CONSEQ<>0
    0 每次转换需要SHI信号的上升沿触发采样定时器
    1 仅首次转换由SHI信号的上升沿触发采样定时器,而后采样转换将在前一次转换完成后立即进行

    SHT1、SHT0——采样保持定时器1,采样保持定时器0

    分别定义保存在转换结果寄存器ADC12MEM8~ADC12MEM15和ADC12MEM0~ADC12MEM7中的转换采样时序与采样时钟ADC12CLK的关系。采样周期是ADC12CLK周期乘4的整数倍,即:

    SHITx

    0

    1

    2 3 4 5 6 7 8 9 10 11 12~15
    n 1 2 4 8 16 24 32 48 64 96 128 192 256

    2.ADC12CTL1 转换控制寄存器1(大多数3~15位,只有在ENC=0时才可被修改),各位定义:

    15~12 11~10

    9

    8

    7~5

    4、3

    2、1

    0

    CSSTARTADD SHS SHP ISSH ADC12
    DIV
    ADC12
    SSEL
    CONSEQ

    ADC12
    BUSY

    CSSTARTADD——转换存储器地址位。该4位所表示的二进制数0~15分别对应ADC12MEM0~15。可以定义单次转换地址或序列转换的首地址。

    SHS——采样触发输入源选择位。

    0:ADC12SC
    1:Timer_A.OUT1
    2:Timer_B.OUT0
    3:Timer_B.OUT1

    SHP——采样信号(SAMPCON)选择控制位。

    0:SAMPCON源自采样触发输入信号
    1:SAMPCON源自采样定时器,由采样输入信号的上升沿触发采样定时器

    ISSH——采样输入信号方向控制位

    0:采样输入信号为同向输入
    1:采样输入信号为反向输入

    ADC12DIV——ADC12时钟源分频因子选择位。分频因子为该3位二进制数加1

    ADC12SSEL——ADC12内核时钟源选择

    0:ADC12内部时钟源——ADC12OSC
    1:ACLK
    2:MCLK
    3:SMCLK

    CONSEQ——转换模式选择位

    0:单通道单次转换模式
    1:序列通道单次转换模式
    2:单通道多次转换模式
    3:序列通道多次转换模式

    ADC12BUSY——ADC12忙标志(只用于单通道单次转换模式,在其它转换模式下,该位无效)

    0:表示没有活动的操作
    1:表示ADC12正处于采样期间、转换期间或序列转换期间

    3.ADC12MEM0~ADC12MEM15 转换存储寄存器

    该组寄存器均为16位寄存器,用来存放A/D转换结果。中用其中低12位,高4位在读出时为0

    4.ADC12MCTLx 转换存储控制寄存器(所有位只有在ENC为低电平时可修改,在POR时各位被复位)

    对于每个转换存储器有一个对应的转换存储器控制寄存器,所以在进行CSSTARTADD转换存储器地址位设置的同时,也确定了ADC12MCTLx。该寄存器各位含义如下:

    7 6,5,4

    3,2,1,0

    EOS SREF INCH

    EOS——序列结束控制位

    0:序列没有结束
    1:该序列中最后一次转换

    SREF——参考电压源选择位

    0:Vr+=AVcc,Vr-=AVss
    1:Vr+=VREF+,Vr-=AVss
    2,3:Vr+=VEREF+,Vr-=AVss
    4:Vr+=AVcc,Vr-=VREF-/VEREF-
    5:Vr+=VREF+,Vr-=VREF-/VEREF-
    6,7:Vr+=VEREF+,Vr-=VREF-/VEREF-

    INCH——选择模拟输入通道

    0~7:A0~A7
    8:VeREF+
    9:VREF-/VeREF-
    10:片内温度传感器的输出
    11~15:(AVCC-AVSS)/2

    5.ADC12IFG 中断标志寄存器 为16位,其中中断标志位ADC12IFG.x对应于转换存储寄存器ADC12MEMx。各位含义如下:

    15 14

    ......

    1 0
    ADC12
    IFG15
    ADC12
    IFG14
    ...... ADC12
    IFG1
    ADC12
    IFG0

    ADC12IFG.x置位:转换结束,并且转换结果已经装入转换存储寄存器。
    ADC12IFG.x复位:ADC12MEMx被访问。

    6.ADC12IE 中断使能寄存器 为16位,对应于ADC12IFG寄存器。各位含义如下:

    15 14

    ......

    1 0
    ADC12
    IE.15
    ADC12
    IE.14
    ...... ADC12
    IE.1
    ADC12
    IE.0

    ADC12IE.x=1:允许相应的中断标志位ADC12IFG.x在置位时发生的中断请求服务。
    ADC12IE.x=0:禁止相应的中断标志位ADC12IFG.x在置位时发生的中断请求服务。

    7.ADC12IV 中断向量寄存器

    ADC12是一个多源中断:有18个中断标志(ADC12IFG.0~ADC12IFG.15与ADC12TOV,ADC12OV),但只有一个中断向量。所以需要设置这18个标志的优先级顺序,按照优先级顺序安排中断标志的响应,高优先级的请求可以中断正在服务的低优先级。如下表所示:

    ADC12中断标志ADC12IFG

    ADC12TOV ADC12OV ADC12IV
    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    X X X X X X X X X X X X X X X X X 1 2
    X X X X X X X X X X X X X X X X 1 0 4
    X X X X X X X X X X X X X X X 1 0 0 6
    X X X X X X X X X X X X X X X 0 0 0 8
    X 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34
    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36

    各中断标志会产生一个0~36的偶数。

    ADC12OV和ADC12TOV会在访问ADC12IV后自动复位。但在响应了ADC12IFG.x标志对应的中断服务之后,相应的标志不自动复位,用以保证能处理发生溢出的情况。

    ADC12是一个多源中断:有18个中断标志(ADC12IFG0-ADC12IFG15,ADC12TOV,ADC12OV)但只有一个中断向量。

    例程1:

    P.0输入单通道转换,参考电压AVCC,ADC12SC触发转换,采样保持时间是ADC内部时钟竞争的(16x),如果A0>0.5AVCC,P3.4置1,否则为0

    例2

    对AD0-AD3进行重复序列转换。

    程序架构

    中断方式

        1、设置  ADC12工作模式,启动转换,开全局中断,等待中断

        2、写中断处理函数

    查询方式

        设置ADC12工作模式,启动转换,查询中断标志ADC12IFG

        while (!(0x01 & ADC12IFG));转换完毕读取采样值,系统自动清除中断标志

    使用概述

    主要参数配置

     设置工作方式:sing\sequence\re-sing\re-sequencd;

     设置转换时间:SHTX

     设置触发方式:ADC12SC\MSC\TimerA\ TimerB

     设置通道:外部通道\内部Temperature sensor

     设置参考源:系统电压\内部参考源\外部参考源

    其他细节配置

         一般要配置采样转换模式为脉冲(SHP),打开ADC12(ADC12ON),使能ADC12转换(ENC),使能中断(如果采取中断模式),触发转换(若采用ADC12SC触发)。

    解释

     ADC12模数转换是在SHI的上升沿初始化的。SHI信号有四个来源: The ADC12SC bit;The Timer_A Output Unit 1; The Timer_B Output Unit 0; The Timer_B Output Unit 1。故单次采样时只需要每次设置ADC12CTL0 |= ADC12SC就采样一次;重复采样时,如Rep-sing,设置ADC12CTL1 = SHS_1 +CONSEQ_2就选择了Rep-sing模式,每次采样通过定时器A触发。

    实例

    4.1 single采样,参考电源为系统电源

    1.设置ADC12CTL0,使ADC12通道0采样保持时间为16 ADC12CLK(SHT0_2),开启ADC12模块(ADC12ON);

    2.设置ADC12CTL1,选择采样保持脉冲模式即SAMPCON为采样定时器(SHP)

    3.设置ADC12IE,是通道0中断使能(0x01);

    4.设置ADC12CTL0,使能AD转换(ENC)

    5.设置模拟信号输入IO口P60

    7.设置ADC12CTL0,开启AD转换(ADC12SC),等待中断

    8.中断中读取通道0转换值ADC12MEM0

      ADC12CTL0 = SHT0_2 + ADC12ON;             // Set sampling time, turn on ADC12

      ADC12CTL1 = SHP;                          // Use sampling timer

      ADC12IE = 0x01;                           // Enable interrupt

      ADC12CTL0 |= ENC;                         // Conversion enabled

      P6SEL |= 0x01;                            // P6.0 ADC option select

      P2DIR |= 0x01;

    ADC12CTL0 |= ADC12SC;

    #pragma vector=ADC12_VECTOR

    __interrupt void ADC12_ISR (void)

    {

        if (ADC12MEM0 < 0x7FF)

          P2OUT = 0;                       // Clear P1.0 LED off

        else

          P2OUT = 0XFF;                        // Set P1.0 LED on

        __low_power_mode_off_on_exit();

        // 与上面等价_BIC_SR_IRQ(CPUOFF);                    // Clear CPUOFF bit from 0(SR)

    }

    4.2 single采样参考源为2.5V

    在ADC12CTL0中设置参考源

    在ADC12MCTL0中为通道0选择参考源

      ADC12CTL0 = ADC12ON+SHT0_2+REFON+REF2_5V; // Turn on and set up ADC12

      ADC12CTL1 = SHP;                          // Use sampling timer

      ADC12MCTL0 = SREF_1;                      // Vr+=Vref+

      for ( i=0; i<0x3600; i++);                  // Delay for reference start-up

      ADC12CTL0 |= ENC;  

      while (1)

      {

        ADC12CTL0 |= ADC12SC;                   // Start conversion

        while ((ADC12IFG & BIT0)==0);

        _NOP();                                 // SET BREAKPOINT HERE

      }

    4.3 Repeat-single采样,模拟输入为内部Temperature sensor

    设置ADC12CTL1,采样保持源为定时器A,脉冲保持模式,Repeat-single模式

      ADC12CTL1 = SHS_1 + SHP + CONSEQ_2;       // TA trig., rpt conv.

    设置ADC12MCTL0,通道0参考源为内部REF,模拟输入通道0选择为Temperature sensor

      ADC12MCTL0 = SREF_1 + INCH_10;            // Channel A10, Vref+

      ADC12IE = 0x01;                           // Enable ADC12IFG.0

      ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12

      TACCTL1 = OUTMOD_4;                       // Toggle on EQU1 (TAR = 0)

      TACTL = TASSEL_2 + MC_2;                  // SMCLK, cont-mode

      while (!(0x01 & ADC12IFG));               // First conversion?

      FirstADCVal = ADC12MEM0;                  // Read out 1st ADC value

      _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0 w/ interrupt

    #pragma vector=ADC12_VECTOR

    __interrupt void ADC12ISR (void)

    {

      if (ADC12MEM0 <= FirstADCVal + ADCDeltaOn)

          P1OUT &= ~0x01;                       // LED off

      else P1OUT |= 0x01;                       // LED on

    }

    摄氏温度和温度传感器电压转换关系:0摄氏度对应986mv,1摄氏度温差对应1.97mv温差

    //  oF = ((x/4096)*1500mV)-923mV)*1/1.97mV = x*761/4096 - 468

    //  IntDegF = (ADC12MEM0 - 2519)* 761/4096

        IntDegF = (temp - 2519) * 761;

        IntDegF = IntDegF / 4096;

    //  oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278

    //  IntDegC = (ADC12MEM0 - 2692)* 423/4096

        IntDegC = (temp - 2692) * 423;

        IntDegC = IntDegC / 4096;

    4.4 Repeat-sequence mode

    Sequence模式时可以设置多个采样通道。在最后一个通道加上EOS就表明的采样通道结束位置。中断允许只需要设置最后一个通道。

    为了采样速率尽可能快,可设置MSC,此时当SHI上升沿触发第一次采样后,后面的采样在上一次采样结束后自动进行。

      ADC12CTL0 = ADC12ON+MSC+SHT0_8;           // Turn on ADC12, extend sampling time

                                                // to avoid overflow of results

      ADC12CTL1 = SHP+CONSEQ_3;                 // Use sampling timer, repeated sequence

      ADC12MCTL0 = INCH_0;                      // ref+=AVcc, channel = A0

      ADC12MCTL1 = INCH_1;                      // ref+=AVcc, channel = A1

      ADC12MCTL2 = INCH_2;                      // ref+=AVcc, channel = A2

      ADC12MCTL3 = INCH_3+EOS;                  // ref+=AVcc, channel = A3, end seq.

      ADC12IE = 0x08;                           // Enable ADC12IFG.3

      ADC12CTL0 |= ENC;                         // Enable conversions

      ADC12CTL0 |= ADC12SC;                     // Start conversion

      _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0, Enable interrupts

    #pragma vector=ADC12_VECTOR

    __interrupt void ADC12ISR (void)

    {

      static unsigned int index = 0;

      A0results[index] = ADC12MEM0;             // Move A0 results, IFG is cleared

      A1results[index] = ADC12MEM1;             // Move A1 results, IFG is cleared

      A2results[index] = ADC12MEM2;             // Move A2 results, IFG is cleared

      A3results[index] = ADC12MEM3;             // Move A3 results, IFG is cleared

      index = (index+1)%Num_of_Results;         // Increment results index, modulo; Set Breakpoint here

    }

  • 相关阅读:
    520了,用32做个简单的小程序
    我要偷偷的学Python,然后惊呆所有人(第十三天)
    Python关于import的实验(10) 利用__init__.py文件将变量和包下的模块作为包的属性
    爬虫实战 如何爬取B站视频评论?
    【爬虫】对新笔趣阁小说进行爬取,保存和下载
    年轻就该多尝试,教你20小时Get一项新技能
    基于visual c++之windows核心编程代码分析(66)实现Windows服务的远程控制
    基于visual c++之windows核心编程代码分析(59)实现网络简单代理编程
    Windows Azure Traffic Manager的新的管理API
    现实世界的Windows Azure:采访Aidmatrix的交付副总裁Michael Ross
  • 原文地址:https://www.cnblogs.com/xubeiping0930/p/4451763.html
Copyright © 2020-2023  润新知