圓創力科技

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

查看: 6865|回復: 7

單晶片魔法車08-高架軌道車

  [複製鏈接]
magiccar 發表於 2010-3-3 01:12 | 顯示全部樓層 |閱讀模式
在實驗7裏,我們把紅外線LED及接收器組合成偵測地面黑色軌道的模組,我就有學生在家裏用黑膠帶,從房間到客廳、廚房,貼了很長的軌道,跟家人玩起郵差送信的遊戲,真的很好玩哦!
接下來的實驗我修改了一些電路的結構,如:取消原來使用兩組電源的架構,改由一顆7.4V可充電的鋰電池透過穩壓IC-7805供應電路5V電源,而馬達驅動則採用之前在"不是玩具-單晶片科學魔法車"一文中提到的IC-TA7291P來控制,因此現在魔法車除了前進、後退之外,也能透過程式下達停止的指令了。


實驗八:高架軌道車
實驗內容:如何在寬度峽長的軌道上順利過彎。

先看程式囉:
這次程式加一樣新菜色,就是利用89C2051計時器來產生中斷,讓程式可以規劃出PWM的信號,目的是輸出到TA7291P來控制馬達的速度,非常好用喔!

  1. /*實驗八:高架軌道車*/
  2. #include <AT89x051.h>
  3. #include<math.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. uchar t=0;            //中斷計數器
  7. uchar m1=0;           //左馬達速度值
  8. uchar m2=0;           //右馬達速度值
  9. uchar tmp1,tmp2;       //左右馬達當前速度值

  10. /* 馬達控制函數 index-左右馬達(1,2); speed-馬達速度(-100 ~ 100) */
  11. void motor(uchar index, char speed)
  12. {
  13.         if(speed>=-100 && speed<=100){
  14.                 if(index==1){         //左馬達的處理
  15.                         m1=abs(speed);   //取速度的絕對值
  16.                         if(speed<0){     //速度值為負則反轉
  17.                                 P1_2=0;
  18.                                 P1_3=1;
  19.                         }
  20.                         else{             //不為負數則正轉
  21.                                 P1_2=1;
  22.                                 P1_3=0;
  23.                         }
  24.                 }
  25.                 if(index==2){         //右馬達的處理
  26.                         m2=abs(speed);   //速度控制
  27.                         if(speed<0){      //方向控制
  28.                                 P1_4=0;
  29.                                 P1_5=1;
  30.                         }
  31.                         else{
  32.                                 P1_4=1;
  33.                                 P1_5=0;
  34.                         }
  35.                 }
  36.         }
  37. }

  38. /* 延時函數 */
  39. void delay(unsigned int j)        
  40. {                               //改變參數J大小,可調整時間
  41.         for(j;j>0;j--);
  42. }

  43. /* 主程式開始 */
  44. void main(void)
  45. {
  46.         P3_2=1;           //啟始左側紅外線輸入功能
  47.         P3_3=1;           //啟始右側紅外線輸入功能
  48.         TMOD=0x02;       //設定T0的工作模式為2
  49.         TH0=0x3C;         //設定定時器的初值
  50.         TL0=0x3C;          //設定定時器的重載值
  51.         EA=1;            //中斷開啟
  52.         ET0=1;           //定時器0允許中斷
  53.         TR0=1;           //啟動定時器0
  54.         while(1){
  55.                 while(P3_3==1 && P3_2==1){        //當車體在軌道中時
  56.                         motor(1,50);                       //左右馬達加速前進
  57.                         motor(2,50);
  58.                 }
  59.                 while(P3_2==0 && P3_3==1){       //當左側紅外線偵測到軌道邊緣時
  60.                         motor(2,-50);                     //右馬達反轉
  61.                         motor(1,30);                      //左馬達減速..直到避開軌道邊緣
  62.                 }
  63.                 while(P3_2==1 && P3_3==0){       //當右側紅外線偵測到軌道邊緣時
  64.                         motor(1,-50);                     //左馬達反轉
  65.                         motor(2,30);                      //右馬達減速..直到避開軌道邊緣
  66.                 }
  67.                 while(P3_3==0 && P3_2==0){       //無任何反射信號時
  68.                         delay(10);                 //作用為何呢?
  69.                 }
  70.         }
  71. }

  72. /* T0中斷服務程序 */
  73. void timer0() interrupt 1
  74. {
  75.         if(t==0){                     //1個PWM週期完成後才會接受新數值
  76.                 tmp1=m1;
  77.                 tmp2=m2;
  78.         }
  79.         if(t<tmp1) P1_0=1; else P1_0=0;   //產生左馬達的PWM信號
  80.         if(t<tmp2) P1_1=1; else P1_1=0;   //產生右馬達的PWM信號
  81.         t++;
  82.         if(t>=100) t=0;          //1個PWM週期由100次中斷產生
  83. }
複製代碼
編譯完成的檔案:
IR_01.hex (1.28 KB, 下載次數: 49)
曹齊平 發表於 2010-3-5 22:52 | 顯示全部樓層
周老師  今天終於找到L293D了, 下週一寄給你試試看, 和TA7291P比較一下哪個好用. 謝謝您
 樓主| magiccar 發表於 2010-3-12 23:49 | 顯示全部樓層
用L293D,只要一顆就搞定了,電路占用的面積更小了,程式連改都不用改,直接套用上去就行了!
IMGP8087.JPG

TA7291P 1顆只能驅動1顆馬達, 但輸出功率比較高, 散熱也比較沒問題!
IMGP8082.JPG
d2513850 發表於 2010-4-30 23:04 | 顯示全部樓層
若軌道變窄至2倫的寬度的話,此車能否遇到問題
martin 發表於 2010-5-1 01:37 | 顯示全部樓層
本帖最後由 martin 於 2010-5-1 01:41 編輯

我覺得老師的軌道已經夠窄了吧! 我的車即使慢慢走, 還是常常走到掉下去

不過我倒覺得, 多留一些寬度, 比較有加速的緩衝空間, 然後再來做個超速的版本...
v751953789 發表於 2011-2-22 14:05 | 顯示全部樓層
砍起來有點小困難。加油!
 樓主| magiccar 發表於 2011-2-23 10:49 | 顯示全部樓層
v751953789 發表於 2011-2-22 14:05
砍起來有點小困難。加油!

晶片到手,一切就變得容易了!
陕大鹍 發表於 2011-8-14 02:24 | 顯示全部樓層
好难啊!真的很佩服!
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

QQ|Archiver|手機版|小黑屋|圓創力科技有限公司 IOP Robotic Technology Co.,Ltd Tel: 07-3924582 Fax: 07-3924001

GMT+8, 2024-3-29 18:42 , Processed in 0.032503 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回復 返回頂部 返回列表