比较结果存于数据寄存器的Dn-1位。
然后在第二个脉冲作用下,N位寄存器的次高位置1,其他低位置0。
如最高位已存1,则此时VN=(3/4)VREF。
于是VIN再与(3/4)VREF相比较,如VIN≥(3/4)VREF,则次高位Dn-2存1,否则Dn-2=0;……。
以此类推,逐次比较得到输出数字量。
A/D转换器的主要技术指标
1)ADC的分辨率是指使输出数字量变化一个相邻数码所需输入模拟电压的变化量。
常用二进制的位数表示。
例如12位ADC的分辨率就是12位,或者说分辨率为满刻度FS的1/212。
一个5V满刻度的12位ADC能分辨输入电压变化最小值是5V×1/212=1.22mV。
2)偏移误差是指输入信号为零时,输出信号不为零的值,所以有时又称为零值误差。
假定ADC没有非线性误差,则其转换特性曲线各阶梯中点的连线必定是直线,这条直线与横轴相交点所对应的输入电压值就是偏移误差。
3)满刻度误差又称为增益误差。
ADC的满刻度误差是指满刻度输出数码所对应的实际输入电压与理想输入电压之差。
4)线性度有时又称为非线性度,它是指转换器实际的转换特性与理想直线的最大偏差。
5)绝对精度是指在一个转换器中,任何数码所对应的实际模拟量输入与理论模拟输入之差的最大值,称为绝对精度。
对于ADC而言,可以在每一个阶梯的水平中点进行测量,它包括了所有的误差。
6)ADC的转换速率是能够重复进行数据转换的速度,即每秒转换的次数。
而完成一次A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。
实例6-1D/A转换器应用一:
锯齿波、三角波和方波发生器
任务要求:
以MSP430F249为控制核心,DAC0832为数模转换器,设计一个简易波形发生器,分别产生锯齿波、三角波和方波,周期均为100ms,产生的波形如图6.4所示。
图6.4锯齿波、三角波和方波示意图
1)硬件电路设计
数模转换器采用通用的8位D/A转换芯片DAC0832,DAC0832接成直通方式工作,工作和参考电源均为+5V。
反相放大电路采用通用运放uA741,工作电源为±15V,反馈电阻直接采用DAC0832的内部电阻。
MSP430F249单片机的P4口作为数据输出口,D/A转换结果由仿真软件的虚拟示波器进行观察。
系统硬件电路如图6.5所示。
图6.5简易波形发生器硬件电路
2)程序设计
为了精确控制输出波形的周期,单片机CPU时钟采用XT2外接8MHz晶振。
设置MSP430F249单片机的P4口为输出,P4口输出的数据由小到大,例如从0到0xFF就能产生锯齿波。
要求产生的锯齿波周期为100ms,因此,单片机输出的每个数据保持时间为100000/256=390.625us;P4口输出的数据由小到大,再由大到小,例如从0加一变化到0xFF,再从0xFF减一变化到0就能产生三角波,单片机输出的每个数据保持时间为锯齿波的一半,即195us;方波高电平-1V,低电平-5V,对应的P4口数据分别51和255,方波高电平和低电平时间各为50ms。
#include"MSP430F249.h"
#defineCPU_F((double)8000000)//系统时钟为8MHz
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
voidsawtooth(void)
{
chari;
P4OUT=i++;//i的值从0到255,不断循环
delay_us(390);//微秒的延时
}
voidtriangular(void)
{
chari;
for(i=0;i<255;i++)
{P4OUT=i;//i的值从0到255
delay_us(195);//微秒的延时
}
for(i=255;i>0;i--)
{P4OUT=i;//i的值从0到255
delay_us(195);//微秒的延时
}
}
voidsquare(void)
{
P4OUT=51;
delay_ms(50);//毫秒的延时
P4OUT=255;
delay_ms(50);//毫秒的延时
}
voidmain(void)
{unsignedinti;
WDTCTL=WDTPW+WDTHOLD;//关看门狗
BCSCTL1&=~XT2OFF;//使TX2有效,TX2上电时默认为关闭的.
do
{IFG1&=~OFIFG;//清振荡器失效标志
for(i=0xff;i>0;i--);//延时,待稳定.
}
while((IFG1&OFIFG)!
=0);//若振荡器失效标志有效
BCSCTL2|=SELM1;//使MCLK=XT2
P4DIR=0XFF;
while
(1)
{
sawtooth();//锯齿波
//triangular();//三角波
//square();//方波
}
}
在IAR软件430的编译器里面我们可以利用它内部的延时子程序来实现我们想要的高精度软件延时,方法如下:
将以下代码复制到你的*.C源文件中。
#defineCPU_F((double)8000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
在#defineCPU_F((double)8000000)语句里8000000修改成你当前MSP430CPU的主频频率,即CPU的MCLK。
单位为HZ。
本例中的8000000为MCLK=8MHZ的意思。
__delay_cycles()是编译系统函数。
3)仿真结果与分析
通过子程序调用,分别仿真运行后得到仿真结果如图6.6至图6.8所示,三种波形的幅值、周期均满足课题要求。
图6.6周期100ms的锯齿波
图6.7周期100ms的三角波
图6.8周期100ms的方波
思考:
1.本电路运放需要±15v电源,请问能采用单电源运放完成本课题任务吗?
2.本电路输出电压为负,要得到正电压输出怎么实现?
实例6.2D/A转换器应用二:
正弦波发生器
任务要求:
在实例6-1的简易波形发生器基础上实现正弦波信号输出,最大值±5v,频率为50Hz。
1)硬件电路设计
图6.5简易波形发生器硬件电路只能输出0~-5V电压,本课题要求输出最大值±5V正弦信号,运放电路采用两级设计,第二级为加法电路,可以实现双极性输出。
正弦波发生器如图6.9所示,当V1out=0时,V2out=+5V;当V1out=-2.5V时,V2out=0;当V1out=-5V时,V2out=-5V。
因此,图6.9双极性电路就能实现输出±5V电压信号。
图6.9正弦波发生器电路
2)程序设计
由单片机产生正弦波信号一般方法是事先建立一张正弦波数据表,单片机按查表方式经D/A输出得到正弦波信号。
我们采用的DA转换器是8位的,因此正弦波数据表最多256个值。
一般单片机输出64点或128点,经DA电路后得到的正弦波波形就比较完美了,下面我们以128点输出为例完成本课题任务。
要求正弦波频率为50Hz,那么周期就是20ms,20000/128=156.25us,即单片机输出的每个数据保持156us。
为了得到128点的正弦波数据表,我们在matlab环境中新建如下的m文件。
x=0:
1:
127;%取128点
Y=round(127*sin(2*pi*x/128))+128;%得到正弦波数据
fid=fopen('d:
\sin256.txt','w');%新建并打开d:
\sin256.txt文件,写允许
fprintf(fid,'%d,',Y);%将数据写入d:
\sin256.txt文件
fclose(fid);%关闭d:
\sin256.txt文件
plot(x,Y)%画图查看正弦曲线
matlab语句说明:
round()为取整数函数,四舍五入,DA转换值只能是正数;fopen()和fclose()分别为文件打开和关闭函数。
以上程序运行后,可以到d盘根目录中找到sin256.txt文件,得到正弦波数据。
#include"MSP430F249.h"
#defineCPU_F((double)8000000)//系统时钟为8MHz
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
chardata_Sin[128]={
128,134,140,147,153,159,165,171,177,182,188,193,199,204,209,213,
218,222,226,230,234,237,240,243,245,248,250,251,253,254,254,255,
255,255,254,254,253,251,250,248,245,243,240,237,234,230,226,222,
218,213,209,204,199,193,188,182,177,171,165,159,153,147,140,134,
128,122,116,109,103,97,91,85,79,74,68,63,57,52,47,43,38,34,30,26,
22,19,16,13,11,8,6,5,3,2,2,1,1,1,2,2,3,5,6,8,11,13,16,19,22,26,30,
34,38,43,47,52,57,63,68,74,79,85,91,97,103,109,116,122};//128点正弦波样本值intmain(void)
{
chari;
WDTCTL=WDTPW+WDTHOLD;
P4DIR=0xFF;//P4口输出
while
(1)
{
for(i=0;i<128;i++)
{
P4OUT=data_Sin[i];
delay_us(156);//微秒的延时
}
}
}
3)仿真结果与分析
图6.10D/A输出的正弦波信号
A通道是最大值范围±5V,频率50Hz的正弦波信号;B通道是最大值范围0~-5V,频率50Hz的正弦波信号;A通道和B通道输出信号相位相差180度。
6.2MSP430F249的A/D转换器
MSP430F249单片机内置了ADC12模块,ADC12是一个12位精度的A/D转换模块。
从图6.11ADC12结构图中可以看出,ADC12模块中是由以下部分组成:
输入的16路模拟开关,ADC内部电压参考源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等组成。
图6.11ADC12结构图
1)输入的16路模拟开关
16路模拟开关选择外部的8路模拟信号输入和内部4路参考电源输入。
外部8路从A0~A7输入,主要是外部测量时的模拟变量信号。
内部4路分别是:
1路Veref+,外部参考电源的正端;1路Vref-/Veref-,内部/外部参考电源负端;1路(AVCC-AVSS)/2电压源;1路内部温度传感器源。
片内温度传感器可以用于测量芯片上的温度,而其他电源参考源输入可以用作ADC12的校验之用,在设计时可作自身校准。
2)ADC内部电压参考源
ADC电压参考源是用于给ADC12内核作为一个基准信号之用的,这是ADC必不可少的一部分。
在ADC12模块中基准电压源可以通过软件来设置6种不同的组合。
VR+(有3种)AVCC,Vref+,Veref+;VR-(有2种)AVSS,Vref-/
Veref-。
3)ADC12内核
ADC12的模块内核是共用的,通过前端的模拟开关分别完成采集输入。
ADC12是一个精度为12位的ADC内核。
内核在转换时会用到两个参考基准电压,一个是最大值,当模拟开关输出的模拟变量大于或等于最大值时ADC内核的输出数字量为满量程,也就是0xfff;另一个则是最小值,当模拟开关输出的模拟变量小于或等于最小值时ADC内核的输出数字量为最低量程,也就是0x00。
而这两个参考电压是可以通过软件来编程设置的。
4)ADC时钟源部分
ADC12的时钟源分别有ADC12OSC,ACLK,MCLK,SMCLK。
通过编程可以选择其中之一的时钟源,同时还可以适当的分频。
5)采集与保持,触发源部分
ADC12模块中有着较好的采集与保持电路,采用不同的设置有着灵活的应用。
6)ADC数据输出部分
ADC内核在每次完成转换时都会将相应通道上的输出结果存贮到相应通道缓冲区单元中,共有16个通道缓冲单元。
同时16个通道的缓冲单元有着相对应的控制寄存器,以实现更灵活的控制。
ADC12模块采样与转换所需的时序控制:
ADC12CLK转换时钟,SAMPCON采样及转换信号,SHT控制的采样周期,SHS控制的采样触发源,ADC12SSEL选择的内核时钟源,ADC12DIV选择的分频系数。
具体如何设置,见寄存器说明部分。
ADC12模块有4种转换模式:
单通道单次转换、序列通道单次转换、单通道多次转换和序列通道多次转换,它们由寄存器ADC12CTL1中的CONSEQx位进行选择。
(1)单通道单次转换模式
(2)序列通道单次转换模式
(3)单通道多次转换模式
(4)序列通道多次转换模式
ADC12模块的所有寄存器:
序号
地址
寄存器符号
寄存器名称
1
01A0H
ADC12CTL0
转换控制寄存器0
2
01A2H
ADC12CTL1
转换控制寄存器1
3
01A4H
ADC12IFG
中断标志寄存器
4
01A6H
ADC12IE
中断使能寄存器
5
01A8H
ADC12IV
中断向量寄存器
6
…
21
0140H
…
015EH
ADC12MCTL0
…
ADC12MCTL15
存储控制寄存器0
…
存储控制寄存器15
22
…
37
080H
…
08FH
ADC12MEM0
…
ADC12MEM15
存储寄存器0
…
存储寄存器15
ADC12控制寄存器0,ADC12CTL0
15
14
13
12
11
10
9
8
SHT1x
SHT0x
7
6
5
4
3
2
1
0
MSC
REF2.5V
REFON
ADC12ON
ADC12OVIE
ADC12TVIE
ENC
ADC12SC
SHT1x(x=0~3)定义ADC12MEM8~ADC12MEM15的采样保持时间
SHT0x(x=0~3)定义ADC12MEM0~ADC12MEM7的采样保持时间
SHT00
SHT03
ADC12CLK
的周期
宏定义
SHT00
SHT03
ADC12CLK
的周期
宏定义
0000
4
SHT0_0
1000
256
SHT0_8
0001
8
SHT0_1
1001
384
SHT0_9
0010
16
SHT0_2
1010
512
SHT0_10
0011
32
SHT0_3
1011
768
SHT0_11
0100
64
SHT0_4
1100
1024
SHT0_12
0101
96
SHT0_5
1101
1024
SHT0_13
0110
128
SHT0_6
1110
1024
SHT0_14
0111
192
SHT0_7
1111
1024
SHT0_15
注:
SHT10~SHT13的宏定义为SHT1_0~SHT1_15,SHT1定义的ADC12CLK的周期同上表。
MSC多次采样转换位,序列通道或单通道多次转换模式有效。
0表示每次采样转换过程需要SHI信号的上升沿来触发;1表示SHI信号的第一个上升沿触发采样定时器,但随后的采样转换在上次转换完成后自动进行。
REF2.5V内部参考电压的电压值选择位:
0选择1.5V内部参考电压;1选择2.5V内部参考电压。
REFON参考电压控制:
0内部参考电压发生器关闭,1内部参考电压发生器打开。
ADC12ONADC12内核控制位:
0关闭ADC12内核,1打开ADC12内核。
ADC12OVIE溢出中断允许位:
0溢出中断允许,1溢出中断禁止。
当ADC12MEMx中原有的数据还没有被读出,而现在又有新的转换结果数据要写入时,则会发生溢出。
如果相应的中断允许,则会发生中断请求。
ADC12TVIE转换时间溢出中断允许位:
0没发生转换时间溢出,1发生转换时间溢出。
当前转换还没有完成时,又发生一次采样请求,则会发生转换时间溢出。
如果允许中断,则会发生中断请求。
ENC转换允许位:
0转换禁止;1转换允许。
只有在该位