5638详细介绍

  • 格式:doc
  • 大小:89.00 KB
  • 文档页数:10

6.5 12位串行D/A转换器TLV5638应用实例6.5.1 TLV5638简介TLV5638是TI公司的12位D/A转换器,具有两个输出通道,数据传输接口为3线的串行接口,该接口能够与常用的微控制器或者微处理器直接相连。

每次传输数据由16位的数据组成一帧,其中4位控制命令字,12位输出数据。

TLV5638输出经过两个缓冲器,DAC的可编程建立时间使得设计人员能够优化速度与功耗分配的关系。

同时内置片上电压参考源,该参考源最大能达到1mA的电流,因此也可以将其作为整个系统的参考源,减少了系统设计的复杂性。

1.基本特性参数TLV5638的基本特性参数如下:● 12位分辨率;●双输出通道;●可编程内部参考源;●可变成速度(建立时间):快速模式1μs;慢速模式3.5μs;●兼容SPI串行接口;●差分非线性度<0.5LSB;●供电电源:2.7V~5.5V DC。

2.引脚配置TLV5638的引脚配置如图9-10所示。

9-10 TLV5638的引脚配置TLV5638的引脚功能说明:● DIN:串行数据输入● SCLK:串行接口时钟输入● /CS:片选信号输入,低电平有效● OUTA:A通道模拟电压输出● AGND:模拟地● REF:模拟电压参考输入/输出● OUTB:B通道模拟电压输出● VDD:供电电源(2.7V~5.5V)3.功能性说明TLV5638输入数据字长为16位,由两部分组成,如表9-4所示,其中,D15~D12为命令位,D11~D0为12位数据。

表9-4 TLV5638的16位数据字其中,SPD为速度模式选择,当SPD为高时,选择快速模式,当SPD为低时,选择慢速模式;PWR为电源模式设置,当PWR为高时,为掉电模式,当PWR为低时,为正常模式;R1与R0一起组成对TLV5638内部寄存器的选择,如表9-5所示。

表9-5 R1、R0选择内部寄存器当选择了 9-5中前面3个中的一个,即写数据到DACB、BUFFER或者DACA,则16位数据字中的后12位(D11~D0)为要写入的数据。

当选择了写数据大批控制寄存器,则R1R0=11,则16位数据字中的后12位(D11~D0)如表9-6所示,用来设置参考源。

表9-6 写数据到控制寄存器时,16位数据字中的后12位格式其中,REF1与REF0组合在一起,用来选择参考源,如表9-7所示。

表9-7 REF1、REF0与参考源的选择0 0 外部参考源0 1 内部参考源:1.024V1 0 内部参考源:2.048V1 1 外部参考源6.5.2 单片机与TLV5638接口电路设计设计单片机与TLV5638的应用电路如图9-11所示。

图9-11 单片机与TLV5638的应用电路6.5.3 单片机与TLV5638应用程序设计1.写数据到TLV5638时序单片机写数据到TLV5638的工作时序如图9-12所示。

图9-12 写数据到TLV5638的工作时序其中,时序图中各个延迟时间如表9-8所示。

符号名称最小典型最大单值值值位tSU(CS-CK) 建立时间,从CS有效到SCLK的第一个下降沿的10 - - ns时间10 - - ns tSU(C16-CS) 建立时间,从SCLK的第16个下降沿到CS为高的时间的时间tWH SCLK一个周期的高电平时间25 - - ns tWL SCLK一个周期的低电平时间25 - - ns tSU(D) 建立时间,数据有效到SCLK下降沿的时间10 - - ns tH(D) 保持时间,SCLK下降沿到数据无效的时间 5 - - ns 2.单片机与TLV5638应用持续流程图设计单片机与TLV5638应用程序流程如图9-13所示。

图9-13 单片机与TLV5638应用程序流程图3.C51源代码(1)TLV5638.h文件TLV5638.h文件如下:#ifndef _TLV5638_H_#define _TLV5638_H_#define uint unsigned int#define uchar unsigned char/ *** 参数定义 *** ///速度模式参数#define PASTSP 1 //快速模式#define SLOESP 0 //慢速模式//电源模式参数#define PWR_DOWN 1 //掉电模式#define PWR_ON 0 //正常模式//寄存器选择参数#define DACB_BUFFER 0 //写DACB和BUFFER#define BUFFER 1 //写BUFFER#define DACA_BUFFERTOB 2 //写DACA和BUFFER的值更新DACB #define CONTROL 3 //写控制寄存器//参考源选择参数#define EXTERNAL 0 //外部参考源#define IN_1024 1 //内部1.024V参考源#define IN_2048 2 //内部2.048V参考源//引脚定义sbit PinDIN=P0^0;sbit PinSCLK=P0^2;sbit PinCS=P0^4;//函数功能:短延时void nNOP(uchar x);//函数功能:长延时void LongDelay(uint i);//函数功能:置/复位CS信号//说明:x=1—置位,x=0—复位#define SetCS(x)(PinCS=(x)?1:0)//函数功能:置/复位SCLK信号//说明:x=1—置位,x=0—复位#define SetSCLK(x) (PinSCLK=(x)?1:0)//函数功能:向SPI写16位数据//说明:temp为16位的数据void SPIWrite(int temp);//函数功能:将电压值转换为对应的12位数字量//说明:ref为参考源,ex_ref为当选择外部参考源的电压值,// out_volt为输出模拟电压值// 返回12数字量int VoltToData(uint ref,float ex_ref,float out_volt);//函数功能:设置DAC A(即A通道)输出//说明:speed为速度模式,ref为参考源选择,temp为需要输出的电压// ex_ref为当选择外部参考源的电压值void SetDAC_A(uint speed,uint ref,float ex_ref,float temp);//函数功能:设置DAC B(即B通道)输出//说明:speed为速度模式,ref为参考源选择,temp为需要输出的电压// ex_ref为当选择外部参考源的电压值void SetDAC_B(uint speed,uint ref,float ex_ref,float temp); //函数功能:设置DAC A与DAC B同时输出//说明:speed为速度模式,ref为参考源选择,// temp1为A通道需要输出的电压,temp2为B通道需要输出的电压// ex_ref为当选择外部参考源的电压值void SetDAC_AB(uint speed,uint ref,float ex_ref,float temp1,float temp2); #endif//_TLV5638_H_(2)TLV5638.c文件TLV5638.c文件如下:#include <reg52.h>#include “TLV5638.H”//短延时函数:nNop( )void nNop(uchar i){ for(;i>0;i--);{//长延时函数:LongDelay( )void LongDelay(uint i){ uint j;for(;i>0;i--){ for(j=1000;j>0;j--);}}//向SPI写16位数据函数:SPIWrite( )void SPIWrite(int temp){ uint i;SetCS(0);for(i=0;i<16;i++){ PinDIN=(bit)(temp&0x8000);SetSCLK(1);temp<<=1;nNop(1);SetSCLK(0);nNop(1);}SetCS(1);}//将电压值转换为对应的12位数字量函数:VoltToData( )int VoltToData(uint ref,float ex_ref,float out_volt){ int temp;switch(ref){ case EXTERNAL:temp=(int)((out_volt*4096)/(2*ex_ref));break;case IN_1024:temp=(int)((out_volt*4096)/(2*1.024));break;case IN_2048:temp=(int)((out_volt*4096)/(2*2.048));break;default:break;}return(temp&0xfff);}//设置DAC A(即A通道)输出函数:SetDAC_A( )void SetDAC_A(uint speed,uint ref,float ex_ref,float temp) { int ModCMD;int Data;ModCMD=0x9000|(speed<<14)|(ref);Data=VoltToData(ref,ex_ref,temp);Data=Data|0x8000|(speed<<14);SPIWrite(ModCMD);nNop(10);SPIWrite(Data);}//设置DAC B(即B通道)输出函数:SetDAC_B( )void SetDAC_B(uint speed,uint ref,float ex_ref,float temp){ int ModCMD;int Data;ModCMD=0x9000|(speed<<14)|(ref);Data=VoltToData(ref,ex_ref,temp);Data=Data|0x0000|(speed<<14);SPIWrite(ModCMD);nNop(10);SPIWrite(Data);}//设置DAC A与DAC B同时输出函数SetDAC_AB( )void SetDAC_AB(uint speed,uint ref,float ex_ref,float temp1,float temp2) { int ModCMD;int DataA,DataB;ModCMD=0x9000|(speed<<14)|(ref);DataA=VoltToData(ref,ex_ref,temp1);DataA=DataA|0x8000|(speed<<14);DataB=VoltToData(ref,ex_ref,temp2);DataB=DataB|0x1000|(speed<<14);SPIWrite(ModCMD);SPIWrite(DataB);SPIWrite(DataA);}(3)Main.c文件Main.c文件如下:#include<reg52.h>#include”TLV5638.h”void InitIO( ){ PinDIN=0;PinCS=0;PinSCLK=0;}void main( ){ InitIO( );while(1){ //SetDAC_A(FASTSP,IN_1024,0,1.0);//SetDAC_B(FASTSP,IN_1024,0,1.0);SetDAC_AB(FASTSP,IN_1024,0,1.0,2.0);}}。