基于AD5064芯片的DA转换程序设计报告.docx

上传人:b****7 文档编号:9045355 上传时间:2023-02-02 格式:DOCX 页数:19 大小:810.28KB
下载 相关 举报
基于AD5064芯片的DA转换程序设计报告.docx_第1页
第1页 / 共19页
基于AD5064芯片的DA转换程序设计报告.docx_第2页
第2页 / 共19页
基于AD5064芯片的DA转换程序设计报告.docx_第3页
第3页 / 共19页
基于AD5064芯片的DA转换程序设计报告.docx_第4页
第4页 / 共19页
基于AD5064芯片的DA转换程序设计报告.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于AD5064芯片的DA转换程序设计报告.docx

《基于AD5064芯片的DA转换程序设计报告.docx》由会员分享,可在线阅读,更多相关《基于AD5064芯片的DA转换程序设计报告.docx(19页珍藏版)》请在冰豆网上搜索。

基于AD5064芯片的DA转换程序设计报告.docx

基于AD5064芯片的DA转换程序设计报告

基于AD5064芯片的DA转换程序设计报告

一、设计目的:

1)掌握D/A转换芯片AD5064的性能和编程方法。

2)以c8051f340单片机控制器,结合LCD1602液晶显示模块,可以实现在室温条件下将给定数字电压信号,经过AD5064转化为相应的模拟量,并用示波器或万用表可显示输出的电压值。

二、设计环境:

1)软件编程部分是在SiliconLaboratoriesIDE软件下完成的。

2)DA转换的数据是在目前室温(3

-14

)下进行的。

3)本次DA转化设计的参考电压值为5V。

三、设计内容:

本次设计包含了:

硬件电路的设计,DA转换程序的设计,硬件电路和程序的调试三大部分。

3.1、硬件电路的设计:

3.1.1DA转换部分硬件电路的设计

AD5064原理图设计如图3-1所示,

图3-1AD5064原理图

3.1.2硬件电路的连接

将c8051f340单片机与lcd1602,及AD5064相互连接。

各模块连线示意图如图3-2所示,输入控制信号有串行数据时钟信号(SCLK)、串行数据输入信号(DIN)、帧同步信号(SYNC)、DAC装载寄存器(LDAC),三个控制信号,实物连接图如图3-3所示:

图3-2各模块连线示意图

图3-3各模块连接实物图

3.2、DA程序设计:

通过阅读AD5064芯片使用手册,结合c8051f340对DA转化的初步程序进行了编写:

测试程序是以DA芯片AD5064为主体,结合c8051f340单片机实现对AD5064的控制,以按键选择,先在LCD1602显示要输出的电压值,再完成输出电压的值DA转化,最后在输出端输出。

3.1.1程序设计总体框图:

图3-4程序设计总体框图

3.1.2程序设计部分:

(1)、AD5064是一个是低功耗、四通道16位位缓冲电压输出,能够以最高50MHz的时钟速率工作,并与标准SPI、QSPI™、MICROWIRE™和DSP接口标准兼容。

片内提供集成基准电压缓冲器和输出放大器。

输入控制信号有串行数据时钟信号(SCLK)、帧同步信号(SYNC)、DAC装载寄存器(LDAC),三个控制信号,可以分别控制4通道输出不同的电压值,片内有两个寄存器,输入寄存器,DAC寄存器,一旦输入寄存器中有数据,可以分别用软件或者硬件来控制DAC寄存器值得更新。

结合AD5064使用手册,首先对一些指令进行了定义,方便之后程序的调用。

#define_0V0x0000//参考电压为5V时,输出为0V时数据位应存入的值

#define_1V0x3333//参考电压为5V时,输出为1V时数据位应存入的值

#define_2V0x6666//参考电压为5V时,输出为2V时数据位应存入的值

#define_3V0x9999//参考电压为5V时,输出为3V时数据位应存入的值

#define_4V0xcccc//参考电压为5V时,输出为4V时数据位应存入的值

#defineC_Writ_IR0X00//给输入寄存器写值命令

#defineC_Rest0X07//复位命令

#defineA_A0X00//DACA通道选择

#defineA_B0X01//DACB通道选择

#defineA_C0X02//DACC通道选择

#defineA_D0X03//DACD通道选择

#defineA_ALL0X0F//DAC所有通道选择

sbitSCLK=P1^0;//串行数据时钟信号

sbitDIN=P1^1;//串行数据输入

sbitSYNC=P1^5;//帧同步信号

sbitLDAC=P1^6;//DAC装载寄存器

(2)、结合AD5064使用手册中的移位寄存器分布图3-5和时序工作图3-6,对AD5064DA转化的操作命令进行了编写,因为数据是大端存储,先送命令位,故以写命令为例,由时序图可知,在时钟下降沿,数据在被帧同步信号锁存,由于本次DA主控器件为单片机,故选用8位为一次操作,先把时钟信号SCLK置1,再将8位数据循环送入数据串行入端口(DIN),完成写命令操作。

图3-5移位寄存器分布图

图3-6时序图工作

写命令子程序:

输入:

为相应的命令伪指令

输出:

此程序完成功能:

完成操作控制DA执行的相应命令。

在8次循环中,先将时钟信号置高电平,再将数据位上的第8位数据送入数据串行入端口(DIN)延时一段时间,将时钟电平置0,锁存第8位数据;再次循环,将数据左移一位,取出第8位,送入数据串行入端口(DIN),再延时一段时间后,将时钟电平置0,再次锁存第7位数据,直到8位数据全部送完,从而完成命令控制功能。

注意:

如图3-5所示,,本次命令控制程序只有低4位有用。

voidWrite_Cmd(uchardat)//写命令操作

{

uchari;//用以循环的变量

for(i=0;i<8;i++)//写8位,高4位无用

{

SCLK=1;//时钟信号置高电平

DIN=((dat<

1:

0;//数据从高位到低位依次循环送入数据串行入端口

Delay(30);//延时

SCLK=0;//将SCLK置0,时钟下降沿触发,将输入数据锁存。

Delay(30);//下降沿保持,保证时钟低电平与高电平对应

}

}

写地址子程序:

输入:

为相应的输出通道伪指令

输出:

此程序完成功能:

完成操作控制DA通道选择命令。

在8次循环中,先将时钟信号置高电平,再将数据位上的第8位数据送入数据串行入端口(DIN)延时一段时间,将时钟电平置0,锁存第8位数据;再次循环,将数据左移一位,取出第8位,送入数据串行入端口(DIN),再延时一段时间后,将时钟电平置0,再次锁存第7位数据,直到8位数据全部送完,从而完成命令控制功能。

注意:

如图3-5所示,,本次命令控制程序只有4位有用,故只循环4次。

voidWrite_Addr(uchardat)//写地址

{

uchari;//用以循环的变量

dat=dat<<4;//地址只有四位右移使之处在高4位

for(i=0;i<4;i++)//写8位,高4位无用循环四次

{

SCLK=1;//时钟信号置高电平

DIN=((dat<

1:

0;//数据从高位到低位依次循环送入数据串行入端口

Delay(30);

SCLK=0;//将SCLK置0,时钟下降沿触发,将输入数据锁存。

Delay(30);//下降沿保持,保证时钟低电平与高电平对应

}

}

写数据子程序:

输入:

为相应的电压数据指令

输出:

此程序完成功能:

完成操作控制DA通道选择命令。

在8次循环中,先将时钟信号置高电平,再将数据位上的第8位数据送入数据串行入端口(DIN)延时一段时间,将时钟电平置0,锁存第8位数据;再次循环,将数据左移一位,取出第8位,送入数据串行入端口(DIN),再延时一段时间后,将时钟电平置0,再次锁存第7位数据,直到8位数据全部送完,从而完成命令控制功能。

注意:

如图3-5所示,因数据位16位,故数据位分高低两个8位完成传输,调用两次此程序。

voidWrite_Date(uchardat)//写数据

{

uchari;//用以循环的变量

for(i=0;i<8;i++)//单片机中,写8位数据,分两次

{

SCLK=1;//时钟信号置高电平

DIN=((dat<

1:

0;//数据从高位到低位依次循环送入数据串行入端口

Delay(30);

SCLK=0;//将SCLK置0,时钟下降沿触发,将输入数据锁存

Delay(30);//下降沿保持,保证时钟低电平与高电平对应

}

}

此外,还有写址地操作和写数据操作子程序与写命令子程序原理一致,(具体程序设计见附录),这里重点再解释一下AD5064的总体程序。

AD5064总程序的设计:

输入:

为相应的伪指令代码,分别是命令、输出对应的通道地址、数据

输出:

此程序完成功能:

完成操作控制DA执行的相应命令。

本程序是直接调用之前的子程序,从而实现了对AD5064的操作,因为在本次设计中直接用了16位数据,但鉴于单片机的原因,先将数据分为两个8位,之后按照图3-6所示,先将帧同步信号置0,再直接调用Write_Cmd,Write_Addr,Write_Date的命令,完成对移位寄存器的操作,之后再将帧同步信号置1,再通过LDAC置0来实现LDAC寄存器的更新,本程序中先将所给数据分为高低两个8位,通过两次调用写数据程序完成数据的传输。

voidADC5064_write(ucharcmd,ucharadd,intdat)//AD5064写程序

{

uchardath,datl;//定义两位用于存储数据高低位

dath=(dat&0xff00)>>8;//取出高8位

datl=dat&0x00ff;//取出低8位

SYNC=0;//将帧同步信号置0

Delay(30);

Write_Cmd(cmd);//调用写命令子程序

Write_Addr(add);//调用写地址子程序

Write_Date(dath);//写数据高8位

Write_Date(datl);//写数据低8位

Write_Addr(0x00);//无效数据位或ldac

SYNC=1;//将帧同步信号置0

Delay(30);

LDAC=0;//通过硬件对DAC寄存器进行刷新,使相应端口输出电压值

Delay(30);

LDAC=1;

Delay(30);

}

(3)、调用方法举例:

当程序调用时可以直接调用ADC5064_write总体写程序,就可以实现对ADC5064的控制。

例如:

①ADC5064_write(C_Rest,A_ALL,_0V);

本程序可以使ADC5064的所有输出端口复位为0V。

C_Rest为控制命令,A_ALL为选择所有输出通道地址,_0V为使输出为0V时的数据。

②ADC5064_write(C_Writ_IR,A_A,_3V);

本程序可以使ADC5064的A通道输出端口输出3V。

C_Writ_IR为控制命令,是将从数据串行入端口(DIN)送入的数据送到输入寄存器中,A_A为选择A通道输出,_3V为使输出为3V。

四、硬件电路的测试和程序调试:

4.1、硬件电路的调试

结合PCB板子,对DA芯片AD5064的硬件电路进行了焊接、测试和调试,仔细检查各个管脚走线,确保了各个管脚无错误相连以及板子上各个芯片正常供电。

4.2、对程序进行调试:

在对测试程序调试之后,可以满足通过c8051f340开发板上的按键来控制所要输出的电压值。

调试结果选取如图4-1所示:

图4-1

4.3信号时序图测试:

在调试过程中主要对时钟信号和帧同步信号、LDAC进行了测试,因为数据是在时钟信号的下降沿被送入输入寄存器的,因为数据各不相同,所以只需要观察时钟信号即可知完成一次数据所用的时间。

时钟信号如图4-2所示:

图4-2时钟信号

两个下降沿相隔110us。

故完成一次对AD5064的数据操作,需要3200us。

从帧同步信号的下降沿开始,时钟信号必须要延迟一段时间才可以进行数据的数据,故帧同步信号的下降沿到数据的第一位开始锁存之间加了一个延时,时间为112us.用示波器观察如图4-3所示。

图4-3帧同步信号之后的延时

LDAC信号为DAC寄存器更新信号控制信号,该信号置0时,输出通道才有电压输出,该信号置0时间必须延时一段时间,才可以完成输出端口电压的更新。

延时时间软件设计时间为50us。

示波器观察如图4-4所示:

图4-4

五、调试结果分析

通过对AD5064芯片的调试,分别对输入从0V-5V进行了测试,测试结果如表5-1所示,

并作测试图如图5-2所示。

输入

电压(V)

0.00

0.50

1.50

1.00

1.50

2.00

2.50

3.00

3.50

4.00

4.50

5.00

显示

电压(V)

0.10

0.50

1.51

1.10

1.51

2.08

2.51

3.02

3.52

4.02

4.47

4.47

表5-1

图5-2

注:

显示电压是以直流稳压电源作为电源电压Vref=5.02V。

由表5-1和图5-2可知:

本测试程序可以实现0V-4.5V之间的DA转化,结果十分接近。

目前存在的问题和不足:

经过多次反复测试,发现:

当输入电压为5V时输出的电压只有4.47V左右,出现了比较大的偏差,原因正在检查之中。

附录:

DA转换测试主程序

//-----------------------------------------------------------------------------

//AD5064_TEST.c

//-----------------------------------------------------------------------------

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

*Filename:

DA_MAIN.c

*Compiler:

SiliconLaboratoriesIDE

*Projectname:

DA_TEST

*Author:

WendellNeil(倪文龙)

*Date:

2012.10.7

*Description:

本程序是以AD公司的DA芯片AD5064为主体,结合c8051f340单片机实

*对AD5064的控制,以按键选择,先在LCD1602显示要输出的电压值,再

*完成输出电压的值DA转化,最后在输出端口输出。

*comments:

参考电压本程序以为5V基准,即Vref外接5V电压

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

#include"c8051f340.h"

#include"LCD1602.h"

#include"source.h"

#define_0V0x0000//参考电压为5V时,输出为0V时数据位应存入的值

#define_1V0x3333//参考电压为5V时,输出为1V时数据位应存入的值

#define_2V0x6666//参考电压为5V时,输出为2V时数据位应存入的值

#define_3V0x9999//参考电压为5V时,输出为3V时数据位应存入的值

#define_4V0xcccc//参考电压为5V时,输出为4V时数据位应存入的值

#defineC_Writ_IR0X00//给输入寄存器写值命令

#defineC_Rest0X07//复位命令

#defineA_A0X00//DACA通道选择

#defineA_B0X01//DACB通道选择

#defineA_C0X02//DACC通道选择

#defineA_D0X03//DACD通道选择

#defineA_ALL0X0F//DAC所有通道选择

sbitSCLK=P1^0;//串行数据时钟信号

sbitDIN=P1^1;//串行数据输入

sbitSYNC=P1^5;//帧同步信号

sbitLDAC=P1^6;//DAC装载寄存器

voidWrite_Cmd(uchardat)//写命令

{

uchari;

for(i=0;i<8;i++)//写8位,高4位无用

{

SCLK=1;//Delay1us

(1);

DIN=((dat<

1:

0;//数据从高位到低位传送

Delay(30);//12M晶振,延时50us

SCLK=0;

Delay(30);

}

}

voidWrite_Addr(uchardat)//写地址

{

uchari;

dat=dat<<4;

for(i=0;i<4;i++)

{

SCLK=1;

DIN=((dat<

1:

0;

Delay(30);

SCLK=0;

Delay(30);

}

}

voidWrite_Date(uchardat)//写数据

{

uchari;

for(i=0;i<8;i++)

{

SCLK=1;

DIN=((dat<

1:

0;

Delay(30);

SCLK=0;

Delay(30);

}

}

voidADC5064_write(ucharcmd,ucharadd,intdat)//AD5064写程序

{

uchardath,datl;

dath=(dat&0xff00)>>8;

datl=dat&0x00ff;

SYNC=0;

Delay(30);

Write_Cmd(cmd);

Write_Addr(add);

Write_Date(dath);//写数据高8位

Write_Date(datl);//写数据低8位

Write_Addr(0x00);//无效数据位或ldac

SYNC=1;

Delay(30);

LDAC=0;

Delay(30);

LDAC=1;

Delay(30);

}

voidmain()//测试程序,用按键控制输出值。

{

inti;

Init_Device();

LCD_Initial();

Delay_ms(5);

LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);

Delay1ms(1000);

GotoXY(0,0);

Print("Inputvalueis");

GotoXY(0,1);

Print("V");

Delay1ms(1000);

Led1=0;

Led2=0;

ADC5064_write(C_Rest,A_ALL,_0V);//AD5064上电复位,每个Vout输出为零

Delay1ms(1000);

for(i=0;i<3;i++)

{

Led1=~Led1;

Led2=~Led2;

Delay1ms(1000);

}

Led1=~Led1;

while

(1)

{ADC5064_write(C_Writ_IR,A_C,_3V);//如果Key1按下,C通道输出3V

ADC5064_write(C_Writ_IR,A_B,_0V);//如果Key1按下,B通道输出0V

if(Key1==0)

{

GotoXY(5,1);

Print("1.00");

Delay1ms(1000);

ADC5064_write(C_Writ_IR,A_A,_1V);//如果Key1按下,A通道输出1V

//Led1=~Led1;

}

if(Key2==0)

{

GotoXY(5,1);

Print("2.00");

Delay1ms(1000);

ADC5064_write(C_Writ_IR,A_A,_2V);//如果Key2按下,A通道输出2V

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1