基于ARM的AD和DA转换模块的设计Word格式.doc
《基于ARM的AD和DA转换模块的设计Word格式.doc》由会员分享,可在线阅读,更多相关《基于ARM的AD和DA转换模块的设计Word格式.doc(5页珍藏版)》请在冰豆网上搜索。
(FacultyofAutomation,GuangdongUniversityofTechnology,Guangzhou510050)
Abstract:
TheapplicationofA/DandD/Achangehavebeenenteringintoanewstepbasedondevelopmentofthesensornetworktechnologyinrecentyears.ThepaperintroducedthedesignofA/DandD/AchangethroughcontrollingTLC2543andDAC5573thatweremadefromTICompanybasedontheS3C4510system.Thesystemhadagreatexpansionandastrongoperation,anditapplyinallaspectsofthetechnologyofthesensor.
Keyword:
A/D;
0、引言
传感测试技术正朝着多功能化、微型化、智能化、网络化、无线化的方向发展[1]。
无线传感器网络(WirelessSensorNetwork)作为其中新兴技术,是目前国内外研究的热点。
随着电子产业数字化程度的不断成熟,目前的控制电路以ARM系统为主体,同时在ARM系统下包含了很多数字电路和模拟电路的混合电路[2]。
所以作为模拟和数字电路的接口的A/D转换器和D/A转换器,越来越受关注。
人们对A/D转换器和D/A转换器的要求也越来越高,新型的模拟/数字转换技术不断涌现[3]。
A/D转换器具有三个基本功能:
采样、量化和编码。
如何实现这三个功能,决定A/D转换器的电路结构和工作性能。
A/D转换器的类型很多,包括全并行模拟/数字转换,两步型模拟/数字转换,插值折叠型模拟/数字转换,流水线型模拟/数字转换,逐次逼近型模拟/数字转换。
本文要介绍的TLC2543采用逐次逼近型模拟/数字转换,SPI的电路接口,结构简单,面积和功耗小,而且不存在延迟问题。
非常适合工业控制和数据采集系统[4]。
D/A转换器由电阻阵列和n个电流开关(或电压开关)构成,并按数字输入值切换开关,产生比例于输入的电流(或电压)。
一般按输出是电流还是电压、能否作乘法运算等进行分类。
本文要介绍的DAC5573采用的是电压输出型。
它采用内置输出放大器以低阻抗输出,直接输出电压的器件仅用于高阻抗负载,由于无输出放大器部分的延迟,作为高速DA转换器使用。
该DAC具有高速IIC接口,而且功耗很低,能广泛应用于伺服系统控制、过程自动化控制及音频处理中[5]。
因此,TI公司的TLC2543和DAC5573无论从采样精度到转换时间上都是很先进,完全能够满足设计者的要求。
1、AD/DA转换模块的设计特点
1、1扩展性
扩展性包括两部分:
1、IIC的扩展,IIC的扩展是通过把IIC接口标准的芯片放在同一个IIC接口上来实现的。
它们是靠地址来识别,DAC5573有4个地址位,所以IIC总线上可以外接16个DAC5573,每个DAC5573有4路输出,总共能扩展成64路模拟量输出。
完全可以满足设计系统的要求,如图1.1所示。
除了能够接入DAC5573,还可以连接其他IIC接口的芯片来实现其他功能,例如可以增加PCA9555来扩展IO,增加铁电存储器FM31256等。
2、SPI扩展,SPI的扩展基于相同的数据输出DOUT,数据输入DIN,时钟SCLK总线的基础上,通过采用不同的片选SS引脚来扩展,如图1.2所示。
若要控制总线上的某一个芯片,只需把该芯片的SS引脚的电平拉低,就可以对此芯片进行操作。
所以理论上只要有足够的IO口,可以连接无数个TLC2543。
而IO口的扩展可以通过PCA9555来实现。
该设计完全能满足系统对A/D转换通道的要求。
图1IIC总线的扩展
图2SPI总线的扩展
1、2可操作性强
可操作性强主要体现在它们都能够与5V和3.3V供电的处理器一起使用。
对于TLC2543,虽然TLC2543采用5V的电源,但是由于它本身IO口的高电平识别范围广,2.7V到6V的电压值都能准确地识别成高电平。
所以当它接入现在常用的ARM系统时,不仅能够正常使用。
而且把电压的输入范围从0-3.3V增加到0-5V。
提高了它的应用范围。
为了让DAC5573适应大多数控制处理器的要求,它本身有一个IO口电平选择引脚IOVDD,当接到5V供电的单片机上时,IOVDD需要接到5V;
当接到像S3C4510那样使用3.3V供电的处理器上,IOVDD需要接到3.3V上;
同时DAC5573可以支持0-3.3V的0-5V输出。
2、A/D转换模块的设计
2、1硬件系统的设计
TLC2543是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D转换过程[6]。
来自外部的11路模拟通道,它们的输入的范围是0-5V。
但是需要下拉一个1.2K的电阻,否则会导致输入信号会波动。
然后TLC2543通过标准四线的SPI口与S3C4510连接,S3C4510没有专门的SPI控制器,所以只需连接到它的四个IO口,并通过IO口来模拟SPI的时序。
如图2.1所示,其中连接到CS脚且标号为CSad的引脚作为片选端。
在CSad端由高变低时,内部计数器复位。
由低变高时,在设定时间内禁止数据传送和时钟信号的产生;
SCLK作为输入/输出时钟端。
SCLK接收串行输入信号并完成以下四个功能:
(1)在SCLK的前8个上升沿,8位输入数据存入输入数据寄存器。
(2)在SCLK的第4个下降沿,被选通的模拟输入电压开始向电容器充电,直到SCLK的最后一个下降沿为止。
(3)将前一次转换数据的其余11位输出到DOUT端,在SCLK的下降沿时,数据开始变化。
(4)SCLK的最后一个下降沿,将转换的控制信号传送到内部状态控制位;
DIN作为输入数据端,输入的数据是一个8位的数据流,它包含4位模拟通道地址,一个2位的数据长度选择,以及一位MSB或LSB的优先和一个单极或双极输出位。
DOUT作为A/D转换结果的三态串行输出端。
CSad为高时处于高阻抗状态,CSad为低时处于激活状态。
图3TLC2543硬件连接图
2、2程序设计
AD转换程序的设计是根据TLC2543的转换过程来实现的,转换的过程包括以下几方面的步骤,首先,需要对芯片进行初始化,上电后,CSad必须由高电平变成低电平来使SCLK时钟信号有效。
然后紧跟着是输入一个八位的数据流,其中数据流的前四位是模拟通道的选择,若四位都是为零,那就表示选择通道A0,除了11个模拟通道外,芯片还提供了测试电压的输入,这样就可以在某一个通道上不加入模拟电压的情况下,验证程序是否准确。
极大地提高了开发的效率。
八位数据流的后四位是控制位,它们和前四位都是在SCLK的上升沿有效。
而数据输出出现在SCLK的下降沿。
CS_OFF();
//激活TLC2543
z=0xB4;
//选用芯片的参考电压作为模拟量的输入,输出数据的长度为8位
for(j=1;
j<
=8;
j++)//把0x24由高位到低位写入IO数据寄存器
{k=((z&
0x80)>
>
7);
//用临时变量k来存储数据
rIOPDATA=(k<
<
13);
//数据输入
u=(rIOPDATA>
12);
//数据输出采集
add_sum(u);
//把数据累计起来
LED14_ON();
//时钟信号
for(i=0;
i<
1000;
i++)
SCLK_ON();
//时钟信号电平拉高
SCLK_OFF);
//时钟信号电平拉低
z=(z<
1);
//数据移位
}
程序执行结果如图2.2所示。
图2.2A/D转换程序运行结果
3、D/A转换模块的设计
3、1硬件模块的设计
DAC5573具有I2C接口的8位四路。
DAC5573相对TLC2543来说,硬件的连接简单很多,因为它采用标准的IIC总线,同时S3C4510里包含IIC的控制器,所以DAC5573只需接到4510的SDA和SCL这两个引脚,就可以实现两者之间的通信。
具体电路图如图3.1所示。
需要注意的是,SDA和SCL这两个引脚需要上拉电阻值为10K欧的电阻,来确保IIC总线能够释放出来。
DAC5573可以通过VREFH和VREFL这两个引脚来调节输出电压的计算。
输出的电压遵循以下的数学表达式:
VOUT=2*VREFL+(VREFH-VREFL)*D/255。
其中D是存储在DAC寄存器的二进制数,范围从0X00至0XFF。
在本设计中,VREFL=0V,VREFL=5V,所以VOUT=5*D/255。
图3.1DAC5573的硬件连接图
3、2程序设计
DAC5573符合标准的IIC模式(传输的数率为100Kbps)的设计。
就是主机传输之前有开始条件,开始条件通过SDA从高电平向低电平转变来实现。
其次把DAC5573的地址字节写入移位寄存器中,移位寄存器的BF位自动清零。
当数据传输完成,BF位置为高电平。
然后需要向从机DAC5573写入控制字节。
控制字节主要实现输出通道的选择,本程序设计中控制字节=0x52,选择了四个通道中的B通道。
完成以上工作后,就可以传输数据了。
数据按照16位的数据格式来传输的,其中高八位是DAC寄存器的二进制数,低八位是无关要紧的数据,对输出不产生任何影响。
本程序设计中,存入DAC寄存器的数D=0x80,根据VOUT=5*D/255这个表达式,输出的电压为2.5V。
最后,需要把SDA从低电平转变成高电平得方式来停止IIC的操作。
IIC_init();
//对DAC5573复位
while(IICCON&
BUSY);
//判断IIC总线是否忙,一直等待至总线空闲
IICCON=START|ACK;
//读取开始
IICBUF=slave_addr;
//写入从机地址
while(!
(IICCON&
BF));
//判断数据是否传输完成,若完成BF位为1
IICBUF=(int)addr;
//写入控制字节
//判断数据是否传输完成,若完成BF位为1
for(i=0;
size;
{IICBUF=*pdata++;
//写入