串行DA转换实验

串行DA转换实验
串行DA转换实验

实验一串行D/A转换实验

实验目的

1、了解串行D/A TLC5615的功能与特性

2、理解串行D/A TLC5615的工作时序

3、掌握串行D/A TLC5615驱动程序编程

实验仪器

单片机开发板、万利仿真机、稳压电源、计算机

实验原理

1、TLC5615功能与特性

TLC5615为美国德州仪器公司1999年推出的产品,是具有串行接口的数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上电复位功能,即把DAC寄存器复位至全零。其特点有:

(1)10位CMOS电压输出;

(2)5V单电源供电;

(3)与CPU三线串行接口;

(4)最大输出电压可达基准电压的二倍;

(5)输出电压具有和基准电压相同极性;

(6)建立时间12.5μs;

(7)内部上电复位;

(8)低功耗,最大仅1.75mW。

TLC5615内部结构图如图4-34所示。

图4-34 TLC5615内部结构图

2、TLC5615的时序

TLC5615接口时序兼容SPI、QSPI、WSPI、Microwire。如图4-35所示。

图4-35 TLC5615接口时序图

当片选信号有效时,串行接口可以输入数据。从图可知看出,当SCLK 的正脉冲锁存输入的数据。串行数模转换器TLC5615的使用有两种方式,即级联方式和非级联方式。如不使用级联方式,DIN 只需输入12位数据。DIN 输入的12位数据中,前10位为TLC5615输入的D/A 转换数据,且输入时高位在前,低位在后,后两位必须写入数值为零的低于LSB 的位,因为TLC5615的DAC 输入锁存器为12位宽。如果使用TL5615的级联功能,来自DOUT 的数据需要输入16位时钟下降沿,因此完成一次数据输入需要16个时钟周期,输入的数据也应为16位。输入的数据中,前4位为高虚拟位,中间10位为D/A 转换数据,最后2位为低于LSB 的位为零。如图4-36所示。

图4-36 TLC5615数据格式

3、 TLC5615串行D/A 电路连接

实验电路如图4-37所示。TLC5615的片选信号由

P2口经74LS138译码后给定。时钟线,数据线分别接

P1.7、P1.5。参考电源为2.048V ,这时输出电压最大值

是4.096V 。当需要级联时,只需把TLC5615的第4脚

接到第2片的数据输入,时钟端、片选端只需并联即可。

4、 TLC5615驱动程序设计 TLC5615的驱动程序主要是用软件模拟SPI 接口

(也可以用STC12C 系例单片机的SPI 接口输出)。首先

设计出一次串行输出8位的SPI 子程序,然后再按TLC5615规定的格式输出数据。流程图

图4-38 TLC5615驱动程序流程图

图4-37 TLC5615电路板

实验内容

1、三角波程序:

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define CS_1 P2=0xff; //片选信号关

#define CS_0 P2=0x00; //开

sbit SCLK=P1^7; //时钟输入位

sbit DIN=P1^5;

uint DAvalue=0; //数据输入位

/*********************************

DA转换函数

**********************************/

void DA_conver(uint DAdata)

{

uchar i;

DAdata<<=6; //移除高6位

CS_1;//片选无效

SCLK=0;

DIN=0;

CS_0; //片选有效

for(i=0;i<12;i++) //移入12位数据

{

DIN=(bit)(DAdata&0x8000); //取最高位

SCLK=1;

DAdata<<=1; //准备下一位

SCLK=0; //准备下一个上升沿

}

CS_1; //将10位有效数据压入寄存器中进行D/A转换

//P2=0xff;

SCLK=0;

}

/****************************************

主函数

*****************************************/

void main()

{

// DAvalue=512;

while(1)

{

for(DAvalue=16;DAvalue<993;DAvalue+=16)//根据电压出去=电压基准*(N/1024)得出加数规律{

DA_conver(DAvalue); //调用D/A转换函数

delay1ms(5); //延时 }

if(DAvalue=1008)

{

DA_conver(DAvalue); //调用D/A转换函数

for(;DAvalue>0;DAvalue-=16)

{

DA_conver(DAvalue);

delay1ms(5);

}

}

}

}

输出波形

问题:请问老师为什么输出的波形图有时会呈阶梯状?

2、正弦波

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define CS_1 P2=0xff; //片选信号关

#define CS_0 P2=0x00; //开

sbit SCLK=P1^7; //时钟输入位

sbit DIN=P1^5;

uint DAvalue=0; //数据输入位

code unsigned char Sin[128]={

64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,

109,111,113,115,117,118,120,121,123,124,125,126,126,

127,127,127,127,127,127,127,126,126,125,124,123,121,

120,118,117,115,113,111,109,106,104,102,99,96,94,91,

88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,

36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,

1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,

25,28,31,33,36,39,42,45,48,51,54,57,60};//正弦波数据

/****************************************

主函数

*****************************************/

void main()

{

// DAvalue=512;

uint i;

while(1)

{

i++;

if(i==128)i=0; //取128个点

DAvalue=Sin[i]; //传递正弦值

DA_conver(DAvalue); //调用D/A函数

delay1ms(5);

}

}

输出波形

问题:请问老师我采用查表的方式实现,为什么下降的波形有时还是会不正常?

1、显示学号:

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define CS_1 P2=0xff; //片选信号关

#define CS_0 P2=0x00; //开

sbit SCLK=P1^7; //时钟输入位

sbit DIN=P1^5;

uint DAvalue=0; //数据输入位

void DA_conver(uint DAdata)

{ uchar i;

DAdata<<=6; //移除高6位

CS_1;//片选无效

SCLK=0;

DIN=0;

CS_0; //片选有效

for(i=0;i<12;i++) //移入12位数据

{ DIN=(bit)(DAdata&0x8000); //取最高位

SCLK=1;

DAdata<<=1; //准备下一位

SCLK=0; //准备下一个上升沿

}

CS_1; //将10位有效数据压入寄存器中进行D/A转换SCLK=0;

}

void main()

{

DAvalue=778;

while(1)

{ DA_conver(DAvalue); //调用D/A转换函数

delay1ms(5); //延时 }

}

相关主题
相关文档
最新文档