040:MSP430单片机ADC12模块
1, 模数转换概述
在 MSP430 的实时控制和智能仪表等应用系统中,控制或测量对象的有关变化量,往往是一些连续变化的
量,如压力,温度,流量,速度等。利用传感器把各种物理量测量出来,转换为电信号,经过模数转换(Analog
to Digital Conversion)转变成数字量,这样模拟量才能被 MSP430 处理和控制。
ADC 模块常用的指标有如下几个:
[1]分辨率
分辨率表示输出数字量变化一个相邻的数码所需要出入的模拟电压的变化量。
他定义为转换器的满刻度电压与 2n的比值,其中 n 为 ADC 的位数。对于 MSP430 的 12 位 ADC 转换器,如果 Vref = 2.5V,则分辨率为 2.5V/4096=0.0006,即分辨率为 0.6mV。
[2]量化误差
量化误差和分辨率是统一的,量化误差是由于有限数字对模拟数值进行离散取值量化而引起的误差,因此量化误差理论上为一个单位分辨率,即±1/2LSB
[3]转换精度
ADC12模块的转换精度反映了一个实际 ADC 模块在量化上与一个理想的 ADC 模块进行模数转换的差值,可表示为绝对误差或者相对误差,与一般的仪表的定义相似。
[4]转换时间
指 ADC 模块完成依次模数转换所需要的时间,转换时间越短越能适应高速度变化的信号,其和 ADC 结构位数有关。
2 ADC12 内部结构原理图
ADC12 模块能够实现 12 位精度的模数转换,ADC12 结构如图:

ADC12 主要包括以下几个功能模块:
[1]参考电压发生器
所有的 ADC 和 DAC 模块都需要一个基准信号,这个信号就是我们常说的 Vref+,Vref-。
MSP430 的 ADC12 模块内部带有参考电源,通过控制 REFON 信号来启动内部参考电源,并且通过
REF2_5V 控制内部参考电源产生 1.5V 或者 2.5V 的 Vref+。
最后给 ADC 模块转换器的参考电压 Vr+和 Vr-通过 SREF_x 设置 6 种组合方式:
Vr+可以在 AVcc(系统模拟电源),Vref+(内部参考电源),Veref+(外部输入的参考电源)之间选择,
Vr-可以在 AVss(系统模拟地),Vref-/Veref-(内部或外部参考电源)。
[2]模拟多路通道
ADC12 可以选择多个通道的模拟输入,但是 ADC12 只有一个转换内核,所以这里有用到了模拟多路通道,
每次接通一个信号到 ADC 转换内核上。模拟多路通道包括了 8 路外部信号通道(A0~A7)和 4 路内部信
号通道(Vref+,Vref-/Veref-,(AVcc-AVss)/2,片内温度传感器)
[3]具有采样保持功能的 12 位模数转换内核
转换内核是有一个采样保持器和一个转换器组成。由于 ADC 转换需要一定的时间,对高速变化的信号进
行瞬时采样时,不等 ADC 转换完成,外部输入的信号就已经改变。所以在 ADC 转换器前加入了采样保持
器,一旦 ADC 开始转换,采样保持器则进行保持,即使现场输入的信号的变化比较快,也不会影响到 ADC
的转换工作。
12位的ADC转换器将Vr+和Vr-之间分割为2
12(4096)等份,然后将输入的模拟信号进行转换,输出0~4095
的数字。如果输入电压 Vin≤ Vr-则结果为 0,Vin≥Vr+结果为 4095。
[4]采样转换时续控制电路
这部分浩阔各种时钟信号,ADC12CLK 转换时钟,SAMPCON 采样转换信号,SHT 控制采样周期,SHS
控制采样触发来源,ADC12SSEL 选择内核时钟,ADC12DIV 时钟分频。
由图可以看出来 SAMPCON 信号高的时候采样,低的时候转换。而 SAMPCON 有 2 个来源,一来自采样
定时器,另一路由用户自己控制,通过 SHP 选择。
[5]转换结果存储
ADC12 一共有 12 个转换通道,设置了 16 个转换存储器用于暂时存储转换结果,合理设置后,ADC12 硬
件会自动将转换的结果保存到相应的存储器里。
ADC12 主要特点:
- 12 位转换精度,1 位非线形误差,1 位非线形积分误差
- 多种时钟源给 ADC12 模块,切本身自带时钟发生器
- 内置温度传感器
- TimerA/TimerB 硬件触发器
- 8 路外部通道和 4 路内部通道
- 内置参考电压源和 6 种参考电压组合
- 4 种模式的模数转换
- 16bit 的转换缓存
- ADC12 关闭支持超低功耗
- 采用速度快,最高 200Kbps
- 自动扫描
- DMA 使能
3 ADC12 寄存器
[1] ADC12CTL0 转换控制寄存器 0

ADC12CTL0 是 ADC12 最重要的控制寄存器之一。其中灰色的寄存器只有当 ENC=0 时才能更改。
ADC12SC:采样转换控制位(和 SHP,ISSH,ENC 有关)
在 ENC=1,ISSH=0 的情况下:
SHP=1 时:ADC12SC 由 0 变 1 时,启动 A/D 转换,转换完成后 ADC12SC 自动复位
SHP=0 时:ADC12SC 高电平时采样,ADC12SC 复位围启动一次转换
其中 ENC=1 表示转换允许,ISSH 表示输入信号为同相输入信号,
SHP=1 表示采 样信号 SAMPCON 来自于采样定时器,
SHP=0 表示 SAMPCON 采样有 ADC12SC 直接控制。
注意:当软件启动一次 A/D 转换时,ADC12SC 和 ENC 要在一条语句内完成设置。
ENC:转换允许位
0 ADC12 为初始状态,不能启动 A/D 转换
1 首次转换由 SAMPCON 的上升沿启动
注意:
[1]在 CONSEQ=0(单通道单次转换)的情况下,当 ADC12BUSY=1 时,
ENC=0 则会结束转换进程,并且得到错误结果。
[2]在 CONSEQ≠0(非单通道单次转换)的情况下,当 ADC12BUSY=1 时,
ENC=0 则转换正常结束,得到正确结果
ADC12TVIE:转换时间溢出中断允许(多次采样请求)
当前转换还没有完成时,又得到一次采样请求,如果 ADC12TVIE 允许的话,会产生中断。
0 允许发生转换时间溢出产生中断
1 禁止发生转换时间溢出产生中断
ADC12OVIE:溢出中断允许(ADC12MEMx 多次写入)
当 ADC12MEMx 还没有被读出的时候,而又有新的数据要求写入 ADC12MEMx 时,
如果允许则会产生中断
0 允许溢出中断
1 禁止溢出中断
ADC12ON:ADC12 内核控制
0 关闭 ADC12 内核实现低功耗
1 开启 ADC12 内核
REFON:内部基准电压发生器控制
0 关闭内部基准电压发生器
1开启内部基准电压发生器
REF2_5V:内部基准电压选择 1.5V/2.5V
0 选择 1.5V 内部参考电压
1 选择 2.5V 内部参考电压
MSC:多次采样/转换控制位
当 SHP=1,CONSEQ≠0 时,MSC 位才能生效
0 每次转换需要 SHI 信号的上升沿出发采样定时器
1 首次转换需要 SHI 信号的上升沿出发采样定时器,
以后每次转换在前一次转换结束后立即进行
SHT0x:0~7 通道的采样保持器时间控制
定义了 ADC12MEM0~7 中转换采样时序与采样时钟的关系
保持时间越短,采样速度越快,反映电压波动明显
Tsample= 4×TADC12CLK×N(N<13 时 N = 2n,n>13 时,N=256)
SHT1x:8~15 通道的采样保持器时间控制
定义了 ADC12MEM8~15 中转换采样时序与采样时钟的关系
保持时间越短,采样速度越快,反映电压波动明显
Tsample= 4×TADC12CLK×N(N<13 时 N = 2n,n>13 时,N=256)
[2] ADC12CTL1 转换控制寄存器

其中灰色的寄存器只有当 ENC=0 时才能更改。
CSTARTADD:单通道模式转换通道/多通道模式守通道
定义单次转换的启始地址或者序列通道转换的首地址。
SHSx:采样触发源选择
0 ADC12SC
1 TimerA.OUT1
2 TimerB.OUT1
3 TimerB.OUT2
SHP:采样信号 SAMPCON 选择
0 SAMPCON 信号来自采样触发输入信号
1 SAMPCON 信号来自采样定时器,由采样输入信号的上升沿触发
ISSH:采样输入信号同向/反向
0 采样信号为同相输入
1 采样信号为反相输入
ADC12DIVx:ADC12 时钟分频控制
ADC12 时钟源的分频因子选择位,分频因子为(x+1)
ADC12SSELx:ADC12 时钟选择
0 ADC12OSC(ADC12 内部时钟源)
1 ACLK
2 MCLK
3 SMCLK
COMSEQx:转换模式
0 单通道单次转换
1 序列通道单次转换
2 单通道多次转换
3 序列通道多次转换
ADC12BUSY:忙标志(转换中...)
0 表示 ADC12 没有活动的操作
1 ADC12 正在采样/转换期间,忙~~
[3] ADC12MCTLx 通道储存控制寄存器

通道储存控制寄存器控制各转换寄存器必须选择的基本条件。
EOS:多通道转换末通道标志
0 序列没有结束
1 该序列中最后一次转换
SREFx:基准源选择
0 Vr+=AVcc, Vr-=AVss
1 Vr+=Vref+, Vr-=AVss
2,3 Vr+=Veref+, Vr-=AVss
4 Vr+=AVcc, Vr-=Vref-/Veref-
5 Vr+=AVcc, Vr-=Vref-/Veref-
6,7 Vr+=AVcc, Vr-=Vref-/Veref
INCHx:所对应的模拟电压输入通道
0~7 A0~A7
8 Veref+
9 Veref-/Vref-
10 片内温度传感器
11~15 (AVcc-AVss)/2
[4] ADC12MEMx 通道储存寄存器

该组寄存器为 12 位寄存器,用来存放 A/D 转换结果,其中只用到了低 12 位,高 4 位为 0。
[5] ADC12IFG 中断标志寄存器

ADC12IFGx:中断标志位
对应于 ADC12MEMx,当 A/D 转换完成后,数据被存入 ADC12MEMx,此时 ADC12IFGx 标志置位。
[6] ADC12IE 中断控制寄存器

ADC12IEx:中断允许位
对应于 ADC12IFGx,如果 ADC12IEx 允许,则当 ADC12IFGx 置位时会进入 ADC12 的中断服务程序。
[7] ADC12IV 中断向量寄存器
由于 ADC12 是一个多源中断,有 18 个中断标志,但是只有一个中断向量。则 18 个中断标志按照优先级
安排对中断标志的响应。

4 ADC12 转换模式
ADC12 模块一共提供了 4 钟转换模式
- 单通道单次转换
- 序列通道单次转换
- 单通道多次转换
- 序列通道多次转换
不论用户使用何种模式,都需要注意以下问题
- 设置具体的转换模式
- 输入模拟信号
- 选择启动信号
- 关注结束信号
- 存放转换数据
采用查询或者中断方式来读取数据
[1] 单通道单次转换
进行单通道单次转换需要注意以下的设置
- 设置通道控制寄存器,设置采样通道和参考电压,ADC12MCTLx
- 单通道转换的地址 CSTARTADD,对应于上面的 ADC12MCTLx
- 相对应的中断标志 ADC12IFGx
下面是软件查询式的单通道单次转换所需要对 ADC12 进行的设置
1 //----------------------------------------------------------------------- 2 // 单通道单次转换的通道不一定要是 ADC12MCTL0, 程序中使用了 ADC12MCTL4, 但是采样的通道 3 // 是 A0, MSP430 中的 ADC12 通道设置是非常灵活的. 4 // ADC12 单通道单次转换(软件查询式) 5 void ADC12_Sampling_SingleChannelSingleConvert(void) 6 { 7 // ADC12 控制寄存器设置 8 // 内核开启, 启动内部基准, 选择 2.5V 基准, 设置采样保持时间 9 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2; 10 // 时钟源为内部震荡器, 出发信号来自采样定时器, 转换地址为 ADC12MCTL4 11 ADC12CTL1 = ADC12SSEL_0 + SHP + CSTARTADD_4; 12 // 转换通道设置 13 ADC12MCTL4 = SREF_1 + INCH_0; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A0 14 // 启动转换 15 ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 16 while((ADC12IFG & 0x0010) == 0); // 软件查询中断标志, 等待转换结束 17 _NOP(); // 处理 18 } 19 //----------------------------------------------------------------------- 20 下面是中断查询式的单通道单次转换所需要对 ADC12 进行的设置 21 //----------------------------------------------------------------------- 22 // ADC12 单通道单次转换(中断查询式) 23 void ADC12_Sampling_SingleChannelSingleConvert(void) 24 { 25 // ADC12 控制寄存器设置 26 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2; 27 ADC12CTL1 = ADC12SSEL_0 + SHP + CSTARTADD_4; 28 // 转换通道设置 29 ADC12MCTL4 = SREF_1 + INCH_0; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A0 30 // 中断允许 31 ADC12IE = 0x0010; 32 _EINT(); 33 // 启动转换 34 ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 35 __low_power_mode_0(); // 进入低功耗模式, 等待转换结束 36 } 37 // ADC12 中断向量 38 #pragma vector = ADC_VECTOR 39 __interrupt void ADC12_IRQ(void) 40 { 41 _NOP(); // 处理 42 __low_power_mode_off_on_exit(); // 中断结束时, 退出低功耗模式 43 } 44 //-----------------------------------------------------------------------
[2] 序列通道单次转换
进行序列通道单次转换需要注意以下的设置
- 设置若干个通道控制寄存器,设置采样通道和参考电压,ADC12MCTLx,最后一个通道需要加 EOS
- 序列通道转换的首地址 CSTARTADD,对应于上面的第一个 ADC12MCTLx 相对应的最后一个通道的中断标志 ADC12IFGx 下面是软件查询式的序列通道单次转换所需要对 ADC12 进行的设置
1 // ADC12 序列通道单次转换(软件查询式) 2 void ADC12_Sampling_SequenceChannelsSingleConvert(void) 3 { 4 // ADC12 控制寄存器设置 5 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2; 6 // CONSEQ_1 表示当前模式为序列通道单次转换, 起始地址为 ADC12MCTL4, 结束地址 ADC12MCTL6 7 ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_1 + CSTARTADD_4; 8 // 转换通道设置 9 ADC12MCTL4 = SREF_1 + INCH_0; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A0 10 ADC12MCTL5 = SREF_1 + INCH_1; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A1 11 ADC12MCTL6 = SREF_1 + INCH_10 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC 通道:片内温度传感器 12 // 启动转换 13 ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 14 while((ADC12IFG & 0x0040) == 0); // 等待转换结束 15 _NOP(); // 处理 16 } 17 //-----------------------------------------------------------------------
[3] 单通道多次转换
进行单通道多次转换需要注意以下的设置
- 设置通道控制寄存器,设置采样通道和参考电压,ADC12MCTLx
- 单通道转换地址 CSTARTADD,对应于上面的 ADC12MCTLx
- 单通道的中断标志 ADC12IFGx
- 多次转换只能使用中断查询式读数
下面是软件查询式的单通道多次转换所需要对 ADC12 进行的设置
1 //-------------------------------------------------------------------------------- 2 // ADC12 单通道多次转换 3 void ADC12_Sampling_SingleChannelSequenceConvert(void) 4 { 5 // ADC12 控制寄存器设置 6 // 对于多次转换需要设置 MSC 7 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2 + MSC; 8 // CONSEQ_2 表示当前模式为单通道多次转换, 转换地址为 ADC12MCTL4 9 ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_2 + CSTARTADD_4; 10 // 转换通道设置 11 ADC12MCTL4 = SREF_1 + INCH_4 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A4 12 // 中断允许 13 ADC12IE = 0x0010; 14 _EINT(); 15 // 启动转换 16 ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 17 } 18 // ADC12 中断向量 19 #pragma vector = ADC_VECTOR 20 __interrupt void ADC12_IRQ(void) 21 { 22 _NOP(); // 处理 23 } 24 //
[4] 序列通道多次转换
进行序列通道多次转换需要注意以下的设置
- 设置若干个通道控制寄存器,设置采样通道和参考电压,ADC12MCTLx,最后一个通道需要加 EOS
- 序列通道转换的首地址 CSTARTADD,对应于上面的第一个 ADC12MCTLx
- 相对应的最后一个通道的中断标志 ADC12IFGx
- 多次转换只能使用中断查询式读数
下面是软件查询式的序列通道多次转换所需要对 ADC12 进行的设置
1 // ADC12 序列通道多次转换 2 void ADC12_Sampling_SequenceChannelSequenceConvert(void) 3 { 4 // ADC12 控制寄存器设置 5 ADC12CTL0 = ADC12ON + REFON + REF2_5V + SHT0_2 + MSC; 6 ADC12CTL1 = ADC12SSEL_0 + SHP + CONSEQ_3 + CSTARTADD_4; 7 // 转换通道设置 8 ADC12MCTL4 = SREF_1 + INCH_4 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A4 9 ADC12MCTL5 = SREF_1 + INCH_5 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A5 10 ADC12MCTL6 = SREF_1 + INCH_6 + EOS; // 参考电压:V+=Vref+,V-=AVss ADC 通道:A6 11 // 中断允许 12 ADC12IE = 0x0040; 13 _EINT(); 14 // 启动转换 15 ADC12CTL0 |= ENC + ADC12SC; // 转换使能开始转换 16 } 17 // ADC12 中断向量 18 #pragma vector = ADC_VECTOR 19 __interrupt void ADC12_IRQ(void) 20 { 21 _NOP(); // 处理 22 } 23 //----------------

浙公网安备 33010602011771号