资源描述
基于Arduino的电压有效值测量电路设计与实现
23
2020年4月19日
文档仅供参考
北京邮电大学
电子电路综合设计实验报告
学院:信息与通信工程学院
班级:
姓名:
学号:
实验题目:基于Arduino的电压有效值测量电路设计与实现。
摘要:为了了解Arduino最小系统的搭建和编程方法以及半波整流模拟电路的工作原理,经过搭建Arduino最小系统,测试Blink程序,能够驱动Arduino数字13口LED闪烁。采用uA741搭建半波整流电路,加上滤波电路,经过编写程序能够实现在一定误差范围内用数码管读取正弦波电压有效值,并测试了正弦波在不同频率及峰峰值的情况下读取有效值的准确性,能够看出这种情况下的测量范围是有限的。经过这个实验,对Arduino最小系统有了深刻全面的认识,拓宽了眼界,同时经过对半波整流不同电路类型的搭建摸索,对模拟电路滤波有了更深的认识。也发现Arduino最小系统能够有更多有价值的应用。
关键词:Arduino、半波整流、滤波
实验目的:1、熟悉Arduino最小系统的构建和使用方法;
2、掌握峰值半波整流电路的工作原理;
3、根据技术指标经过分析计算确定电路形式和元器件参数;
4、画出电路原理图(元器件标准化,电路图规范化);
5、熟悉计算机仿真方法;
6、熟悉Arduino系统编程方法。
实验设计:
实验的总体设计分为三部分:Arduino最小系统的实现、半波整流及滤波电路和数码管的显示。三部分连接在一起完成对正弦信号电压有效值的测定。
1、 系统组成框图
2、 Arduino最小系统的搭建
使用单片机、16M晶振与两个22pf的电容完成最小系统的搭建,但Arduino不光是硬件,需要用Arduino IDE把Bootloader下载进入这个最小的硬件系统中。在单片机的13口接LED灯,经过下载器将blink程序烧入最小系统,能够控制LDE灯的闪烁频率。同样,根据滤波电路的调测将编写的测量程序写入最小系统就能够较准确地读电压的有效值。
3、半波整流及滤波电路
根据二极管正向导通反向截止的特性,使用LM741完成半波整流电路。因为LM741是双电源供电,但实验器材中只有一个能够提供+5V电压的稳压集成电路7805,为了完成实验,使用两个10k的电阻将5V分压,将+2.5V接入本应接地的3口,从而将地线提高到+2.5V,能够完成LM741单电源的半波整流。交流电源后加的47uf的电容是为了滤低频成分。实验过程中曾尝试使用单电源供电的LM358p进行半波整流,虽然示波器有半波电路,但在仿真过程中出现较大的误差,因此重新使用LM741.
滤波电路采用50Ω电阻和100uf电容串接的RC滤波电路,实验中发现电阻小一些滤波效果比较好,波形更平。
4、数码管的显示
根据数码管的引脚图将数码管与单片机接在一起,单片机接+5V电源,根据烧好的程序,数码管自己显示读数。
电路的安装与调试:
首先根据电路图搭建了Arduino最小系统,用下载器连接最小系统与电脑,将blink程序烧入最小系统中,实现了13口LED灯闪烁。在此过程中连线非常重要,单片机很容易因为连线的失误烧坏。
接下来连接半波整流及滤波电路。根据电路图连线(注意接地),用函数信号发生器产生1V左右,1KHz的正弦波接入输入端(用示波器观察),使用7805产生稳定的+5V电压接入运算放大器中,接通电源,用示波器另一路在输出端观察半波整流情况,示波器显示如下图:
能够看到正弦波抬高了2.5V之后实现半波。(测量看出实际抬高2.56V)
再接入滤波电路,用示波器观察输出,如下图所示:
在屏幕中能够看出 基本与滤波前峰值相平。
接下来用毫伏表测量输入信号的有效值,同时用示波器观察滤波后幅值的大小(先减去抬高的2.56V),改变输入信号峰峰值的大小,将两者进行比较,列表如下:
毫伏表读数V1(mV)
示波器读数V2(mV)
V1/V2
344
490
0.702
382
540
0.707
400
550
0.727
481
650
0.740
697
960
0.719
能够看出毫伏表测出的有效值与滤波后电压的大小基本满足0.707的关系,在编程时取0.720.
接下来将数码管与单片机连接在一起,根据数码管的工作原理编写程序,用下载器将程序烧入最小系统,检测数码管工作是否正常。安装好数码管后,去掉下载器,用线将半波整流电路的输出接入最小系统的输入,给最小系统接入+5V的电压。整个电路注意共地。观察数码管的示数与毫伏表示数,改变输入信号峰峰值或频率,观察两者示数的变化。在不改变频率的情况下,改变输入峰峰值,列表如下:
毫伏表示数(mV)
数码管示数(mV)
261
265
303
304
345
346
368
367
能够看出数码管读出的有效值与毫伏表测出的基本一致,在误差允许的范围内。但在改变峰峰值及频率的情况下,准确度会有所下降,在1V、1KHz左右最准确。随着峰峰值的增大,误差也会变大。
至此,实验基本结束。
电路仿真:
主要用multisim软件对半波整流电路及加上滤波之后的电路进行仿真。
LM741半波整流电路仿真结果
加上滤波之后的电路仿真结果
仿真结果与实际实验结果基本符合。
故障及问题分析:
1、 实验准备不够充分,导致一开始做实验有些盲目,对电路原理图没有搞清楚,盲目地在LM741和LM358之间折腾,浪费了很多时间;
2、 在使用仪器时不够熟练,示波器线上有时*10没有注意到。整个系统必须共地,刚开始时忽略了,导致读数不稳定。在使用稳压器时输入电压过低,导致输出不能达到5V;
3、 对单片机的工作原理不熟悉,在一开始没有将参考电压口接入,开始连接下载器使用电脑给最小系统供电,没有统一接入+5V电压,导致半波整流波形失真,读数不准确;
4、 连线失误,单片机与下载器相连由于疏忽连线错误,连入电脑时会烧坏单片机。一开始滤波时,电阻电容参数不合适,无法获得平滑的波形,有小的突起,经过调试,不断减小电阻阻值使得波形平滑;
5、 数码管示数的不稳定,除了上面提到的没有共地、没有接入统一的+5V电压、没有接参考电压外,还有程序编写上的问题。最开始,对最小系统及数码管原理不清楚,编写程序时有些盲目,了解了之后,由于没有考虑写入参考电压,数码管读数不稳定,经过重复的修改与讨论,才完善了程序。
6、 在实验中也需要考虑整体布局布线的问题,在面包板上插线,插器件时要小心,否则有时因为接触不良也为影响实验结果。
实验总结及结论:
经过这次实验,我学到了很多。这是我做的第一个需要设计比较复杂的系统,对于分模块组成一个完整的系统有了比较深刻的认识。每一个分块必须先能够正常工作,再将它们连接在一起,经过调试实现系统功能。另外,我对Arduino有了深刻地认识,在做实验前,我对于编程控制硬件工作一无所知,经过重复摸索编程实现功能,我对硬件软件有了更清楚的了解。在实现半波整流及滤波电路时,由于开始时对原理不太清楚,走了一些弯路,有时半波出不来要么失真,由于电阻电容参数不合适,滤波不理想,经过讨论与重复调试检测,终于得到了理想的结果,这也使我对模拟电路认识更深。
做这次实验花了很多时间,也得到了能力的提升。在搭建模拟电路部分时,重复地拆又重搭,用LM741和LM358不停地在摸索,过程也比较不顺,但最终效果理想,在重复地摸索中,很好地锻炼了动手能力,也思考的更深刻,对电路也更理解,对仪器的使用也更加熟练。同时这个实验涉及到编写程序来驱动硬件工作,对程序不断地修改来获得理想的效果,是数码管能够得到稳定的显示数,提升了自己的编程逻辑能力。经过这次实验,也清楚了单片机数码管的使用。同时我也认识到实验前的准备非常重要,对实验目的、原理及仪器要非常清楚,才能够顺利的完成实验,否则就会手忙脚乱,浪费时间,这就要求我们要更加扎实的完成基础理论的学习。在实验过程中与同学的讨论交流也是学习提高的好方法。做实验需要有耐性有恒心和好奇心,要坚持不懈。
在这个实验中,我们主要是用Arduino最小系统完成对电压有效值的测量,同时也认识到Arduino能够实现非常强大的功能,这个实验仅仅是一个开始,在以后的学习中希望能够对Arduino有更深刻的认识,用它来完成更多更有价值的实验。
实验程序:
/*
Blink
Turns on an LED on for one second, then off for one second, repeatedly.
This example code is in the public domain.
*/
const int D=5;
int a;
int V;
int Num[4];
void disp(int pos,int num){
for(int i(0);i<6;i++){
digitalWrite(i,LOW);
}
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,HIGH);
digitalWrite(12,HIGH);
digitalWrite(13,HIGH);
if(num==0){
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else if(num==1){
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
}
else if(num==2){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else if(num==3){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else if(num==4){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
}else if(num==5){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}else if(num==6){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
digitalWrite(13,LOW);
}else if(num==7){
digitalWrite(6,HIGH);
digitalWrite(7,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else if(num==8){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else if(num==9){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
}else{
digitalWrite(11,0);
digitalWrite(10,0);
}
digitalWrite(pos,HIGH);
}
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
for(int j(0);j<10;j++){
for(int i(0);i<6;i++){
disp(i,j);
delay(100);
}
}
}
// the loop routine runs over and over again forever:
void loop() {
analogReference(DEFAULT);
a=analogRead(A5);
V=(a*(5000.0/1023.0)-2560)*0.720;
Num[0]=V/1000;
Num[1]=(V%1000)/100;
Num[2]=(V%100)/10;
Num[3]=(V%10);
for(int i(0);i<10;i++){
disp(2,Num[0]);
delay(D);
disp(3,Num[1]);
delay(D);
disp(4,Num[2]);
delay(D);
disp(5,Num[3]);
delay(D);
}
}
所用仪器及元件:
名称
数量
名称
数量
ATMEGA8
1
运放
1
16M晶振
1
二极管
2
22PF
2
数码管
6位
LED
1
其它
若干
7805
1
相关元件引脚图
LM741
LM358
ATMEGA8芯片的引脚图
下载器连线
展开阅读全文