基于串行AD1544的设计报告文档格式.docx
《基于串行AD1544的设计报告文档格式.docx》由会员分享,可在线阅读,更多相关《基于串行AD1544的设计报告文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
第四章电路原理图………………………………………………..(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<
iom128v.h>
macros.h>
math.h>
#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)
{
//xxxx1000&
xxxx0001从高位输入,xxxx0001<
<
PORTB|=BIT(4);
//该位为1输出高电平给TLV1544
CLK_H;
//CLK上升沿输出有效,INVCLK=1
}
else
PORTB&
=~BIT(4);
//该位为0输出低电平给TLV1544
//CLK上升沿输出有效
}
port<
=1;
for(i=0;
i<
6;
i++)//填充6个CLOCK,采样
for(i=0;
10;
i++)//十个CLK下降沿进行ad转换
delay
(1);
//等待转换结束
2;
i++)//取D9,D8位数据,在CS_L低有效
ah<
if(PINB&
BIT(5))ah+=0x01;
//上升沿读数据,
8;
i++)//取D7~D0数据
al<
BIT(5))al+=0x01;
ad=(uint)ah;
ad<
=8;
ad+=(uint)al;
//得到AD值
returnad;
//返回10位ad采样数据
}
voiddelay(inti)
{intj;
for(;
i>
0;
i--)
for(j=0;
j<
N;
j++);
show(uint*m)//显示m所指的数组
{
write_dat(table[m[0]]);
delay(5);
write_dat(table[10]);
//显示"
."
write_dat(table[m[1]]);
write_dat(table[m[2]]);
write_dat(table[m[3]]);
write_dat(table[m[4]]);
write_dat(table[11]);
V"
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);
//表示传入的是命令
=~BIT
(1);
//表示写操作
PORTD=com;
//传入命令数据
PORT|=BIT
(2);
//打开使能端
//延时一毫秒
=~BIT
(2);
//关闭使能端
voidwrite_dat(uchardat)
PORT|=BIT(0);
//表示传入的是数据
PORTD=dat;
//传入数字数据
void_1602_init()
DDRD=0XFF;
//C端口为输出,传数据
DDR|=BIT(0);
//设置为输出,分别控制数据/命令、读/写、使能开/关
DDR|=BIT
(1);
DDR|=BIT
(2);
//使能端关闭
write_com(0X38);
//显示模式
write_com(0X01);
//清除屏幕
write_com(0X0C);
//0x0c光标不显示,不闪烁
write_com(0X06);
//写一个字符,地址加一,光标加一,整屏不左移00001100
write_com(0X80+0X00);
//写入数据的起始地址,即在液晶中显示位置,即从屏幕最右开始
voidmain()
uintj=0;
floatresults=0;
floata=0;
_1602_init();
//初始化1602
while
(1)
j=0;
results=0;
ad=0;
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中
//1602中显示位置
show(disp1);
//显示
}
.