数据采集综述.docx
《数据采集综述.docx》由会员分享,可在线阅读,更多相关《数据采集综述.docx(21页珍藏版)》请在冰豆网上搜索。
数据采集综述
综合实验一 PWM波形的设计及应用
设计要求:
1.用ADC0809进行A/D转换,采集到数字信号D
2.在P1.1上产生周期T为1kHz的PWM波形,其中脉冲宽度Tao由数字信号D决定。
(如当采集到的数字信号为80H时,占空比为50%,依此类推)
1.系统设计与理论分析:
模拟信号经ADC0809转换成数字信号D,通过调节输入信号量的大小来控制输出PWM波形的脉冲宽度。
本实验通过模拟信号发生器产生模拟信号,将此信号输入到ADC0809模块的09IN0接口,经ADC0809将输入的模拟信号转换成数字信号D,获得数字信号与计数值T进行比较,当数字信号小于T,则在P1.1引脚输出高电平1;反之输出低电平0。
通过调节模拟量电位器调节模拟量大小,从而控制转换后的数字量大小,达到控制脉冲宽度Tao的大小的作用。
增大或减小输入的模拟信号量,通过运行C程序,在8155键显区数码管上显示也不断加大或减小数字量。
2.硬件设计
2.1根据系统设计与理论分析,这个过程将采用如下框图:
2.2模拟信号发生器
电位器电路用于产生可变的模拟量。
旋转电位器,可调节输出电压值的大小。
2.3A/D模数转换模块
主要是将输入的模拟信号转换成数字信号。
本实验中采用的转换器为ADC0809,它是一个8位逐次逼近型A/D转换器,可以对8个模拟量进行转换,转换时间为100μS。
其工作过程如下:
首先由地址锁存信号ALE的上升沿将引脚ADDA、ADDB和ADDC上的信号锁存到地址寄存器内,用以选择模拟量输入通道;START信号的下降沿启动A/D转换器开始工作;当转换结束时,ADC0809使EOC引脚由低电平变成高电平,程序可以通过查询的方式读取转换结果,也可以通过中断方式读取结果。
本实验程序通过查询的方式读取转换结果。
2.4数码管显示模块
实验箱提供了8段码数码管LED显示电路,只需按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,采用动态方式显示。
8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。
6位位码由8155的PA0口输出,经uA2003反向驱动后,选择相应显示位显示出数据。
2.5示波器
示波器的输入端接到P1.1引脚,可观察在P1.1上产生周期为T的PWM波形。
3.软件设计
3.1编写程序,使用查询的方式读取转换结果
4.系统测试
通过模拟信号发生器,旋转其电位器,调节输入电压值的大小,经A/D转化成数字电压,从而达到控制脉宽的大小,当模拟量较大时,输出的数字量也比较大,示波器显示屏上输出的脉宽也比较宽;当模拟量比较小时,输出的数字量也比较小,其脉冲宽度也比较小,其在示波器显示出的波形分别如下(a)(b):
(a)
(b)
实验原理图:
A/D转换模块
EOC
单片机模块
实验程序:
#include
#include
#defineLEDLen3
#definemode0x03;
#defineCAddrXBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
#defineCS0809XBYTE[0xa000]
sbitP10=P1^0;
sbitP11=P1^1;
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
unsignedcharTao;
unsignedcharT;
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;/*关所有八段管*/
LED=LEDBuf[i];
for(j=0;j<8;j++){/*送164*/
if(LED&0x80)DAT164=1;elseDAT164=0;
CLK164=CLK164|0x02;
CLK164=CLK164&0xfd;
LED<<=1;
}
OUTBIT=Pos;/*显示一位八段管*/
Delay
(1);
Pos>>=1;/*显示下一位*/
}
}
unsignedcharRead0809()
{
CS0809=0;/*起动A/D*/
while(P10==0);
return(CS0809);/*读入结果*/
}
voidDisplayTao()
{
unsignedchari;
i=Tao%100;
LEDBuf[0]=LEDMAP[Tao/100];
LEDBuf[1]=LEDMAP[i/10];
LEDBuf[2]=LEDMAP[i%10];
DisplayLED();
}
voidInitTimer()
{
TMOD=0x02;
TH0=0xFC;
TL0=0xFC;
ET0=1;
EA=1;
TR0=1;
}
voidT0_ISR()interrupt1
{
T++;
if(TaoP11=1;
else
P11=0;
}
voidmain()
{
CAddr=mode;
InitTimer();
while
(1)
{
Tao=Read0809();
DisplayTao();
}
}
综合实验二 电动车的仿真设计
姓名:
黄凤英学号:
110700524年级:
07级专业:
电子科学与技术
在熟悉超想-3000TC系统基础上,完成一电动自行车设计,
设计要求:
1.用DAC0832控制直流电机转动前进,转速可调;用两位数码管显示速度,用四位数码管显示里程。
(设每转一圈前进1m)
1.系统设计与理论分析
直流电机的转速与施加于电机两端的电压大小有关。
在模拟信号发生器获得的模拟信号,并通过电位器调节大小,输入到ADC0809模块转换成数字信号D,在把数字信号输入到DAC0809模块转换成模拟量,本实验用DAC0832控制输出到直流电机的电压,控制DAC0832的模拟输出信号量来控制电机的转速。
当电机转速小于设定值时增大D/A输出电压,大于设定值时则减小D/A输出电压,从而使电机以某一速度恒速旋转。
增大或减小输入的模拟信号量,通过运行C程序,在8155键显区数码管上显示也不断加大或减小的数字量。
2.硬件设计
2.1根据系统设计与理论分析,这个过程将采用如下框图:
2.2模拟信号发生器
电位器电路用于产生可变的模拟量。
旋转电位器,可调节电压值的大小。
2.3A/D模数转换模块
主要是将输入的模拟信号转换成数字信号。
本实验中采用的转换器为ADC0809,它是一个8位逐次逼近型A/D转换器,可以对8个模拟量进行转换,转换时间为100μS。
其工作过程如下:
首先由地址锁存信号ALE的上升沿将引脚ADDA、ADDB和ADDC上的信号锁存到地址寄存器内,用以选择模拟量输入通道;START信号的下降沿启动A/D转换器开始工作;当转换结束时,AD0809使EOC引脚由低电平变成高电平,程序可以通过查询的方式读取转换结果,也可以通过中断方式读取结果。
CLOCK为转换时钟输入端,频率为100KHz-1.2MHz。
2.4D/A数模转换模块
D/A转换器的功能主要是将输入的数字量转换成模拟量输出。
本实验中采用的转换器为DAC0832,该芯片为电流输出型8位D/A转换器,输入设有两级缓冲锁存器,因此可同时输出多路模拟量。
2.5直流电机
直流电机的转速与施加于电机两端的电压大小有关
直流电机
数码管显示模块
实验箱提供了8段码数码管LED显示电路,只需按地址输出相应数据,就可以实现对显示器的控制。
显示共有6位,采用动态方式显示。
8段数码管是由8155的PB0、PB1经74LS164“串转并”后输出得到。
6位位码由8155的PA0口输出,经uA2003反向驱动后,选择相应显示位显示出数据。
3.软件设计
3.1
4.系统测试
调节模拟信号发生器模块上的电位器,使模拟电压从小变大,输入到A/D模块,其输出值再次输入到D/A模块,控制直流电机转动速度从小变大,相应显示速度的两位数码管显示的速度也从小变大;当模拟电压从大变小时,数码管显示的速度也从大变小。
而显示里程四位数码管不断增加。
电路图
A/D转换模块
D/A转换模块
直流电机模块
实验程序:
#include
#include
#defineLEDLen6
#definemode0x03;
#defineC_8155XBYTE[0xe100]/*控制字地址*/
#defineOUTBITXBYTE[0xe101]/*位控制口*/
#defineCLK164XBYTE[0xe102]/*段控制口(接164时钟位)*/
#defineDAT164XBYTE[0xe102]/*段控制口(接164数据位)*/
#defineINXBYTE[0xe103]/*键盘读入口*/
#defineCS0809XBYTE[0xa000]
#defineCS0832XBYTE[0xb000]
sbitP10=P1^0;
sbitP11=P1^1;
bitADC_START;
bitCACULATE_START;
unsignedcharspeed;
unsignedintmile;
unsignedcharsecond;
unsignedcharpressure;
unsignedcharroll;
unsignedcharLEDBuf[LEDLen];/*显示缓冲*/
codeunsignedcharLEDMAP[]={/*八段管显示码*/
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71
};
voidDelay(unsignedcharCNT)
{
unsignedchari;
while(CNT--!
=0)
for(i=100;i!
=0;i--);
}
voidDisplayLED()
{
unsignedchari,j;
unsignedcharPos;
unsignedcharLED;
Pos=0x20;/*从左边开始显示*/
for(i=0;iOUTBIT=0;/*关所有八段管*/
LED=LEDBuf[i];
for(j=0;j<8;j++){/*送164*/
if(LED&0x80)DAT164=1;elseDAT164=0;
CLK164=CLK164|0x02;
CLK164=CLK164&0xfd;
LED<<=1;
}
OUTBIT=Pos;/*显示一位八段管*/
Delay
(1);
Pos>>=1;/*显示下一位*/
}
}
voidGetADCData(void)
{
CS0809=0;/*起动A/D*/
while(P10==0)
;
pressure=CS0809;/*读入结果*/
}
voidControlSpeed(void)
{
CS0832=pressure;
}
voidShowInfo(void)
{
unsignedintl;
l=mile/10;
LEDBuf[2]=LEDMAP[l%10];
l=l/10;
LEDBuf[1]=LEDMAP[l%10]|0x80;
LEDBuf[0]=LEDMAP[l/10];
LEDBuf[3]=0x00;
LEDBuf[4]=LEDMAP[speed/10];
LEDBuf[5]=LEDMAP[speed%10];
DisplayLED();
}
voidInitSystem()
{
C_8155=mode;//初始化8155
ADC_START=0;
CACULATE_START=0;
mile=0;
speed=0;
roll=0;
TMOD=0x01;
TH0=0x3C;
TL0=0xB0;//T0每隔50ms发生一次中断,采样频率为20Hz
second=20;
ET0=1;
EX0=1;
IT0=1;
EA=1;
TR0=1;
}
voidINT0_ISR()interrupt0
{
roll++;
}
voidT0_ISR()interrupt1
{
ADC_START=1;
second--;
if(second==0)
{
CACULATE_START=1;
second=20;
}
TH0=0x3C;
TL0=0xB0;
}
voidCaculate(void)
{
speed=roll;
mile+=roll;
roll=0;
}
voidmain()
{
InitSystem();
while
(1)
{
ShowInfo();
if(ADC_START)
{
ADC_START=0;
GetADCData();
ControlSpeed();
}
if(CACULATE_START)
{
CACULATE_START=0;
Caculate();
}
}
}