专注电子技术学习与研究
当前位置:单片机教程网 >> Arduino >> 浏览文章

光电门与电压放大器做电磁感应定律验证实验

作者:未知   来源:互联网   点击数:  更新时间:2014年07月31日   【字体:

根据上述原理可知,实验需要测量的量有两个:挡光时间间隔和挡光时的电压平均值。挡光时间可通过Arduino的数字输入端口采集光电门信号并计算得到,电压值可以通过Arduino的模拟信号输入端口采集。但是由于Arduino的模拟信号输入端只能精确到5mV,而本实验中感应电动势大概为100mV左右,误差太大。所以需要将采集到的感应电动势的值线性放大后再输入Arduino

放大电路使用Lm358P集成运放,加上电阻构建一个电压线性放大模块,原理图如图2,自制电压放大模块实物图如图3所示。

 

 
电压放大模块中的R11千欧姆电阻,R210千欧姆电阻,这样放大倍数为11。因为输入的感应电动势大概为100mV,经过放大后达到1000mV,用精度为5mVArduino模拟信号输入端来采集,误差大概0.5%,达到实验要求。
以下为Arduino端的主要代码,通过这些代码可以看到具体的数据采集过程。
……省略变量定义部分,以下主程序循环执行,大概10微秒执行一遍。
void loop () {
if(digitalRead(inputPin1) ==HIGH)//如果光电门输入信号为1,即挡光时
 if(i1==0)                     //如果同时i1变量等于0
   t1=micros();                //令变量t1等于此刻时间,精确到1微秒
  i1=1;    }                     //令变量i1等于1,下次循环不再执行上面程序
   if(i1==1)                       //如果变量i1等于1,即挡光的过程中
  {  v1=analogRead(A0);    //每执行一次程序采集一个电压值,大概每10微秒采集一次
  vv+=v1;                   //变量vv为对电压进行累加的值
  i++;    }}                  //令变量i每执行一次增加1
if(digitalRead(inputPin1) ==LOW&&i1==1) 
//如果光电门输入信号为0并且i1等于1,即挡光刚结束时
{ tt1=micros();              //令变量tt1等于此刻时间,精确到1微秒
  t1=tt1-t1;                 //通过tt1与t1想减计算得到时间间隔
  i1=0;                      //令变量i1等于0,即此次挡光计算结束
  v1=vv/i;                   //累加的电压除于累加次数得到平均电压值
  vv=0;
  i=0;
   Serial.print(t1);         //发送时间间隔
   Serial.print("t ");       //发送分割字母
   Serial.print(v1);         //发送平均电压值
   Serial.print(0,BYTE);     //发送结束字符
   delay(100);}   }
通过以上代码可以计算得到光电门挡光时间,以及对挡光时间内大概每10微秒采集一次的电压求平均得到的平均电压。因为程序每执行一遍会有100微秒左右的延时,所以计算得到的挡光时间间隔也会有约20微秒的误差。由于每次挡光时间大概有几十毫秒,所以挡光时间间隔的误差大概有0.5%左右,达到实验精度。图4为实验装置实物图。
 
软件部分利用Adobe Flash来开发,最后生成swf动画课件。因为具体代码较多,这里不再列出。图为课件界面。

 
当移动小车正向通过光电门时,课件中的小车也会移动。当Arduino端发送数据时,课件中会实时显示在对应的方框内。点击记录数据按钮,可以将此次数据记录在表格中。当移动小车反向通过光电门时,课件中的小车也会回到原来位置,并且方框中的数据同时清零。移动小车反复经过光电门,就可以记录多组时间间隔和感应电动势的数据。
记录完后,将表格中的数据复制,并粘贴到Excel表格中,利用Excel来进行数据处理,图6为某此实验数据。


从实验数据中可以看到,在同样匝数下,感应电动势和挡光时间的乘积为一定值。如果将线圈匝数增大一倍,感应电动势和挡光时间的乘积也增大一倍。由此可以得到法拉第电磁感应定律。
关闭窗口

相关文章