AD转换DA转换及pwm转速测量实验.docx
《AD转换DA转换及pwm转速测量实验.docx》由会员分享,可在线阅读,更多相关《AD转换DA转换及pwm转速测量实验.docx(23页珍藏版)》请在冰豆网上搜索。
AD转换DA转换及pwm转速测量实验
工程实训实验报告
单位(二级学院):
自动化学院
学生姓名:
张宝川
专业:
电气工程及其自动化
班级:
0831302
学号:
2013212629
实验一、数据采集_A/D转换
一、实验目的
(1)掌握A/D转换与单片机接口的方法;
(2)了解A/D芯片0809转换性能及编程方法;
(3)通过实验了解单片机如何进行数据采集。
(4)ADC0809引脚结构:
ADC0809各脚功能如下:
D7~D0:
8位数字量输出引脚。
IN0~IN7:
8位模拟量输入引脚。
VCC:
+5V工作电压。
GND:
地。
REF(+):
参考电压正端。
REF(-):
参考电压负端。
START:
A/D转换启动信号输入端。
ALE:
地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换).
EOC:
转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。
OE:
输出允许控制端,用以打开三态数据输出锁存器。
CLK:
时钟信号输入端(一般为500KHz)。
A、B、C:
地址输入线。
二、实验任务
1.硬件电路设计:
设计基于单片机控制的AD转换应用电路。
AD转换芯片采用ADC0809。
ADC0809的通道IN3输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。
ADC0809的VREF接+5V电压。
2.软件设计:
程序设计内容
(1)进行A/D转换时,采用查询EOC的标志信号来检测A/D转换是否完毕,经过数据处理之后在数码管上显示。
(2)进行A/D转换之前,要启动转换的方法:
ABC=110选择第三通道。
ST=0,ST=1,ST=0产生启动转换的正脉冲信号
图1.2ADC0809时序图
三、实验代码
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitOE=P1^0;
sbitST=P1^2;
sbitEOC=P1^1;
sbitCLK=P1^3;
sbitC1=P1^6;
sbitC2=P1^5;
sbitC3=P1^4;
unsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigneddate;
voiddelay(unsignedintz)
{
unsignedinti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voiddisplay(unsignedintx)
{
P2=0xfe;
P0=table[x/100];
delay(10);
P0=0x00;
P2=0xfd;
P0=table[x/10%10];
delay(10);
P0=0x00;
P2=0xfb;
P0=table[x%10];
delay(10);
P0=0x00;
}
voidmain()
{
TMOD=0x01;
TH0=(65536-900)/256;
TL0=(65536-900)%256;
TR0=1;
ET0=1;
EA=1;
C1=0;
C2=1;
C3=1;
while
(1)
{
ST=0;
ST=1;
ST=0;
delay
(2);
while(!
EOC)
display(date);
OE=1;
date=P3;
OE=0;
}
}
voidtimer0()interrupt1
{
TH0=(65536-900)/256;
TL0=(65536-900)%256;
CLK=~CLK;
}
四、实验结果
实验二、D/A转换及数字式波形发生器
一、实验目的
1、熟悉DAC0832内部结构及引脚。
2、掌握D/A转换与接口电路的方法。
3、通过实验了解单片机如何进行波形输出。
二、D/A转换器的主要性能参数
(1)分辨率:
该参数是描述D/A转换对输入变量变化的敏感程度。
具体指D/A转换器能分辨的最小电压值。
分辨率的表示有两种:
最小输出电压VLSB(输入数字只有最低位为1)与最大输出电压输入数字全为1)的比值来表示
用输入端待进行转换的二进制数的位数来表示,位数越多,分辨率越高。
分辨率的表示式为:
分辨率=Vref/2位数或分辨率=(V+ref+V-ref)/2位数
若Vref=5V,8位的D/A转换器分辨率为5/256=20mV。
(2)转换时间:
指数字量输入到模拟量输出达到稳定所需的时间。
一般电流型D/A转换器在几秒到几百微秒之内;而电压型D/A转换器转换较慢,取决于运算放大器的响应时间。
(3)转换精度:
指D/A转换器实际输出与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位。
如:
±1/2LSB表示,当D/A分辨率为20mV,则精度为±10mV.
(4)线性度:
当数字量变化时,D/A转换器输出的模拟量按比例变化的程度。
线性误差——模拟量输出值与理想输出值之间偏离的最大值。
三、实验内容
1.AT89C51控制DAC0832实现数/模转换(D/A)转换。
从单片机输出数据到DAC0832,经其转换成模拟量输出。
2.设计一个由单片机控制的信号发生器。
运用单片机系统控制产生多种波形,这些波形包括方波、三角波、锯齿波、正弦波等。
信号发生器所产生的波形的频率、幅度均可调节。
并可通过软件任意改变信号的波形。
基本要求:
① 产生三种以上波形。
如正弦波、三角波、矩形波等。
②最大频率不低于 500Hz。
并且频率可按一定规律调节。
③幅度可调,峰峰值在0~5V之间变化。
扩展要求:
产生更多的频率和波形。
四、实验代码
#include
sbitkey1=P1^0;
sbitkey2=P1^3;
sbitkey3=P1^6;
#defineucharunsignedchar
#defineuintunsignedint
voidsanjiaobo();
voidfangbo();
voidjuchibo();
voidmain()
{
P1=0xff;
while
(1)
{
if(key1==0)
sanjiaobo();
if(key2==0)
fangbo();
if(key3==0)
juchibo();
}
}
voidsanjiaobo()
{
unsignedinti;
charflag=0;
P2=0;
while
(1)
{
if(flag==0)
{
for(i=0;i<10;i++);
P2+=1;
if(P2>=255)flag=1;
}
if(flag==1)
{
for(i=0;i<10;i++);
P2-=1;
if(P2==0)flag=0;
}
}
}
voidfangbo()
{
unsignedinti;
while
(1)
{
for(i=0;i<1000;i++);
P2=255;
for(i=0;i<1000;i++);
P2=0;
}
}
voidjuchibo()
{
unsignedinti;
charflag=0;
P2=0;
while
(1)
{
if(flag==0)
{
for(i=0;i<10;i++);
P2+=1;
if(P2>=255)
flag=1;
}
if(flag==1)
{
P2=0;
if(P2==0)
flag=0;
}
}
}
五、实验结果
实验三、基于旋转编码器的转速测量
一、实验目的
1.了解编码器工作原理
2.掌握编码器速度检测的方法;
二、编码器工作原理
绝对脉冲编码器:
APC
增量脉冲编码器:
SPC
两者一般都应用于速度控制或位置控制系统的检测元件
旋转编码器分为单路输出和双路输出两种:
单路输出是指旋转编码器的输出是一组脉冲,
双路输出的旋转编码器输出两组相位差90度的脉冲,通过这两组脉冲不仅可以测量转速,还可以判断旋转的方向。
编码器电路外接74HC74的作用
74HC74在旋转编码器旋转时输出两路正交脉冲A、B,为了判断旋转编码器旋转方向,用74HC74做鉴相器。
A作为时钟脉冲接入74HC74,B作为D接入74HC74,理论上74HC74应该在A的上升沿判断B状态,如果B为低电平,则输出Q为低电平,说明旋转编码器正转;如果B为高电平,则输出Q为高电平,说明旋转编码器反转。
因为A、B是正交脉冲,只要旋转编码器旋转方向不变,74HC74的输出Q就应该维持高电平或低电平状态。
三、实验内容
1.根据旋转编码器的工作原理,设计基于旋转编码器的速度检测原理图;
2.利于实验室提供的单片机最小系统,设计位置检测、速度检测系统的应用电路;画出系统框图;
3.编写相关程序,实现对位置及转速的测量,并显示;
四、实验代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitIN1=P1^0;
sbitIN2=P1^1;
sbitENA=P1^2;
sfrldata=0x80;
sbitdula=P2^6;
sbitwela=P2^7;
sbitq1=P3^4;
bitbit_0;
uintcount_N,count_N1,count_N2;
uintcount_n8;//计数值
ucharT_N=20;
ucharT_N1=3;
voidmsplay(uchar,uchar);
voidINT_0_Init();
voidTimer0_Init();
voidMotor_Init();
ucharcodex1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x40,0x7c,0x39,0x5e,0x3e,0x48};
ucharcodex2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
ucharcodex3[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
ucharcodex4[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voiddelay(uintz)//延时函数
{
uintx;
for(x=z;x>0;x--);
}
voidMotor_Init()
{
ENA=1;
IN1=1;
IN2=0;
}
voidINT_0_Init()
{
IT0=1;
EX0=1;
}
voidTimer0_Init()
{
TMOD=0X11;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
voidmain()
{
uchark5,k4,k3,k2,k1,k0,k6;
INT_0_Init();
Timer0_Init();
while
(1)
{
k0=0x0e;
k1=0x0f;
if(!
q1)
{
k6=0;
}
else
{
k6=10;
}
if(!
bit_0)
{
k2=count_N%10000/1000;
k3=count_N%1000/100;
k4=count_N%100/10;
k5=count_N%10;
bit_0=1;
}
msplay(k0,0);
msplay(k1,1);
msplay(k6,3);
msplay(k2,4);
msplay(k3,5);
msplay(k4,6);
msplay(k5,7);
}
}
voidint_0()interrupt0
{
count_n8++;
}
voidtimer0()interrupt1
{
TR0=0;
TH0=(65536-45000)/256;
TL0=(65536-45000)%256;
T_N--;
if(0==T_N)
{
count_N2=count_n8;
count_N=27.952*count_N2;
bit_0=0;
count_n8=0;
T_N=20;
}
TR0=1;
}
voidmsplay(uchary1,uchary2)
{
ldata=x1[y1];
if(y2==6)
{
ldata=ldata|0x80;
}
dula=1;
dula=0;
delay
(1);
ldata=x3[y2];
wela=1;
wela=0;
delay
(1);
ldata=0x00;
dula=1;
dula=0;
delay
(1);
ldata=0x0ff;
wela=1;
wela=0;
delay
(1);
}
五、实验结果
实验四、基于51系列单片机控制的直流电机PWM调速
一、实验目的
1.掌握脉宽调制(PWM)的方法。
2.用程序实现脉宽调制,并对直流电机进行调速控制。
二、脉宽调制(PWM)基本原理
控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。
按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
利用51单片机产生PWM脉冲思路:
需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。
编程思路是这样的:
T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
L298N为SGS-THOMSONMicroelectronics所出产的双全桥步进电机专用驱动芯片(DualFull-BridgeDriver),内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号。
三、实验内容:
1.利用实验室提供的单片机应用系统及直流电机驱动电路板,编制控制程序,实现直流电机PWM调速控制。
四、实验代码
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeLEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbitIN1=P1^0;
sbitIN2=P1^1;
sbitENA=P1^2;
sbitKey1=P3^5;
sbitKey2=P3^6;
sbitKey3=P3^7;
uintVelocity1=50;
uintcount=50;
uinttime=100;
uintcount1=0;
uinttime1=0;
uintvelocity=0;
uintm=0;
voiddelayms(uintms)
{
uchari;
while(ms--)
for(i=0;i<120;i++);
}
voiddisplay(uintresult)
{
P2=0xf7;
P0=LEDData[result%100%10];
delayms
(2);
P0=0x00;
P2=0xff;
P2=0xfb;
P0=LEDData[result%100/10];
delayms
(2);
P0=0x00;
P2=0xff;
P2=0xfd;
P0=LEDData[result/100];
delayms
(2);
P0=0x00;
P2=0xff;
}
voidInit()
{
ENA=1;
IN1=0;
IN2=1;
IT0=1;
EX0=1;
TMOD=0x11;
TL0=(65536-5)/256;
TH0=(65536-5)%256;
TR0=1;
ET0=1;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
ET1=1;
EA=1;
}
voidKeyScan()
{
if(Key1==0)
{
delayms(5);
if(Key1==0)
{
Velocity1++;
while(!
Key1);
}
}
if(Key2==0)
{
delayms(5);
if(Key2==0)
{
Velocity1--;
while(!
Key2);
if(Velocity1==0)
Velocity1=1;
}
}
if(Key3==0)
{
delayms(5);
if(Key3==0)
{
IN1=~IN1;
IN2=~IN2;
while(!
Key3);
}
}
}
voidmain()
{
Init();
while
(1)
{
KeyScan();
display(velocity);
}
}
voidInt0()interrupt0
{
count1++;
}
voidtimer0()interrupt1
{
TR0=0;
TL0=(65536-5)/256;
TH0=(65536-5)%256;
count--;
if(count==0)
{
ENA=0;
count=1;
}
time--;
if(time==0)
{
ENA=1;
time=100;
count=Velocity1;
}
TR0=1;
}
voidtimer1()interrupt3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
time1++;
if(time1==20)
{
if(count1!
=0)
{
m=count1;
}
time1=0;
velocity=(uint)((m*60.0)/(24.0*1.0));
count1=0;
}
}
五、实验结果