[KIT AT89S52 V1] ĐO KHOẢNG CÁCH SỬ DỤNG CẢM BIẾN SRF05

Thảo luận trong 'KIT AT89S52 V1' bắt đầu bởi BanLinhKien.Vn, 12 Tháng chín 2014.

Users Viewing Thread (Users: 0, Guests: 0)

Lượt xem: 2,375

  1. BanLinhKien.Vn

    BanLinhKien.Vn Nhóm MCU

    Chào các bạn!
    Hiện nay, cửa hàng banslinhkien.vn đã cho ra đời sản phẩm Kit AT89S52 V1. Đây là bộ kit học tập nhỏ gọn cho dòng vi điều khiển 8051. Ngoài những tính năng cơ bản khác như ghép nối LCD1602, GLCD KS0108, giao tiếp máy tính qua cổng com, nút nhấn, led đơn, DS18B20. Thì Kit AT89S52 V1 còn có thêm chức năng ghép nối với cảm biến siêu âm SRF05.
    [​IMG] [​IMG]
    [​IMG]
    [​IMG]
    Sơ đồ kết nối SRF05 với AT89S52 trên Kit AT89S52 V1.
    [​IMG]
    Giao tiếp 8051 với SRF05.

    *.Giản đồ xung hoạt động của SRF05.
    [​IMG]
    Dựa vào giản đồ xung ở trên ta thấy:
    Để SRF hoạt động chúng ta cần tạo 1 xung có độ rộng tối thiểu là 10us trên chân Trigger.
    Sau khi có ung được kích trên chân Trigger, SRF05 sẽ phát ra chuỗi 8 xung để phát sóng siêu âm.
    Sau kết thúc việc phát 8 xung, SRF05 sẽ kéo chân Echo lên mức cao. Chúng ta sẽ dựa vào thời gian tồn tại mức cao (Độ rộng xung mức cao) của chân Echo để tính khoảng cách.
    Nếu độ rộng xung mức cao nằm trong khoảng 100us-25ms thì nghĩa là có vật cản nằm trong phạm vi phát hiện của SRF05. Và khoảng cách từ cảm biến tới vật cản được tính theo công thức:
    Khoảng cách=(((Độ rộng mức cao(us))/58) (cm) =(((Độ rộng mức cao(us))/148 ) (inch).
    Nếu độ rộng xung mức cao lớn hơn hoặc bằng 300ms nghĩa là không có vật nằm trong phạm vi của cảm biến SRF05.

    *Phương pháp đo khoảng cách với 8051.
    Dựa vào tính chất độ rộng xung mức cao trên chân Echo có liên quan với khoảng cách từ cảm biến SRF05 đến vật, ta sẽ dùng vi điều khiển AT89S52 để đo độ rộng xung mức cao trên chân Echo.
    Ở đây mình sẽ sử dụng Timer để tính độ rộng xung mức cao trên chân Echo. Nghĩa là sau khi chân Echo được SRF05 kéo lên mức 1, mình sẽ cho Timer hoạt động, sau đó, khi chân Echo xuống mức 0, mình sẽ dừng Timer và từ giá trị đếm được trong thanh ghi TH và TL của Timer để tính ra khoảng cách.
    Việc kiểm tra trạng thái của chân Echo từ mức 0 -> 1 có thể thực hiện được bằng cách sử dụng lệnh: while(!Echo);
    Việc kiểm tra trạng thái của chân Echo từ 1->0 các bạn có thể dùng ngắt ngoài, hoặc dùng lệnh while(Echo);
    Mình khuyên các bạn nên sử dụng ngắt ngoài.
    Vậy để đo khoảng cách chúng ta sẽ sử dụng 1 Timer và một chân ngắt ngoài của Vi điều khiển 8051.
    Trước hết chúng ta cần khai báo sử dụng và cài đặt cho Timer và ngắt ngoài.
    Đoạn mã này mình xin gọi nó là chương trình con khởi tạo cho khởi tạo cho SRF05. Thực chất đây là đoạn chương trình khoi tao cho Timer và ngắt ngoài.
    Mã:
    void SRF05_Init(void)
    {
        TRIGGER=0;
        TMOD=0x01;  //timer 0 che do 1 (16bit) cuc GATE mo
        TR0=0;
        IT0=1;      //ngat ngoai 0 che do falling
        EX0=1;          //cho phep ngat ngoai 0
        EA=1;          // cho phep ngat toan cuc
        range_ok=0;
    }
    Chương trình con SRF05_Init(); sẽ được gọi 1 lần ngay từ đầu chương trình.
    Sau đó chúng ta sẽ gọi 1 chương trình con cho phép SRF05 hoạt động. Nội dung của chương trình con này là tạo 1 xung có độ rộng tối thiểu 10us trên chân Trigger. Sau đó đợi chân Echo được kéo lên mức cao và cho Timer và ngắt ngoài hoạt động.
    Mã:
    void  StartRange()
    {
        TRIGGER=1;
        delay_ms(12);        // Phai tao 1 xung len co do lon it nhat 10ms
        ECHO=1;                 
        delay_us(1);
        TRIGGER=0;       
        while(!(ECHO));        // Doi cho den khi chan ECHO duoc keo len cao
        TR0=IT0=EX0=EA=1;    // cho phep timer hoạt dong, cho phep ngat ngoai
    }
    
    Việc còn lại là vào chương trình con ngắt ngoài để đọc giá trị bộ Timer và tính khoảng cách.
    Mã:
    //ngat ngoai 0
    void ngatngoai0(void)interrupt 0
    {
        distance=TH0;
        distance<<=8;
        distance|=TL0;
        range=(float)distance*12;
        temp1=(58*11.0592);
        range=range/(temp1);
        TR0=IT0=EX0= 0;        // Ngung timer
        TL0=TH0=0;                  // Xoa du lieu trong thanh ghi Timer 0                   
        range_ok=1;
    }  
    Tần số bộ timer: Ftimer=11,0592/12.
    -->Chu ki bộ Timer: Ttimer=1/Ftimer=12/11.0592.
    --> Thời gian độ rộng xung mức cao chân Echo bằng giá trị trong thanh ghi TH, TL của của bộ timer nhân với chu kỳ của bộ timer: (distance*12)/11.0592.
    -->Khoảng cách tính theo cm: range=(distance*12)/(11.0592*58) (cm)

    Các bạn có thể download toàn bộ code mẫu ở cuỗi chương trình để tham khảo.
    Video đo khoảng cách bằng SRF05 trên Kit AT89S52 V1.

    Chúc các bạn thành công!

    Các file đính kèm:

    • SRF05.rar
      Kích thước:
      41.3 KB
      Đọc:
      44
  2. hieudetran

    hieudetran New Member

    Cảm ơn project của anh!nhờ anh mà em đã hoàn thành con mobile robot của mình!:) .code của anh build em hiểu gần hết,chỉ có 1 chỗ mà em chưa hiểu,mong anh chỉ giáo!
    distance=TH0;
    distance<<=8;
    distance|=TL0;
    đoạn code trên theo em biết là "số xung đếm được" được lấy ra từ 2 thanh ghi của bộ timer0.Thắc mắc của em là: giá trị lấy ra được ở dưới dạng hệ số 10 hay 16.nếu em muốn delay 1 câu lệnh với 1/10 giá trị trên thì có thể chia thẳng distance/10 được hay không?nếu chia Được như thể thì làm sao để nạp lại được vào 2 thanh ghi THx,TLx để delay?nếu Không,thì có cách nào để em làm được điều đó?mong nhận được sự giúp đỡ từ anh!em xin chân thành cảm ơn!
  3. Thiagao

    Thiagao New Member

    mà IDE e compilador? do you use in this kit?
    Qual IDE e compilador que você usar neste kit?
  4. Thiagao

    Thiagao New Member

    which ide and compiler do you use in this kit?
  5. giayinmavach

    giayinmavach New Member

    ô ngon. làm theo hướng dẫn 1 phát được luôn. hehe

Chia sẻ trang này

Lên trên