根據上述原理可知,實驗需要測量的量有兩個:擋光時間間隔和擋光時的電壓平均值。擋光時間可通過Arduino的數字輸入端口采集光電門信號并計算得到,電壓值可以通過Arduino的模擬信號輸入端口采集。但是由于Arduino的模擬信號輸入端只能精確到5mV,而本實驗中感應電動勢大概為100mV左右,誤差太大。所以需要將采集到的感應電動勢的值線性放大后再輸入Arduino。
放大電路使用Lm358P集成運放,加上電阻構建一個電壓線性放大模塊,原理圖如圖2,自制電壓放大模塊實物圖如圖3所示。
電壓放大模塊中的R1用1千歐姆電阻,R2用10千歐姆電阻,這樣放大倍數為11。因為輸入的感應電動勢大概為100mV,經過放大后達到1000mV,用精度為5mV的Arduino模擬信號輸入端來采集,誤差大概0.5%,達到實驗要求。
以下為Arduino端的主要代碼,通過這些代碼可以看到具體的數據采集過程。
……省略變量定義部分,以下主程序循環執行,大概10微秒執行一遍。
void loop () {
if(digitalRead(inputPin1) ==HIGH)//如果光電門輸入信號為1,即擋光時
{ if(i1==0) //如果同時i1變量等于0
if(digitalRead(inputPin1) ==LOW&&i1==1)
//如果光電門輸入信號為0并且i1等于1,即擋光剛結束時
{ tt1=micros(); //令變量tt1等于此刻時間,精確到1微秒
通過以上代碼可以計算得到光電門擋光時間,以及對擋光時間內大概每10微秒采集一次的電壓求平均得到的平均電壓。因為程序每執行一遍會有100微秒左右的延時,所以計算得到的擋光時間間隔也會有約20微秒的誤差。由于每次擋光時間大概有幾十毫秒,所以擋光時間間隔的誤差大概有0.5%左右,達到實驗精度。圖4為實驗裝置實物圖。
軟件部分利用Adobe Flash來開發,最后生成swf動畫課件。因為具體代碼較多,這里不再列出。圖為課件界面。
當移動小車正向通過光電門時,課件中的小車也會移動。當Arduino端發送數據時,課件中會實時顯示在對應的方框內。點擊記錄數據按鈕,可以將此次數據記錄在表格中。當移動小車反向通過光電門時,課件中的小車也會回到原來位置,并且方框中的數據同時清零。移動小車反復經過光電門,就可以記錄多組時間間隔和感應電動勢的數據。
記錄完后,將表格中的數據復制,并粘貼到Excel表格中,利用Excel來進行數據處理,圖6為某此實驗數據。