北邮arduino实验报告.docx
《北邮arduino实验报告.docx》由会员分享,可在线阅读,更多相关《北邮arduino实验报告.docx(31页珍藏版)》请在冰豆网上搜索。
北邮arduino实验报告
电子电路综合实验设计
实验名称:
基于Arduino的电压有效值测量电路设计与实现
学院:
班级:
学号:
姓名:
班内序号:
实验
基于Arduino的电压有效值测量电路设计与实现
一.摘要
Arduino是一个基于开放原始码的软硬件平台,可用来开发独立运作、并具互动性的电子产品,也可以开发与PC相连的周边装置,同时能在运行时与PC上的软件进行交互。
为了测量正弦波电压有效值,首先我们设计了单电源供电的半波整流电路,并进行整流滤波输出,然后选择了通过Arduino设计了读取电压有效值的程序,并实现使用此最小系统来测量和显示电压有效值。
在频率和直流电压幅度限定在小范围的情况下,最小系统的示数基本和毫伏表测量的值相同。
根据交流电压有效值的定义,运用集成运放和设计的Arduino最小系统的结合,实现了运用少量元器件对交流电压有效值的测量。
关键字:
半波整流整流滤波Arduino最小系统读取电压有效值
二.实验目的
1、熟悉Arduino最小系统的构建和使用方法;
2、掌握峰值半波整流电路的工作原理;
3、根据技术指标通过分析计算确定电路形式和元器件参数;
4、画出电路原理图(元器件标准化,电路图规范化);
5、熟悉计算机仿真方法;
6、熟悉Arduino系统编程方法。
三.实验任务及设计要求
设计实现Arduino最小系统,并基于该系统实现对正弦波电压有效值的测量和显示。
1、基本要求
(1)实现Arduino最小系统,并能下载完成Blink测试程序,驱动Arduino数字13口
LED闪烁;
(2)电源部分稳定输出5V工作电压,用于系统供电;
(3)设计峰值半波整流电路,技术指标要求如下:
输入信号电压范围:
0~1V;
频率范围:
500Hz~2KHz;
电源电压:
5V;
(4)采用Arduino最小系统读取峰值半波整流电路的输出结果,并计算正弦波电压有
效值;
(5)测量出的有效值通过Arduino串口监视器进行读取。
2、提高要求
(1)用数码管显示正弦信号有效值的测量结果;
(2)用Arduino最小系统直接读取正弦信号计算有效值,比较不同测试方法的测量误
差;
(3)自拟其他功能。
3、提交材料
(1)实验报告(含仿真结果、原理图)
(2)峰值半波整流等相关电路的仿真文件;
(3)Arduino程序;
(4)电路原理图文件。
四.设计思路及结构框图
设计思路:
系统组成框图
Arduino电压有效值测量电路包括峰值半波整流电路、最小系统、显示、稳压电路四部分,其中最小系统包括微处理器、振荡电路、下载电路和测试电路。
元器件资料
本实验中用到了一个LM741CN芯片,通过查找资料了解LM741CN的主要参数,管脚设置等。
一片ATMEGA8芯片来搭建一个最小系统,通过查找资料了解ATMEGA8的主要参数和管脚设置。
.分块电路和总体电路的设计
(1)半波电路的设计
本实验需要的是输入7~10V的直流稳压电源,输出5V。
具体电源电路包括整流,滤波等部分,具体的设计如下。
仿真波形如下图所示
(2)半波电路加上整流滤波的设计。
交流电经过整流后得到的是脉动直流,采用滤波电路可以大大降低这种交流纹波成分,让整流后的波形变得比较平滑。
通过整流滤波电路得到电压的峰峰值等于√2倍电压有效值。
仿真波形如下图所示
四、功能实现及扩展
1基本要求:
实际实验中的波形截图及相关分析:
五.故障及问题分析
1.问题一:
半波整流电路的问题
1)选择了不合适的半波电路
失真波形图电路如下
半波仿真波形图如下
滤波仿真波形图如下
2)电路没有共地(此时使用LM358)
LM358严重失真波形图
分析及解决方法:
器件LM358仿真始终就没能找到合适的半波整流电路,所以更换为LM741
最终得到了合适的半波波形。
3)在使用LM741时波形失真,电路没有接错。
分析及解决方法:
LM741四号管脚没有接地。
问题二:
使用Arduino过程中遇到的问题
1)第一次接触Arduino接线接错导致ATMEGA8直接烧毁。
解决方法:
确认下载器接口和图示的对应关系,重接导线。
2)没有把VCC和AREF相接,电压读数是错的。
分析及解决方法:
AREF是A/D转换的参考电压输入端,是5V,不接入参考电压读数必然不
对。
将两端连接问题解决。
问题三:
读数时将电压改变范围扩大,出现不能忽略的误差
分析及解决方法:
通过示波器上测量的输出电压值和毫伏表测量的输入电压值的比值发现,
输出和输入并非完美的线性关系,即在电路中存在一定的失真,但由于仿真中没有问题,迫
于时间限制没能做出完美的线性输出,但可通过改写程序减小误差,如将电压值分段,计算
几组比值,在代码中给每段不同的参数。
改进代码附在最后(在验收时未使用)。
六.实验改进
1)将运算放大器U1由LM358换成LM741,将电路改为经典半波整流电路,观测波形,滤波
电路最初使用20kΩ电阻,滤波后幅值较低,与毫伏表读数相差较多,后改为200Ω,幅值
正常。
原因是20kΩ消耗能量过多,电路的负载能力可能不够。
改小电阻虽能减小损耗,但
理论上输出电流的平滑性会降低,好在实验中没有出现此类现象。
2)Arduino程序改进。
电压示数不对:
第一次获得电压示数的时候发现是毫伏表测量的有
效值的√2倍,于是我们在获取的电压上乘以了0.707,使读数相对准确了许多但误差依然
存在。
电压读数存在误差:
为了使读数更加准确,我在不同幅值处都计算了输出端和毫伏
表示数的比值并求平均,最终使Arduino读数在小范围内零误差读数。
但输入幅值一旦非常
小或者非常大之后会体现出不小的误差,由于时间问题最终没能对程序进行改进,个人认为
由于输出和输入并非完全线性关系,所以对电压读值进行分段,每段计算出不同的输出/输
入的比例系数,相对会减少误差,但非线性关系也意味着输出存在失真,所以电路还应进行
改进。
同组同学的滤波电阻都取的较小,相对的误差也较小,仿真中并无区别,希望还能在
实际操作中进行探究。
后面附了改进之后的代码,一共进行两次改进,但最后一次停留在理
论,未能进行实际操作的验证。
七.总结和结论
1.实验总结:
本次试验是综合设计性实验,要求我们将以前学过的知识都综合运用起,并和新接触的
Arduino器件结合起来使用,设计出具有一定综合功能的电路。
对Arduino进行了解并未花
费太多时间,而半波整流电路的设计却是整个过程中最难的一部分,由于器件的性能和仿真
似乎有出入,不同电路的仿真做了不下十种最终才找到了比较合适的。
2.实验结论:
通过Arduino搭建最小系统和模拟电路的结合实现了电压有效值的读取,还有许多功能有
待尝试。
有程序通过下载器经导线对ATMEGA8的输入输出管脚进行控制来实现自己的程序
是非常有意思的事情,希望日后还有机会做此类尝试。
3.心得体会:
这是一年的模电实验里最有意义的一次,约了六次实验,跑了9次实验室,用了非常多的时间去解决各种问题,起初觉得别人拿着现有的数据很快出图出结果非常羡慕,但是到后来一步一步慢慢达成试验目的也获得了许多成就感。
尤其是很难忘记烧掉一个ATMEGA8之后第二次连上导线接到电脑成功地进行第一次blink之后的喜悦,当时甚至给自己起了个新名字叫“布令客1号”,现在回想起来有点像小学生做的事情,但真的在完成一个之前全然不懂的任务之后非常的有成就感。
越到后期进步就越缓慢,但和同组的人交流之后发现并不是在原地踏步,虽然很长一段时间没能确定下来电路,但同时排除了不少错误的电路设计。
实验中收获的知识有限,但我觉得我得到了我几乎从来没有过的耐心,我甚至在实验结束后的五一小长假前一天认真的XX了色环读阻值,并且把所有的未知电阻挨个读值之后插回了电阻箱,那一刻我觉得电路实验是大学这两年最珍贵的课程,不能糊弄,不能投机取巧虽然在一定程度上可以,还培养了耐心,上了北邮之后我也算是第一次真正的觉得自己的专业还不错。
八.所用元器件及测试仪表清单
元器件清单
名称
型号
数量
用途
运算放大器
LM741CN
1
反相放大
二极管
1N4009
2
控制单项导通的开关特性,防止反向击穿,保护电路
电容
47μF
1
用于整流滤波
10μF
1
用于隔直
电阻
20k
4
限流,防止电压过大,提供负反馈,充当保护电阻、负载电阻等
200
1
面包板
1
用于搭载电路,充当电路的载体
用于连接电路
导线
若干
仪器仪表清单
仪器名称
用途
直流稳压电源
提供直流信号
函数信号发生器
提供交流信号
毫伏表
测量输入电压有效值
示波器
显示波形
万用表
测分压、二极管正负等
九.参考文献
1.北邮电路中心《电子电路综合设计实验》
2.《电子电路基础》北京邮电大学出版社刘宝玲
3.电路中心网站
4.极客工房Arduino教程资料
附代码:
1)初次代码:
constintD=5;
inta;
intV;
intNum[4];
voiddisp(intpos,intnum){
for(inti(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);
}elseif(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);
}
elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}
digitalWrite(pos,HIGH);
}
//thesetuproutinerunsoncewhenyoupressreset:
voidsetup(){
//initializethedigitalpinasanoutput.
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);
pinMode(A0,INPUT);
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
digitalWrite(12,LOW);
digitalWrite(13,LOW);
for(inti(0);i<6;i++){
digitalWrite(i,HIGH);
delay(500);
digitalWrite(i,LOW);
}
}
//thelooproutinerunsoverandoveragainforever:
voidloop(){
a=analogRead(A0);
V=a*(5000.0/1023.0);
Num[0]=V/1000;
Num[1]=(V-Num[0]*1000)/100;
Num[2]=(V-Num[0]*1000-Num[1]*100)/10;
Num[3]=(V-Num[0]*1000-Num[1]*100-Num[2]*10)/1;
for(inti(0);i<100;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);
}
}
2)实验时最终改进:
[解决了不停地闪的问题]
/*
formeasuringvoltage
*/
constintS=5;
intadData=0;
intV=0,preV=0;
intNum[4];
voiddisp(intpos,intnum){
for(inti(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);
//definationsofnumbers
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);
}elseif(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);
}
elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(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);
}elseif(num==9){
digitalWrite(6,HIGH);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);