- 几个术语:
a) 分辨率(LSB):表示输出数字量变化一个相邻数码所需要输入模拟电压的变化量,它定义为转换器的满刻度电压与2的n次幂,其中n为ADC的位数。
b) 量化误差:由于有限数字对模拟值进行离散取值(量化)而引起的误差。因此,量化误差理论上为一个单位分辨率。即正负12LSB。
c) 转换精度:反应实际的ADC模块在量化上与理想的ADC模块进行模数转换的差值。
d) 转换时间:指ADC完成一次模/数转换所需要的时间。
2. 结构:
3. 参考电压发生器:
a) 指需要的基准信号,通常为电压基准。MSP430 ADC12内置参考电源,有6种可编程选择。
b) 模拟多路器:当多个模拟信号进行采样并进行A/D转换时,为了公用一个转换内核,模拟多路需要分时地将多个模拟信号连通,每次连通一个信号采样并转换。
c) MSP430 ADC12配置有8路外部通道和4路内部通道,通过A0~A7实现外部8路模拟信号输入,4路内部通道可以将多个基准电压和内部温度传感器的输出作为待转换模拟输入信号。
d) 具有采样与保持功能的12转化器内核:ADC12内核是一个12位的模数转换器,并能够将结果存放在转换器存储器中。该内核使用两个可编程的参考电压(Vr+和Vr-)定义转换的最大值和最小值。公式为:Nadc = 4095 * (Vin - Vr)/(Vr+ -Vr)
e) 采样转换所需的时序控制电路:提供采样及转换所需要的各种信号:ADC12CLK转换时钟,SAMPCON采样及转换信号、SHT控制的采样周期、SHS控制的采样触发来源选择、ADC12SSEL选择的内核时钟源及AC12DIV选择的分频系数。
4. ADC12寄存器:
a) 转换控制寄存器ADC12CTL0
i. ADC12SC采样/转换控制位:当ENC =1,ISSH = 0且SHP = 1时,ADC12SC由0到1启动A/D转换,A/D转换完成后ADC12SC自动复位,当SHP = 0时,ADC12SC保持高电平采样,ADC12SC复位时启动一次转换。
ii. ENC转换允许位:0为初始状态,不能启动A/D转换;1为首次转换由SAMPCON上升沿启动。
iii. ADC12TIVE转换时间溢出中断允许位:0:为没发生转换时间溢出,1为发生转换时间溢出。
iv. ADC12OVIE溢出中断允许位:0为没有发生溢出,1为发生溢出。
v. ADC12ON:ADC12内核控制位:0为关闭ADC12内核,1为打开。
vi. REFON:参考电压控制位,0为内部参考电压发生器关闭,1为内部参考电压发生器打开。
vii. 2.5V内部参考电压的电压值选择位:0为选择1.5V,1为选择2.5V。
viii. MSC多次采样/转换位:只有当SHP =1时才有效,0为每次转换需要SHI信号的上升沿触发采样定时器,1为仅首次转换由SHI信号的上升沿触发采样定时器,而后采样转换将在前一次转换完成后立即进行。
ix. SHT1/SHT0采样保持定时器:定义了保存在转换结果寄存器ADC12MEM8_ADC12MEM15和ADC12MEM0~ADC12MEM7中的转换采样时序与采样时钟ADC12CLK的关系,采样周期时ADC12CLK周期乘4的n倍。N为2的SHITx次幂。
b) 转换控制寄存器ADC12CTL1
i. CSStartAdd转换存储地址位,可以定义单次转换地址或序列转换的首地址。
ii. SHS采样输入触发源选择:0为ADC12SC,1为Timer_A.OUT1,2为Timer_B.OUT0,3为Timer_B.OUT1。
iii. SHP采样信号(SAMPCON)选择控制位:0为信号源来自采样触发输入信号,1为信号源来自采样定时器,由采样输入信号的上升沿触发采样定时器。
iv. ISSH采样输入信号方向控制位:0为采样输入信号为同向输入,1为反向。
v. ADC12DIV:ADC12时钟源分频因子选择为。
vi. ADC12SSEL ADC12内核时钟源选择:0为ADC12内部时钟源ADC12OSC(默认)为1为ACLK,为2为MCLK,为3为SMCLK。
vii. CONSEQ转换模式选择位:0为单通道单次转换模式,1为序列通道单次转换模式,2为序列通道多次转换模式,3为序列通道多次转换模式。
viii. ADC12BUSY ADC12忙标志位:0表示没有活动,1表示忙。
c) ADC12MEM0~ADC12MEM15转换存储寄存器:16位寄存器,用来存放A/D转换结果,只用其中低12位。
d) ADC12MCTLx转换存储器控制寄存器:
i. EOS:序列结束控制位:0为序列没有结束,1为结束。
ii. Sref参考电压源选择位:
iii. INCH选择模拟输入通道:该4位表示的二进制数为所选的模拟输入通道:
e) ADC12IFG中断标志寄存器:ADC12IFGx置位表示转换结束,并且转换结果已经装入转换存储寄存器;ADC12IFGx复位表示ADC12MEMx被访问。
f) ADC12IE中断使能寄存器:1为允许响应的ADC12IFGx在置位时发生的中断请求服务,0为禁止ADC12IFGx在置位时发生的中断请求服务。
g) ADC12IV中断向量寄存器。
5.初始化代码
- /*************************************************************************
- //名称 :ADC12Init
- //参数 :uchar Times-0为单次转换,1为多次转换,
- uchar Tube-0为单通告转换,1为多通道转换
- uchar n-待转换的通道(只有在Tube为0的时候有用)
- uchar V-0为内部参考电压,1为外部参考电压
- //返回值:无
- //功能 :完成ADC12Init的初始化
- *************************************************************************/
- void ADC12Init(uchar Times,uchar Tube,uchar n,unsigned char v)
- {
- if(Tube ==0) //单通道转换
- {
- if(v == 0)
- {
- ADC12CTL0 = ADC12ON + SHT0_8 + MSC + REFON + REF2_5V; //使用内部电压,打开ADC12内核,8分频,内部参考电压2.5V
- ADC12MCTL0 = SREF_0; //使用内部电压,参考位为AVCC和AVSS
- }
- if(v == 1)
- {
- ADC12CTL0 = ADC12ON + SHT0_8; //使用外部电压,打开ADC12内核,8分频
- ADC12MCTL0 = SREF_2; //使用外部电压,参考为为VeREF+和AVSS
- }
- if(Times == 0)ADC12CTL1 = SHP + CONSEQ_0; //单通道单次转换,采样信号来自采样定时器
- if(Times == 1)ADC12CTL1 = SHP + CONSEQ_2; //单通道多次转换,采样信号来自采样定时器
- switch (n) //选择通道
- {
- case 0:ADC12MCTL0 |= INCH_0;break;
- case 1:ADC12MCTL0 |= INCH_1;break;
- case 2:ADC12MCTL0 |= INCH_2;break;
- case 3:ADC12MCTL0 |= INCH_3;break;
- case 4:ADC12MCTL0 |= INCH_4;break;
- case 5:ADC12MCTL0 |= INCH_5;break;
- case 6:ADC12MCTL0 |= INCH_6;break;
- case 7:ADC12MCTL0 |= INCH_7;break;
- }
- ADC12IE = n; //使能待转换通道的中断
- ADC12CTL0 |= ENC; //开启软件使能
- }
- if(Tube ==1) //多通道转换
- {
- if(v == 0)
- {
- ADC12CTL0 = ADC12ON + SHT0_8 + MSC + REFON + REF2_5V; //使用内部电压,打开ADC12内核,8分频,内部参考电压2.5V
- ADC12MCTL0 = SREF_0; //使用内部电压,参考位为AVCC和AVSS
- }
- if(v == 1)
- {
- ADC12CTL0 = ADC12ON + SHT0_8; //使用外部电压,打开ADC12内核,8分频
- ADC12MCTL0 = SREF_2; //使用外部电压,参考为为VeREF+和AVSS
- }
- if(Times == 0)ADC12CTL1 = SHP + CONSEQ_1; //多通道单次转换,采样信号来自采样定时器
- if(Times == 1)ADC12CTL1 = SHP + CONSEQ_3; //多通道多次转换,采样信号来自采样定时器
- ADC12IE = 0xff; //使能待转换通道的中断
- ADC12CTL0 |= ENC; //开启软件使能
- }
- }