基于串行AD1544的设计报告.docx
《基于串行AD1544的设计报告.docx》由会员分享,可在线阅读,更多相关《基于串行AD1544的设计报告.docx(12页珍藏版)》请在冰豆网上搜索。
基于串行AD1544的设计报告
基于串行ADTLV1544的设计
摘要
本文论述了串行ADTLV1544的工作时序、硬件设计与应用,并通过AVR单片机Atmega128显示TLV1544的采集结果,实现测量正弦交流信号的有效值。
本文着重讨论TLV1544的程序控制部分及硬件电路。
关键词
TLV1544、AVR单片机、正弦交流信号有效值
TheDesignOfSerialAD
——BasedontheTLV1544
Abstract
ThispaperdiscussestheTLV1544basedonserialADtheprogramdesignandapplication,andthroughtheAVRAtmega128single-chipmicrocomputerdisplayTLV1544collectionresults,realizetheeffectivevalueofmeasurementsinusoidalalternatingsignal.ThispaperfocusesonthediscussionoftheTLV1544programcontrolpartandthehardwarecircuit.
Keywords
TLV1544,AVRmicrocontroller,sinusoidalRMSacsignal
目录
第一章初步要求…………………………………………………..(3)
1.1设计任务……………………………………………………..............(3)
1.2总体方案设计………………………………………………..............(3)
第二章硬件电路的设计………………………………………....(3)
2.1硬件电路的设计……………………………………..........................(3)
第三章TLV1544程序设计……………..........................................(5)
3.1TLV1544引脚说明………………………………………………..…(5)
3.2TLV1544的工作模式及时序………………………………………..(6)
第四章电路原理图………………………………………………..(8)
第五章源程序……………………………………………………..(9)
第一章设计概述
1.1设计任务
设计要求如下:
1输入交流正弦信号
范围内;
2用TLV1544采集正弦信号并转换
3在atmega128最小系统上显示其有效值。
1.2总体方案设计
第二章硬件电路设计
2.1硬件电路设计
由于输入信号是未知的正弦量,而TLV1544的模拟输入范围是0~5.5V,所以要有缩放电路将xV电压缩放到0~5.5V范围之内,本设计中缩放电路采用NE5532运放设计,因为是线性电路,根据虚短U2=U3,
.通过调节R2的大小实现输入信号的缩放。
基本电路如下
由于输入信号有负电压,缩放后为-2.75V~+2.75V,而TLV1544只能处理0V~VCC的正电压,所以缩放后还要抬高其电位的电路,使模拟电压范围为0V~5.5V,通过调节R4的大小以抬高其电位,电路如下
第三章TLV1544设计
3.1TLV1544引脚说明
TLV1544是一款10位4通道的串行AD转换器,单电源供电,模拟电压输入范围是0V到VCC,即0V~5.5V,其引脚分布如上
DATAOUT数据输出端,在CS为低电平时有效,当时钟不倒置时,INVCLK接VCC时,I/OCLK每一个上升沿读数据,当CS为高电平时,DATAOUT呈高阻态;DATAIN串行数据输入端,即通道选择,也是CS为低电平时有效;I/OCLK时钟输入端,CS为低电平时有效;EOC转换结束标志,本设计中不使用;VCC接+5V~5.5V电源;A0~A3是外部四个模拟通道输入;CSTART采样/转换控制,从高到低电平时采样,从低道高电平时保持采样并开始转换;GND接地端;INVCLK倒置时钟,低电平有效,当不使用时接VCC;FS是DSP同步输入,当与单片机接口时,FS接VCC;Vref-和Vref+基准电压输入,这里Vref-接地,Vref+接VCC;CS片选端,进行计数器复位和控制,从高到低电平时,使能I/OCLK、DATAOUT、DATAIN。
3.2TLV1544工作时序
TLV1544工作时序如下图。
本设计是INVCLK接VCC,没有使用倒时钟的时序。
其工作过程分为两个周期:
访问周期和采样周期。
工作状态由CS使能或禁止,工作时,CS必须置低电平,CS置高电平时,I/OCLK、DATAIN、被禁止,DATAOUT呈高阻态。
当CS变低时,CLK、DATAIN、使能,DATAOUT有效。
随后,单片机向DATAIN提供4位通道地址,控制4路模拟信号输入与3个内部测试电压,选一路送到采样保持电路。
同时,根据I/OCLK的时序,单片机从DATAOUT取出前一次的10位转换结果。
TLV1544的I/OCLK接受10个时钟序列,前四个时钟用于装载通道地址,后六个用于采样,上升沿有效。
然后,CS置高电平,禁止DATAIN、CLK、DATAOUT高阻态,再CS置低,输入下10个有效的时钟。
由于没有用到转换结束标志EOC,本设计采用程序延时方式直接读取数据,本设计A0通道输入,FS、INVCLK、CSTART接VCC;CS、DATAOUT、DATAIN、IOCLK接单片机PB4~PB7口;
延时一段时间后,CS变低,取出10位数据,高位在前面,先取高两位,INVCLK接VCC时,I/OCLK的上升沿读数据,然后取出低8位数据。
第四章电路原理图
第五章源程序
#include
#include
#include
#defineN1141
#defineucharunsignedchar
#defineuintunsignedint
#defineulongunsignedlong
#defineCS_LPORTB&=~BIT(6)
#defineCS_HPORTB|=BIT(6)
#defineCLK_LPORTB&=~BIT(3)
#defineCLK_HPORTB|=BIT(3)
#definePORTPORTC
#defineDDRDDRC
uchartable[]="0123456789.V";
uintdisp1[5]={0,};
uintdisp3[5]={0,};
uintdisp2[5]={0,};
uintdisp[512]={0,};
ulongad=0;
floatmin=0,max=0;
uintread1544(ucharport)//从TLC1543读取采样值,形参port是采样的通道号
{
uintad;
uinti;
ucharal=0,ah=0;
DDRB|=BIT(4)+BIT(3)+BIT(6);
DDRB&=~BIT(5);
CS_H;
CLK_L;
CS_L;
//port*=2;
for(i=0;i<4;i++)//把通道号打入1544
{
if((port&0x08)==0x08)
{
CLK_L;//xxxx1000&xxxx0001从高位输入,xxxx0001<<
PORTB|=BIT(4);//该位为1输出高电平给TLV1544
CLK_H;//CLK上升沿输出有效,INVCLK=1
}
else
{
CLK_L;
PORTB&=~BIT(4);//该位为0输出低电平给TLV1544
CLK_H;//CLK上升沿输出有效
}
port<<=1;
}
for(i=0;i<6;i++)//填充6个CLOCK,采样
{
CLK_L;
CLK_H;
}
for(i=0;i<10;i++)//十个CLK下降沿进行ad转换
{
CLK_H;
CLK_L;
}
CS_H;
delay
(1);//等待转换结束
CS_L;
for(i=0;i<2;i++)//取D9,D8位数据,在CS_L低有效
{
CLK_H;
ah<<=1;
if(PINB&BIT(5))ah+=0x01;//上升沿读数据,
CLK_L;
}
for(i=0;i<8;i++)//取D7~D0数据
{
CLK_H;
al<<=1;
if(PINB&BIT(5))al+=0x01;
CLK_L;
}
CS_H;
ad=(uint)ah;
ad<<=8;
ad+=(uint)al;//得到AD值
returnad;//返回10位ad采样数据
}
voiddelay(inti)
{intj;
for(;i>0;i--)
for(j=0;j}
show(uint*m)//显示m所指的数组
{
write_dat(table[m[0]]);
delay(5);
write_dat(table[10]);//显示"."
delay(5);
write_dat(table[m[1]]);
delay(5);
write_dat(table[m[2]]);
delay(5);
write_dat(table[m[3]]);
delay(5);
write_dat(table[m[4]]);
delay(5);
write_dat(table[11]);//显示"V"
delay(5);
}
voidchu(uint*n,float*m)//将数离散化储存在数组中
{
n[0]=((uint)((*m)*10000)/10000);
n[1]=((uint)((*m)*10000)/1000)%10;
n[2]=((uint)((*m)*10000)/100)%10;
n[3]=((uint)((*m)*10000)/10)%10;
n[4]=((uint)((*m)*10000))%10;
}
voidwrite_com(ucharcom)
{
PORT&=~BIT(0);//表示传入的是命令
PORT&=~BIT
(1);//表示写操作
PORTD=com;//传入命令数据
PORT|=BIT
(2);//打开使能端
delay
(1);//延时一毫秒
PORT&=~BIT
(2);//关闭使能端
}
voidwrite_dat(uchardat)
{
PORT|=BIT(0);//表示传入的是数据
PORT&=~BIT
(1);//表示写操作
PORTD=dat;//传入数字数据
PORT|=BIT
(2);//打开使能端
delay
(1);//延时一毫秒
PORT&=~BIT
(2);//关闭使能端
}
void_1602_init()
{
DDRD=0XFF;//C端口为输出,传数据
DDR|=BIT(0);//设置为输出,分别控制数据/命令、读/写、使能开/关
DDR|=BIT
(1);
DDR|=BIT
(2);
PORT&=~BIT
(2);//使能端关闭
write_com(0X38);//显示模式
delay(5);
write_com(0X01);//清除屏幕
delay(5);
write_com(0X0C);//0x0c光标不显示,不闪烁
delay(5);
write_com(0X06);//写一个字符,地址加一,光标加一,整屏不左移00001100
delay(5);
write_com(0X80+0X00);//写入数据的起始地址,即在液晶中显示位置,即从屏幕最右开始
delay(5);
}
voidmain()
{
uintj=0;
floatresults=0;
floata=0;
_1602_init();//初始化1602
while
(1)
{
j=0;results=0;ad=0;
for(j=0;j<512;j++)
{
disp[j]=read1544(0);//将AD转换的结果存入disp[j]
ad+=(disp[j]*disp[j]);
}
a=(sqrt((ad/512.0)*0.00488));//求有效值
chu(disp1,&a);//离散化,存disp1中
write_com(0X80+0X00);//1602中显示位置
delay(5);
show(disp1);//显示
}
}
.