您的当前位置:首页正文

msp430 adc10

2021-06-22 来源:步旅网
MSP430 ADC10

MSP430 单片机拥有内置的 ADC 功能,在一些高级单片机系列上是 ADC12,在低级单片机系列上是ADC10,两者的主要区别是分辨率的不同,我们的 G2553 内置的就是 ADC10。

一、ADC10 特性 我们先来了解一下这个 ADC10 的特性,官方给出的: ·高达 200ksps 的转换速率;固定的 10 位转换;具有采样保持功能,并可选采样周期;可以通过软件代码或 TimerA 初始化转换;可选的片内(1.5V 或 2.5V)或片外参考电压;支持 8 个外部输入通道;内部输入通道支持温度检测,VCC 和外部参考(+、—);可选的转换时钟源;单通道单次/多次、序列通道单次/多次,共 4 种转换模式;ADC 内核和参考电压都可单独关闭;具有一个支持自动存储转换结果的数据转换控制器(DTC);

二、ADC10 结构 OK,我们来引入 ADC10 的内部结构图来初步认识这个 ADC10 的内部结构。1、ADC10 内核-SAR 和采样保持电路:它将外部或者内部的模拟信号进行保持以实现 ADC 转换过程中的信号稳定。 2、ADC10 信号通道和转换模式:由于我们 的 SAR 只有一个,要对里里外外这么多信号都进行 AD 转换就必须按顺序来,一个一个选 择性地输入, 这个选择器就是用来选择要输入的外部或者内部模拟信号。3、ADC10 时钟和采样触发源: ADC10 模块像 TimerA 模块一样也需要有时钟信号支持,有了时钟,SAR 这个逐次逼近 比较内核才能够运行(因为它是逐次的嘛),形象地说时钟就是 SAR 的动力。这里可以选择 ACLK、MCLK 和 SMCLK,另外还有一个 ADC10OSC,这个时钟 是 ADC10 模块自带的,频率在 5MHz 左右。和 TimerA 一样,这些时钟也可以通过分频器 进行分频。采样信号可以由 ADC10SC 位或 TimerA 的三个比较匹配器输出端来触发。 而且通过 ISSH 我们可以设置是上边沿触发还是下边沿触发。 采样触发信号发出一次, ADC10 就会立即从通道选择器中选择要采样的信号经过采样保持 电路进入到 SAR 中进行 AD 转换。 4、ADC10 参考源: AD 转换,其本质就是对外部信号进行量化(就是在幅度上对信号进行编码),既然是 量化,那么肯定要有参考的标准,这个标准由谁定?对了,就是由 ADC10 模块的参考源电 路决定的。有“VR-”和“VR+”两个输入端,这 两个输入端就是 SAR 的参考源。其中,负端可以由 SREF2 来决定由 AVSS(可认为 GND) 或者 VREF-/VeREF-来输入得到。 而正端可以由 SREF0、 SREF1 来决定由内部或者外部参考 电平输入得到。内部支持 1.5V 或者 2.5V,外部由外部引脚输入得到。ADC10 同时支持将内部参考电平输出到外部,而且为了保持其低功耗的优势,还可以由 REFBURST 来降低平均电流。当输入信号等于或小于 VR-时,AD 结果输出为 0;当输入信号等于或大于 VR+时,AD 结果为 0x03FF(1023);输入信号在 VR-和 VR+之间,AD 结果为以下公式: NADC = 1023 × (Vin - VR-) ÷ (VR+ — VR-) 5、ADC 转换值和 DTC 电路: 我们已经从输入、时钟、触发、参考四个部分了解了 ADC10 的转换电路,那么我们转 换得到的值要如何输出呢?这里我们沿着 SAR 下面空心粗箭头看到一个棕红色框 “ADC10MEM”,这个寄存器就是用来存放得到的 AD 值的。我们只要读取 ADC10MEM 的值就可以得到 AD 值了。为了实现低功耗设计,MSP430 支持 DTC 功能,就是数据传输控制功能,它可以支持将 ADC10MEM 中的数据自动存放至 RAM、Flash 或者其他外设中而不用 CPU 干预。 6、温度传感器: MSP430 内置了一个温度传感器(浅蓝色方框),可以通过设置输入通道为

0x0A 来选择 输入温度模拟量。这样的设计让我们不用外部温度芯片就可以实现简单的温度检测,其 AD 值和温度的关系式为(A10 就是温度传感器通道的 AD 值): VTEMP = 0.00355 × TEMMPC + 0.986 (单位:V) 从而推导得到: 摄氏度:oC = ((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278 华氏度:oF = ((A10/1024)*1500mV)-923mV)*1/1.97mV = A10*761/1024 - 468 三、ADC10 相关寄存器 首先让我们看一下有哪些寄存器和 ADC10 相关的: ·1.ADC10AE:ADC10 输入使能寄存器 ·2.ADC10CTL0:ADC10 控制寄存器 0 ·3.ADC10CTL1:ADC10 控制寄存器 1 ·4.ADC10MEM:ADC10 存储器 ·5.ADC10DTC0:ADC10 数据传输控制寄存器 0 ·6.ADC10DTC1:ADC10 数据传输控制寄存器 1 ·7.ADC10SA:ADC10 数据传输控制启动地址寄存器 下面让我们详细学习每个寄存器: 1、ADC10AE:ADC10 输入使能寄存器 ADC10AE 7 ADC10AE7

ADC10 输入使能寄存器 4 3 ADC10AE3 6 ADC10AE6 5 ADC10AE5 2 ADC10AE2 1 ADC10AE1 0 ADC10AE0 ADC10AE4

·7~0-ADC10AEx:ADC10 模拟输入控制使能位,用来控制外部模拟输入是否使能 0:禁止 1:使能

2、ADC10CTL0:ADC10 控制寄存器 0 ADC10CTL0 ADC10 控制寄存器 0 15 7 MSC 14 SREFx 6 REF2_5V 5 REFON SREF 二进制 000 十进制 0 VCC VSS 4 ADC10ON 13

12 ADC10SHTx 3 ADC10IE VR+ 11 10 ADC10SR 2 ADC10IFG VR9 REFOUT 1 ENC 8 REFBURST 0 ADC10SC

·15~13-SREF:参考电平选择,详细见下表 001 010 011 100 101 110 111 1 2 3 4 5 6 7

VREF+ VeREF+ VeREF+ VCC VREF+ VeREF+ VeREF+

VSS VSS VSS VREF-/VeREFVREF-/VeREFVREF-/VeREFVREF-/VeREF-

·12~11-ADC10SHT:ADC10 采样保持时间 00:4 x ADC10CLKs 01:8 x ADC10CLKs 10:16 x ADC10CLKs 11:64 x ADC10CLKs ·10-ADC10SR:ADC10 采样速率,该位用于选择最大采样速率下的参考电平缓冲驱动 能力。ADC10SR 置 1 可以减少参考电平缓冲器的电流消耗 0:参考电平缓冲器支持最大速率到 200ksps 1:参考电平缓冲器支持最大速率到 50ksps ·9-REFOUT:参考电平输出允许位,用来控制是否输出参考电平 0:参考输出关闭 1:参考输出打开 ·8-REFBURST:参考电压输出控制位(REFOUT=1 时有效) 0:参考电压持续对外输出 1:只有在采样转换期间参考电压持续对外输出 ·7-MSC:多次采样/转换控制位(只在序列或多次转换模式下有效) 0:每次采样与转换时,由 SHI 的上升沿触发 1:由 SHI 的第一个上升沿触发采样定时器,后面的采样与转换由前一次转换完成后 立即执行。 ·6-REF2_5V:参考电压发生器的电压值选择位(REFON=1 时有效) 0:1.5V 1:2.5V 1:打开内部参考电压发生器 ·5-REFON:参考电压发生器控制位,控制是否打开内部参考电压 0:关闭内部参考电压发生器 0:关闭 ADC10 模块 ·4-ADC10ON:ADC10 控制位,控制是否使用 ADC10 模块 1:打开 ADC10 模块 ·3-ADC10IE:ADC10 中断允许控制位,控制是否允许 ADC10 中断 0:中断禁止 1:中断允许 ·2-ADC10IFG:ADC10 中断标志位,如果 ADC10MEM 已经装满转换结果,该位置 1.当中断申请呗接受后,它自动复位,可以由软件复位。在使用 DTC 时,当完成一个数据 块的传递时,该位置 1 0:无中断产生 0:ADC10 禁止 1:有中断产生 1:ADC10 使能 ·1-ENC:ADC10 转换使能位,用来控制是否进行转换 ·0-ADC10SC:软件可控的采样/转换控制位。ADC10SC 和 ENC 必须用一条指令同时 置 1。ADC10SC 位可自动复位 0:无采样/转换开始 1:开始采样/转换

3、ADC10CTL1:ADC10 控制寄存器 1 ADC10CTL1 15 7 14 6 ADC10DIVx 详细见下面的表格 INCH 二进制 0000 0001 0010 0011 0100 0101 0110 0111 十进制 0 1 2 3 4 5 6 7 A0 A1 A2 A3 A4 A5 A6 A7 通道 1000 1001 1010 1011 1100 1101 1110 1111 INCH 二进制 十进制 8 9 10 11 12 13 14 15 VeREF+ VREF-/VeREF温度传感器 (VCC-VSS)/2 (VCC-VSS)/2 (VCC-VSS)/2 (VCC-VSS)/2 (VCC-VSS)/2 通道 13 INCHx 5 4 3 ADC10SSELx 12 ADC10 控制寄存器 1 11 SHSx 2 CONSEQx 10 9 ADC10DF 1 8 ISSH 0 ADC10BUSY ·15~12-INCH:

输入通道选择,用来选择进行单次转换的通道或序列转换的最高通道, ·11~10-SHS:采样/保持输入信号源选择位 00:ADC10SC 位 01:TimerA.OUT1 10:TimerA.OUT0 11:TimerA.OUT2 ·9-ADC10DF:ADC10 数据格式选择位 0:二进制格式(右对齐) 1:二的补码格式(左对齐) ·8-ISSH:采样/保持输入信号反向控制位 0:采样输入信号不反向 1:采样输入信号反向 ·7~5-ADC10DIV:ADC10 时钟分频选择位,分频系数=ADC10DIV+1 ·4~3-ADC10SSEL:ADC10 时钟源选择位 00:ADC10OSC 01:ACLK 10:MCLK 11:SMCLK ·2~1-CONSEQ:转换模式选择位 00:单通道单次转换 01:序列通道单次转换 10:单通道多次转换 11:序列通道多次转换 ·0-ADC10BUSY:ADC10 忙标志位,该位指示采样或转换正在进行 0:表明没有正在进行的转换 1:表明一个序列,采样或者转换正在进行 4、ADC10MEM:ADC10 转换结果寄存器 这是一个用来存放 AD 转换结果的 16 位的寄存器,它有两种存放方式(还记得前面 ADC10DF 这个东东么?),分别是: ①当 ADC10DF=0 时,ADC10MEM 为右对齐,②当 ADC10DF=1 时,ADC10MEM 为左对齐,存放结构如下:结果存放结构如下: ADC10MEM 15 0 14 0 13 0 12 0 11 0 10 0

ADC10MEM 15 14 13 12 11 10 9 8 7 6 5 0 4 0 3 0 2 0 1 0 0 0 转换结果 5、ADC10DTC0:ADC10 数据传递控制寄存器 0 ADC10DTC0 7 6 5 4 保留——未使用 3 ADC10TB 2 ADC10CT 1 ADC10B1 0 ADC10FETCH

·3-ADC10TB:ADC10 一块或两块数据模式选择 1:两块数据传递模式,0:一块数据传递模式。 ·2-ADC10CT:ADC10 连续传递模式选择位 0:在一块或两块传递模式下,一块或两块都传递后,数据传递结束 1:继续数据传递,只有在 ADC10CT 清 0 或由数据写入到 ADC10SA 时,DTC 停止 ·1-ADC10B1:ADC10 转存块满标志。该位表明两块数据模式下数据块是否已经装入 转换结果。ADC10B1 只有当 ADC10IFG 位在 DTC 工作期间第一次被设置后才有效 (ADCTB=1 时有效) ·0-ADC10FETCH:该位通常处于复位(ADC10FETCH=0)状态。

6、ADC10DTC1:ADC10 数据传递控制寄存器 1 ADC10DTC1 7 6 5 ADC10 数据传递控制寄存器 1 4 3 2 1 0 DTC Transfers ·7~0-DTC Transfers:这些位定义了每个数据块中传递的数量 0:DTC 禁止 0x00~0xFF:每个数据块中传递的数量 7、ADC10SA:ADC10 数据传递起始地址寄存器 ADC10SA 15 7 14 6 13 5 ADC10 数据传递起始地址寄存器 12 ADC10SAx 4 ADC10SAx 初始化 DTC 传递。第 0 位未使用,只读,读结果为 0 3 2 1 0 0 11 10 9 8

·15~1-ADC10SA:该寄存器的内容为 DTC 的起始地址,需要先对 ADC10SA 写入来

四、ADC10 的采样和转换过程 我们要学习 ADC10,就必须要了解它是如何对一个模拟信号进行采样和转换的。

我们结合下面这个采样/转换的时序图来详细介

首先是我们的四个采样触发源(ADC10SC 和 3 个 TimerA OUT)产生了触发信号,也 就是 SHI 信号产生了一个脉冲,此时采样开始,SAMPCON 信号也同时置高。然后采样时 钟进行一段时间的计数,在计数时,SAMPCON 保持高电平不变,在 tsync+tsample 时间后,采 样完成,此时停止采样并进入到转换阶段。经过 13 个 ADC10CLK 时钟后,转换阶段也完 成了。 我们再回过头来看看 SAMPCON 信号在高电平状态下到底保持了多少时间,又是谁控 制的呢?前面我们知道 SHT 可以选择采样周期,这个采样周期就是 tsample,它可以是 4、8、 16 或 64 个 ADC10CLK 个周期。 选择的采样周期和 ADC10CLK 需要同步, 这段时间就是上 面的 tsync,这段时间具体多少不用关心。 为了采样的有效, 我们在对模拟信号进行采样时, 必须保证一定的采样时间也就是 tsample。 所以我们得学习一下最小采样时间的计算。前面我们还讲了 ADC10SR 可以控制采样速率, 这里我们就要用到它: ①ADC10SR=0 时,此时为高速采样,最小采样时间为: tsample > (RS + RI) × ln(2048) × CI + 800ns ②ADC10SR=0 时,此时为低速采样,可以减小电流满足低功耗需求, 最小采样时间为: tsample > (RS + RI) × ln(2048) × CI + 2500ns 上面的式子多了很多 R、C 啥的,对了,这个最小采样时间是和我们的采样电路是有关 系的。 在 SAMPCON=0 时, 所有的 Ax 输入为高阻态。 当 SAMPCON=1 时, 在采样时间 tsample 期间,别选择的 Ax 输入相当于一个 RC 低通滤波器如下图:

VI=Ax 引脚输入电压 VS=外部驱动源电压 RS=外部源内阻 RI=内部多路选择导通 输入电阻 CI=输入电容 VC=电容充电电压 由于内部电路决定 RI 最大为 2KΩ ,CI 最大是 20pF,所以上面的式子就可以简化为: tsample > (RS + 2K) × 7.625 × 20pF + 800ns (ADC10SR = 0) tsample > (RS + 2K) × 7.625 × 20pF + 2500ns (ADC10SR = 1)

四、ADC10 的四种转换模式 前面已经说过,ADC10 有四种模式,是由 CONSEQ 来控制的 1、单通道单次模式 该模式对由 INCH 选择的单通道进行一次采样和转换。ADC 结果写入到 ADC10MEM。 当 ADC10SC 触发一次转换时,连续的转换也可以通过将 ADC10SC 置位来触发。当使用其 他任何触发源来启动转换时,ENC 必须在每次转换间隔离,在 ENC 复位并再次置位前的采 样信号将被忽略。转换流程见下图:

我们可以看到,CONSEQx=00 表示当前模式为单通道单次模式,在 ADC10ON 置位后, ADC10 开启并进入到等待状态。 当 ENC 产生上升沿时 ADC10 等待触发并在 SAMPCON 产 生上升沿后进入到采样环节。采样经过 4、8、16 或 64 个 ADC10CLK 周期后进入到转换环 节,同样经过 12 个 ADC10CLK 周期后完成转换。经过 1 个 ADC10CLK 周期,AD 结果存 入 ADC10MEM 并且 ADC10IFG 中断标志位置位,然后 ADC10 等待下一次的转换使能。如 果 SHS=0 也就是说触发源是 ADC10SC,那么当 ENC 信号和 ADC10SC 信号都为高电平时 同样进入到采样环节。另外,在 AD 转换的任意阶段,只要 ENC 清 0,则立即回到等待状 态。 2、序列通道单次转换模式: 该模式对一个序列的通道进行一次采样和转换。序列通道将自动选择 INCHx 到 A0 作 为当前通道。每个 ADC 结果都存放到 ADC10MEM。

最后一个通道也就是 A0 转换完毕后 序列转换就结束。当 ADC10SC 启动一次,连续的转换也可通过设置 ADC10SC 位来启动。

当任何其他触发源用来启动转换时,ENC 必需在每次序列转换间隔离,在 ENC 复位并再次 置位前的采样信号将被忽略。转换流程见下图:

大家可以看到,CONSEQ=01 表示为序列通道单次转换模式。这个流程图和第一张差别 不大, 我们结合第一张流程图的讲解来解释这个流程图。 首先我们看到中间主干的流程通路 和第一张是一样的,这里就不再赘述了。我们看到左边和右边分别多了一条返回线。左边那 条是从转换完成直接返回到采样输入通道的,右边那条是从转换完成返回到触发等待状态 的,他们的区别是左边 MSC=1 也就是自动连续触发,右边 MSC=0 不自动连续触发所以每 次需要等待 SAMPCON 信号为高才触发下一次采样。然后 x 也就是当前要转换的通道自减 1,直到 x=0 时转换完 A0 这个最后通道然后等待 ADC10 的使能。 3、单通道多次转换模式: 该模式对由 INCHx 选定的通道进行连续采样和转换。每次 ADC 转换结果都存放到 ADC10MEM 中。转换流程见下图:

CONSEQ=10 表示为单通道多次转换模式。中间部分还是一样的,只是两边的返回线现在 和 MSC 有关。左边这条线 MSC=1 那么就会在上一次转换完成后自动进入下一次的采样环 节。 右边这条线 MSC=0 那么当上一次转换完成后会自动进入触发等待状态, 只有 SAMPCON 信号变高才进行下一次的采样。最右边的一条线说明如果 ENC 清 0,那么 ADC10 将重新等 待使能。 4、序列通道多次转换模式: 该模式对序列通道进行重复采样和转换。序列通道为从 INCHx 选择的通道到 A0。每次 ADC 结果都存放到 ADC10MEM。通道 A0 转换完成后序列转换结束,下一个启动信号重新 启动序列转换。转换流程见下图:

CONSEQ=11 表示序列通道多次转换模式。这个流程图显然是“单通道多次”和“序列通 道单次”的结合体,所以就不再赘述,相信大家肯定可以自行理解这个转换过程。如果理解 不了, 那么说明前面三个转换模式没有深入理解, 大家可以回过头复习一下前面的三个转换 模式。

五、ADC10 的数据传递控制器——DTC 前面概述的时候就讲到 MSP430 的 ADC10 包含一个数据传递控制器(DTC),它可以自动地将转换结果从 ADC10MEM 传递到其他片内存储单元。设置 ADC10DTC1 寄存器为 一个非 0 值就可以使能 DTC。另外,MSP430x20x2 系列芯片中是没有 DTC 的。 当 DTC 使能时,每次 ADC10 完成转换和将转换结果装载到 ADC10MEM 后,数据传递启动。无需软件干预来惯例 ADC10,直到预先定义的转换数据量被传递。每次 DTC 传递 需要一个 MCLK 周期。为了避免 DTC 传递过程中和其他总线竞争(竞争是数电用语), CPU 暂停。如果 CPU 活动,需要一个 MCLK 周期时间来传递。

当 ADC10 忙的时候,DTC 不能启动。也就是说当设置 DTC 时,程序必须保证当前没有正在进行的转换或序列转换。 1、一块数据传递模式: ADC10TB=0 时选择一块数据传递模式。ADC10DTC1 寄存器中的 n 值定义了一个数据块传递的总长度。 可以利用 ADC10SA 寄存器在 MSP430 任何地址范围内定义数据块的起始地 址。数据块结束地址为 ADC10SA+2n-2。其存储结构式见下图:

内部地址指针最初为 ADC10SA,内部传递计数器=n。内部指针和计数器在程序中是已 知的。DTC 传递 ADC10MEM 中的数据到由 ADC10SA 这个指针所指的字地址中(注意是 字地址,2 个字节)。每次传递后,内部地址指针自增 2,内部传递计数器自减 1。 随着 ADC10MEM 的每次装载,数据继续传递,知道内部传递计数器=0。其他的 DTC 数据传递不再继续进行,直到对 ADC10SA 再写。在一块数据传递模式下使用 DTC 时,一 个完整的数据块传递完成后,ADC10IFG 标志自动置 1。下图描述了这个过程:

2、两块数据传递模式: ADC10TB=1 时选择两块数据传递模式。ADC10DTC1 中的 n 值定义了一个数据块传递的 长度。此时,ADC10SA 在 MSP430 任何地址范围内定义的是第一个数据块的地址,第一个

数据块的结束地址为 ADC10SA+2n-2。另外还有第二个数据块的地址范围为 ADC10SA+2n 到 ADC10SA+4n-2。其存储结构式见下图:

内部地址指针初始=ADC10SA, 内部传递计数器=n。 内部指针和计数器在程序中是已知 的。DTC 传递 ADC10MEM 中的数据到由 ADC10SA 地址指针所指的字地址中。每次传递 后,内部地址指针自增 2,内部传递计数器自减 1。 随着 ADC10MEM 的每次装载,数据继续传递,知道内部传递计数器=0。此时数据块 1 已经装满,ADC10IFG 和 ADC10B1 位都将置 1。我们也可以通过读取 ADC10B1 来判断数 据块 1 是否已经装满。 DTC 继续传递数据块 2。内部传递计数器自动重新装载‘n’。在下次装载 ADC10MEM 时, DTC 开始传递转换结果到数据块 2 中。 当完成 n 次传递后, 数据块 2 也装满了。 ADC10IFG 标志又将置 1,而 ADC10B1 位将清 0。我们也可以通过读取 ADC10B1 是否清 0 来判断数 据块 2 是否装满。下图描述了这个过程:

3、连续传递: 当 ADC10CT=1 时,DTC 将支持连续传递。当数据块 1(一块数据传递模式)或数据块 2(两块数据传递模式)完成传递后,DTC 并不停止。内部地址指针和数据传递计数器将会 重新装载 ADC10SA 和 n 的值。如果 ADC10CT 被清 0,则在数据块 1(一块数据传递模式)

或数据块 2(两块数据传递模式)完成传递后(换句话说就是此次传递任务结束后),DTC 传递停止。

七、ADC10 中断 和定时器一样,ADC10 也有中断请求的能力。如果不使用 DTC(ADC10DTC1=0), 当转换结果装载到 ADC10MEM 时,ADC10 中断标志位即 ADC10IFG 置 1。如果使用 DTC (ADC10DTC>0),那么当一个数据块传递完成和内部传递计数器‘n’=0 时,ADC10IFG 置 1。如果 ADC10IE 和 GIE 都为 1,那么一旦 ADC10IFG 置 1,ADC10 就会产生一个中断 申请。当中断申请被响应后,ADC10IFG 标志自动复位。当然 ADC10IFG 也可由软件复位。 大家可以结合下面的逻辑结构来学习这一过程:

上图和前面很多中断触发电路一样,中间是一个 D 型触发器,这个 D 型触发器在 ADC10CLK 时钟为高电平状态时将 D 端信号传递到 Q 端,在 ADC10CLK 时钟信号为低电 平状态时保持 Q 端电平状态不变,Reset 复位端一旦置高就会将 Q 端清 0。

八、ADC10 编程实例 终于到了实例环节了, 由于我们要获取模拟信号的 AD 值来看看 AD 转换到底对不对所 以必须要知道得到的 AD 值。一种办法是利用 IAR 或者其他调试软件进行调试,查看内部 ADC10MEM 的值,还有一种办法是利

用硬件显示出 AD 数据,比如液晶、数码管等等。这 里我们将对这两种方法分别作介绍,锻炼大家硬件调试的能力。 1、采样温度 AD 值并用 IAR 调试查看: 我们要对温度进行采样,所以我们的通道参数 INCH 要设置为 10。ADC10 时钟源我们 就选默认的 ADC10OSC 好了,不分频。触发源我们选择 ADC10SC 信号,保持 16 个 ADC10CLK 周期。然后我们使用单通道多次的连续转换模式即 CONSEQ=2 且 MSC=1。参 考源我们设置为内部 2.5V 的参考电平,没有其他用途我们就不设置内部参考电平输出了。 同时我们还开启一下 ADC10 的中断允许。我们这里不需要 DTC 就不对 DTC 进行设置了。 好的,经过上面的分析,我们可以得到以下代码: #include \"io430.h\" unsigned short tadc=0; void main( void )

{ WDTCTL = WDTPW + WDTHOLD; BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; ADC10CTL0 = SREF_1 + ADC10SHT_2 + REF2_5V + MSC + REFON + ADC10ON + ADC10IE + ENC + ADC10SC;

ADC10CTL1 = INCH_10 + SHS_0 + ADC10SSEL_0 + CONSEQ_2; __enable_interrupt(); while(1) { } }

//ADC10 中断服务函数 #pragma vector=ADC10_VECTOR __interrupt void AD C10_ISR (void) { tadc = ADC10MEM; }

OK,我们现在开始调试这段代码。我们在 ADC10 中断服务函数中按 F9 下一个断点: //开启总中断

然后我们按 Ctrl+D 进入调试:

然后我们按 F5 全速执行,此时程序运行到断点处自动停下:

然后我们将 tadc 或 ADC10MEM 添加到监视器中,我们看到 Watch1 中的内容: 然后我们再按 F10 单步运行一步,发现 tadc 内容发生了变化:

我们可以不断地按 F5 全速执行,在断点处单步执行查看 tadc 更新的值。 2、采样温度 AD 值并用 nokia5110 液晶显示 上个例子我们直接使用 IAR 调试来查看我们的 AD 值的, 这个例子里我们使用 nokia5110 这个液晶模块来显示我们的 AD 值。由于要用到 nokia5110,这里 Cloud 使用了自己移植的 库函数,有兴趣的同学可以自己学习 5110 的相关知识并连接硬件。我们这个实例的重点并 不在 5110 上,所以我们只要知道里面的两条函数的含义就可以了: LCD5110_init(void); //5110 液晶初始化函数,5110 液晶上电后必须执行初始化 LCD5110_write_english_string(x,y,str); //5110 液晶字符串显示函数,可在给定 起始坐标上显示英文或阿拉伯数字字符串 OK,我们同样来分析一下程序的结构。大致结构和前面的例子是类似的,只不过我们现 在将 AD 值变成了

字符串而已,这个函数相信大家应该都能独立写出,类似于这样: unsigned char showstr[5]=\"0000\"; unsigned short tadc=0; showstr[0]=tadc%10000/1000+'0'; showstr[1]=tadc%1000/100+'0'; showstr[2]=tadc%100/10+'0';

showstr[3]=tadc%10+'0'; LCD5110_write_english_string(0,0,showstr); 很简单吧。这里 Cloud 就不给出具体的工程代码了,因为我们学习写程序,主要学习的 是一种编程的思想和解决问题的方法, 让大家通过上面的编程思路自行写出可以使用的代码 才是培养编程能力的最好方式„„好吧,扯多了„„ 3、使用 TimerA 来触发 ADC10 进行转换 我们前面说过,ADC10 转换的采样触发源可以是 ADC10SC 信号也可以是 TimerA 的某个 输出口。这个例子中我们就用 TimerA 的 CCR1 的 OUT 端来触发 ADC10 进行转换。 我们还是讲解一下编程的重点, 首先我们要将 ADC10SSEL 设置为 1 来选择 TimerA.OUT1, 然后我们还要对 TimerA 进行设置, 这里就要用到我们前面讲得 TimerA 的相关知识了, 包括 时钟源选择、分频系数、计数模式以及输出模式„„ 4、使用外部引脚输入模拟信号进行 AD 转换 MSP430 的 ADC10 肯定是支持外部输入引脚的模拟信号输入的,我们通过前面的学习可 以知道当 INCH 在 0 到 7 的范围内就选择了 A0 到 A7 这 8 个外部信号通道。那么这 8 个引脚 到底在哪里呢?我们参看相关数据手册发现这 A0 到 A7 分别对应着 IO 口 P1.0 到 P1.7。 我们看看如何打开这些 IO 的 AD通道功能。 我们找来上次看过的引脚多功能定义表格来 看看:

以 P1.0 为例,找到“功能”下面有一个“A0”,这个就是 A0 外部输入通道。然后我们 看到右边 P1DIR.0、P1SEL.0、P1SEL2.0 都是 X 说明和这些位无关,再看 ADC10AE.0 写着是 1,也就是说在 ADC10AE.0=1 时,我们的 P1.0 口就是用作 ADC10 的 A0 输入口的。 所以, 我们要使用外部引脚输入模拟信号就可以将 ADC10AE 对应的位置 1 来实现, 当然 别忘了选择相对应的 INCH 值。 5、使用外部参考源 MSP430 的 ADC10 内置了 1.5V 和 2.5V 两个参考源,另外还可以用大约 3.5V 的 VCC 作为 参考源。但这些参考源都不是非常精确,如果要用到精度更高的参考源,那么可以考虑用外 部参考源。同样,我们通过查看数据手册,发现 P1.3 有一个“VREF-”和“VEREF-”,说明 P1.3 可以作为外部参考电源的负端:

我们发现,这里类似的,也是让 ADC10AE.3 置 1 启动 VREF-功能的。然而 P1.3 同样也 支持 A3 输入通道, 条件还是 ADC10AE.3 置 1。 但是不同之处是 A3 对应的 1 后面多了 “ (y=3) ” , 也就是说 ADC10AE.3=1 的条件下,在 INCH 选择了 A3 通道时(INCH=3),P1.3 是作为 AD 输 入通道来使用的,而 INCH 没有选择 A3 通道时,P1.3 是作为 VREF-或者 VEREF-来使用。 我们查看数据手册, 发现 P1.4 可以用来作为 VREF+或者 VEREF+, 同样的 P1.4 可以作为 A4 通道输入。方式和 P1.3 情况类似就不再赘述了。 另外,在使用外部参考源的时候,建议大家关闭内部参考源以减少电流消耗。 6、关于 DTC 功能 MSP430 的 ADC10 的 DTC 功能确实强大, 它支持将 ADC10MEM 中的内容自动存放到任意地 址。经过上面的学习,我们已经知道必须要设置 ADC10SA 来确认传送的目标地址,然后通过 设置 ADC10DTC1 来确认传送的数据大小(字节数),另外还可以通过设置 ADC10DTC0 中的 ADC10TB 来选择传输一块或者两块数据、设置

ADC10CT 来选择是否连续传递数据。 因为大家现在还没有学习 flash 模块, 为了避免覆盖 flash 中的重要数据 (比如我们每 次用到的 CALBC1_16MHZ 和 CALDCO_16MHZ 都是在 flash 中存放的) , 我们只在 RAM 中做文章。 我们可以给定一个固定的地址,比如 0x0200,但是我们如何保证这些地址不会被别的程序 覆盖呢,确实很难保证。Cloud 也不推荐用这种方式。那么我们能不能利用 DTC 直接将数据 存放到我们的变量中呢? 答案是肯定的。学习过指针的同学都知道,在程序中,所有的变量都是有其地址的,通 过这个思想, 我们让 ADC10SA 指向某个变量的地址, 然后再将 ADC10DTC1 的大小和变量长度 相匹配就好了。 所以我们也可以写出如下的参考代码: unsigned short tadc[16]={0}; ....... ADC10DTC1=16; //确定长度为 16 个字 ADC10SA=(short)(tadc);

大家可以看到上面的 Watch1 中就列举了 16 个由 DTC 自动传输得到的 ADC 值。 这里要注意的是,由于我们并未打开 ADC10CT,所以在每次进入 ADC10 中断后,要 重新将 ADC10SA 赋值才能再次进行 DTC。

因篇幅问题不能全部显示,请点此查看更多更全内容