串行ADDA.docx
- 文档编号:20197965
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:22
- 大小:108.17KB
串行ADDA.docx
《串行ADDA.docx》由会员分享,可在线阅读,更多相关《串行ADDA.docx(22页珍藏版)》请在冰豆网上搜索。
串行ADDA
串行ADDA
1.模块功能:
串行ADDA模块主要包括TLC5620,TLC0838,MC1403等器件,它能进行8位的ADDA的转换,与单片机之间进行串行传输,具有8通道串行ADC,四通道串行DAC。
MC1403是基准电源,可提供准确的电压,电源电压的一半作为输出电压。
在此模块中提供给TLC5620。
本模块原理图如图1。
图1
3.主要器件:
(1)TLC5620:
(a)器件功能:
TLC5620是TI公司推出的具有高阻抗基准输入的4路串行8位电压输出型数模转换芯片,它采用单一+5V电源供电,是一种低功耗芯片。
TLC5620兼容CMOS电平,只需通过4根串行总线就可以完成8位数据的串行输入。
TLC5620使用4个电阻网络实现4路数模转换,每路DAC的核心是256个独立电阻,对应串行输入的256个可能码值0—255。
每一路的输出电压为:
(2—1)
:
外部输入的基准电压。
CODE:
为待转换的8位二进制代码。
RNG:
输出电压范围选择位。
RNG=0时,输出电压最大值为一倍基准电压
RNG=1时,输出电压最大值为两倍基准电压。
(b)器件引脚:
TLC5620的引脚图如图2所示
REF(A—D):
基准电压输入端,结+2.5V电源。
DAC(A—D):
模拟信号输出端。
VDD:
接+5V电源。
DATA:
数字信号输入,接单片控制端。
LDAC:
接低电平。
CLK:
时钟输入端,外接单片机控制端。
(c)工作原理:
图2TLC5620引脚图
TLC5620工作时序如图3所示。
当LODA和LDAC均为高时,在每一个CLK时钟的下降沿数据被所存到DATA端,当所有的数据位都被锁入DATA端后,拉低LOAD,串行数据从串行输入寄存器移入被选中的DAC通道,拉低LDAC,更新输出端电压,之后置LDAC为高,可以保持更新后的电压值。
这样,在两个8时钟周期内可以完成一次DA转换。
图3TLC5620工作时序图
(2)TLC0838
(a)器件功能:
TLC0838是美国德州仪器公司推出的8路8位逐次逼近型模/数转换器,具有串行输入输出的方式,采样频率为100KHZ,与外部通信采用SPI总线接口,可用地址逻辑多路器选通8输入通道,输入和输出与TTL、CMOS电平兼容。
(b)器件引脚:
TLC0838引脚图如图4所示。
CH0—CH7:
8个模拟信号输入。
COM:
模拟信号共模输入端。
DGTLGND:
数字信号地。
ANLGGND:
模拟信号地。
REF:
基准电压。
/SE:
数据输出方式选择。
DO:
数据输出。
SARS:
状态转换输出。
CLK:
时钟信号输入。
DI:
数据输入。
/CS:
片选。
NC:
空角。
VCC:
电源(+5V)
(c)工作原理:
图4
TLC0838采用取样—数据—比较器的结构,用逐次逼近流程转换差分模拟输入信号。
TLC0838的工作时序如图5所示。
图5TLC0838工作时序图
置CS为低,接着从处理器接受时钟,在每个时钟的上沿,脚DI的数据移入多路器地址移位寄存器。
第一位为逻辑高,表示起始位,其后的2、3、4、5、位是配置位。
配置位输完后,转换器开始工作,SARS状态输出变高表示转换过程正在进行,脚DI在转换过程中与移位寄存器间是关断的。
为使选定的通道稳定,在通道配置位输完后,要隔一个时钟周期转换的数据才在时钟的下沿从脚DO输出。
TLC0838的输出数据可从高位开始,也可从低位开始。
在/SE为高时,数据线从最高到最低位输出,并将最低为保持在数据线上,在/SE为低时,数据从低位开始重新输出一遍。
一次模数转换需13个时钟周期,如果时钟频率为250KHZ,那么一次转换时间为32.5us。
脚DI和DO可以连在一起,通过一根线连到处理器的一个双向I/O口进行控制,因为DI和DO在同一时间肯定有一个为高阻。
(3)MC1403:
(a)器件功能:
MC1403可提供准确的2.5V的基准电源,提供给TLC5620作为其模数转换的参考电压。
(b)器件引脚:
MC1403引脚图如图6。
引脚1:
输入电压。
引脚2:
输出2.5V电压。
引脚3:
接地。
引脚4—引脚8:
空脚。
图6
3.接口说明
串行ADDA的PCB图如图7所示,实物图如图8所示。
图7
图8
实物图中单片机模块上的外围接口说明如下:
CH0—CH7:
8个模拟信号输入端。
如果只有一路模拟信号,选其中任一端口即可。
GND:
接地。
CS:
TLC0838的片选信号。
DI:
数据输入。
DO:
数据输出。
实际使用时DI和DO用导线相连。
CLK(TLC0838):
TLC0838的时钟信号输入端。
DACA—DACD:
模拟信号输出端。
此四路输出的模拟信号是四路参考电压(REFA—REFD)是一一对应的,此模块中四路参考电压相同,所以四路输出的模拟信号也相同,选其中任一端口即可。
DATA:
数字信号输入,接单片控制端。
CLK(TLC5620):
TLC5620的时钟信号输入端。
LOAD:
DAC转换信号,接低电平。
NC:
空脚。
4.典型程序:
利用串行ADDA和单片机设计的数控电流源的程序。
#include
#include
#defineucharunsignedchar
//数据口定义
#definelcd1602_busP0
/******************tlc549port*********************/
sbitcs_0838=P1^3;
sbitsda_0838=P1^0;
sbitscl_0838=P1^1;
/*******************tlc5620port***********************/
sbitload_5620=P1^5;
sbitclk_5620=P1^6;
sbitdata_5620=P1^7;
/***************lcd1602port******************************/
//引脚定义
sbitrs_1602=P2^5;
sbitrw_1602=P2^6;
sbite_1602=P2^7;
ucharset[3];//setting
ucharmea[4];//measure
ucharj;
bitb;
uchardata5620;
unsignedcharbdataadc_0838;//bdata//bitdataarea
sbitadc_0838low=adc_0838^0;//最低位
ucharbdatau;
sbitus=u^7;
ucharcodetable[10]=
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/**************adc_549convert*******************/
unsignedcharadc_0838convert()
{
uchari;
u=0x80;
scl_0838=0;
sda_0838=1;
cs_0838=0;
_nop_();
_nop_();
scl_0838=1;
_nop_();
_nop_();
for(i=0;i<4;i++)
{
scl_0838=0;
sda_0838=us;
_nop_();
_nop_();
scl_0838=1;
u=u<<1;
}
sda_0838=1;
_nop_();
_nop_();
scl_0838=0;
_nop_();
_nop_();
adc_0838=0;
for(i=0;i<8;i++)
{
adc_0838=adc_0838<<1;
scl_0838=1;
_nop_();
_nop_();
scl_0838=0;
_nop_();
_nop_();
adc_0838low=sda_0838;
}
return(adc_0838);
}
voiddac_5620(unsignedchardataa,unsignedchardatab,
unsignedchardatac,unsignedchardatad)
{
unsignedchari;
/****************dataa************/
load_5620=1;
clk_5620=1;data_5620=0;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(dataa&0x80)data_5620=1;
elsedata_5620=0;
clk_5620=0;
dataa=dataa<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/************datab*************/
load_5620=1;
clk_5620=1;data_5620=0;clk_5620=0;
clk_5620=1;data_5620=1;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datab&0x80)data_5620=1;
elsedata_5620=0;
clk_5620=0;
datab=datab<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/************datac*******************/
load_5620=1;
clk_5620=1;data_5620=1;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datac&0x80)data_5620=1;
elsedata_5620=0;
clk_5620=0;
datac=datac<<1;
}
load_5620=0;
_nop_();
load_5620=1;
/***************datad***************/
load_5620=1;
clk_5620=1;data_5620=1;clk_5620=0;
clk_5620=1;data_5620=1;clk_5620=0;
clk_5620=1;data_5620=0;clk_5620=0;
for(i=0;i<8;i++)
{
clk_5620=1;
if(datad&0x80)data_5620=1;
elsedata_5620=0;
clk_5620=0;
datad=datad<<1;
}
load_5620=0;
_nop_();
load_5620=1;
}
/*********延时子程序**********/
voiddelay_1602(uchardy)
{
while(--dy);
}
/***********忙判断标志,返回一个位BF********************/
bitlcd1602_busy(void)
{
unsignedcharbusy_flag;
rs_1602=0;
rw_1602=1;
_nop_();
e_1602=1;
_nop_();
lcd1602_bus=0xff;
busy_flag=lcd1602_bus;//e在高电平时读
e_1602=0;
return(bit)(busy_flag&0x80);//BF=1;BUSY返回一个位
}
/********写命令,有两个参数,一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1;
判断:
为0
***************/
voidlcd1602_wrcmd(unsignedcharlcdcmd)
{
while(lcd1602_busy());//等待空闲
lcd1602_bus=lcdcmd;
rs_1602=0;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;//产生一个下沿
}
/***************向液晶写数据******************/
voidlcd1602_wrdata(unsignedcharlcddata)
{
while(lcd1602_busy());//等待空闲
lcd1602_bus=lcddata;//在下沿的时候写数据
rs_1602=1;
rw_1602=0;
_nop_();
e_1602=1;
_nop_();
_nop_();
e_1602=0;
//lcd_bus=0xff;
}
/************液晶的清屏************/
voidlcd1602_clear(void)
{
lcd1602_wrcmd(0x01);//液晶清屏控制字并延时>40us
delay_1602(100);
}
/***********1602液晶的初始化***************/
voidlcd1602_init(void)
{
lcd1602_wrcmd(0x38);//功能设置-----8位数据接口,两行显示,5*7点阵字符显示
delay_1602(100);
lcd1602_wrcmd(0x0c);//显示开关控制----显示开关开,光标开关关,闪烁开关关
delay_1602(100);
lcd1602_wrcmd(0x06);//输入方式设置,AC自增1,S=0;
delay_1602(100);
lcd1602_wrcmd(0x01);//清屏
delay_1602(100);
}
/************键盘扫描*************/
ucharkeyscan(void)
{
ucharscancode,tmpcode;
P3=0xf0;
if((P3&0xf0)!
=0xf0)
{
delay_1602(125);
if((P3&0xf0)!
=0xf0)
{
scancode=0xfe;
while((scancode&0x10)!
=0)
{
P3=scancode;
if((P3&0xf0)!
=0xf0)
{
tmpcode=(P3&0xf0)|0x0f;
return((~scancode)+(~tmpcode));
}
elsescancode=(scancode<<1)|0x01;
}
}
}
return(0);
}
voidfen(unsignedinthex,uchara[4])
{
a[0]=table[hex/1000];
hex=hex%1000;
a[1]=table[hex/100];
hex=hex%100;
a[2]=table[hex/10];
hex=hex%10;
a[3]=table[hex];
}
voidjia(n)
{
uchari;
set[j]=table[n];
lcd1602_wrcmd(0x8a-j);
for(i=0;i<=j;i++)
lcd1602_wrdata(set[i]);
j++;
data5620=data5620*10+n;
}
main()
{
ucharkey,i;
unsignedcharstr0[]="setting:
*10mA";
unsignedcharstr1[]="measure:
mA";
uchardata549=0;
unsignedintcov549=0;
b=0;j=0;
data5620=0;
delay_1602
(2);
lcd1602_bus=0xff;
lcd1602_init();
lcd1602_wrcmd(0x80);
for(i=0;i<16;i++)
lcd1602_wrdata(str0[i]);
while
(1)
{
lcd1602_wrcmd(0x8a);
key=0;
while(key==0)
key=keyscan();
while(P3!
=0xf0)
P3=0xf0;
if(key==0x18)
{
dac_5620(data5620,data5620,data5620,data5620);
b=1;j=0;
data549=adc_0838convert();
cov549=data549*19.6;
fen(cov549,mea);
lcd1602_wrcmd(0xc0);
for(i=0;i<14;i++)
lcd1602_wrdata(str1[i]);
lcd1602_wrcmd(0xc8);
for(i=0;i<4;i++)
lcd1602_wrdata(mea[i]);
}
elseif(key==0x12)
{
if(j>0)
{
j--;
data5620=(data5620-(set[j]-0x30))/10;
lcd1602_wrcmd(0x8a-j);
lcd1602_wrdata(0);
for(i=0;i lcd1602_wrdata(set[i]); } } else { if(j<3) { if(b==1) { set[0]=0;set[1]=0;set[2]=0; data5620=0; j=0; lcd1602_wrcmd(0xc0); for(i=0;i<14;i++) lcd1602_wrdata(0); lcd1602_wrcmd(0x87); for(i=0;i<3;i++) lcd1602_wrdata(0); b=0; } switch(key) { case0x14: jia(0);break; case0x28: jia (1);break; case0x24: jia (2);break; case0x22: jia(3);break; case0x48: jia(4);break; case0x44: jia(5);break; case0x42: jia(6);break; case0x88: jia(7);break; case0x84: jia(8);break; case0x82: jia(9);break; default: break; } } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 串行 ADDA
![提示](https://static.bdocx.com/images/bang_tan.gif)