1、实验一 串行 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)最大输出电压可达基准电压的二倍
2、;(5)输出电压具有和基准电压相同极性;(6)建立时间 12.5s;(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 位数据。DI
3、N 输入的 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、 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 所示。图 4-38 TLC5615 驱
5、动程序流程图软件 SPI输出一位数据产生正脉冲传输完成?返回Y N非级连 D/A 输出输出高 2 位数据输出低 8 位数据输出 2 位 0返回级连 D/A 输出输出高 2 位数据输出低 8 位数据输出 2 位 0返回输出 4 位 0图 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=P17; /时钟输入位sbit DIN=P15
6、;uint DAvalue=0; /数据输入位/*DA 转换函数*/void DA_conver(uint DAdata)uchar i;DAdata0;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=P17; /时
7、钟输入位sbit DIN=P15;uint DAvalue=0; /数据输入位code unsigned char Sin128=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,6
8、0,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=Sini; /传递正弦值DA_conver(DAvalue); /调用 D/A 函数delay1
9、ms(5);输出波形问题:请问老师我采用查表的方式实现,为什么下降的波形有时还是会不正常?1、显示学号:#include#include#define uint unsigned int#define uchar unsigned char#define CS_1 P2=0xff; /片选信号 关#define CS_0 P2=0x00; /开sbit SCLK=P17; /时钟输入位sbit DIN=P15;uint DAvalue=0; /数据输入位void DA_conver(uint DAdata) uchar i;DAdata=6; /移除高 6 位CS_1; /片选无效SCLK=0;DIN=0;CS_0; /片选有效for(i=0;i12;i+) /移入 12 位数据 DIN=(bit)(DAdata /取最高位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); /延时