Thông báo

Collapse
No announcement yet.

1 hướng giải quyết khi làm việc với DS18B20

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 1 hướng giải quyết khi làm việc với DS18B20

    Hôm trước trên yaho! chat có bác hỏi mình vừa ý là để mình thử thao tác với con cảm biến nhiệt độ 1 dây DS18b20 vừa là để đánh đố xem mình sẽ điều khiển nó ra sao để khỏi bị hiện tượng rung giật gì đó. "Rảnh rỗi sinh nông nổi" thừa thời gian thì cũng muốn thử xem sao, thế là lao vào. Bác ý có gợi ý qua đọc thông tin của con đó tốn rất nhiều ms chú làm thế nào đọc thông tin và hiển thị ra LED 7 đoạn "ý là không bị giật", vì khi đọc thông tin của DS18B20 thấy thiên hạ đồn phải tránh để chuơng trình bị ngắt nếu không đọc thông tin sẽ bị sai, mà mình lập trình thì chỉ quen mỗi cái trò dùng timer để quét, nếu không cho dùng ngắt thì coi như chặt tay mình . Dạo trên LED thì cũng có khá nhiều thông tin và dự án về con này "dạng open source" mình cũng lấy về xem, và quả là họ toàn phải disable interrupt rồi mới tiến hành đọc thông tin từ DS18, do vậy hầu hết người ta khuyên nên dùng LCD hoặc dùng IC chốt dữ liệu để tránh bị giật khi hiển thị, và 1 điều mình vô cùng ghét đó là chuơng trình của họ tiêu tốn rất nhiều CPU load(tiêu tốn năng lực xử lý của CPU máy tính nhưng cũng chính là VSL đang chạy với tốc độ rất "xót ruột"). Tìm datasheet của DS18 thì nắm được 1 thông tin vô cùng thú vị:
    Click image for larger version

Name:	Ds18b20.jpg
Views:	1
Size:	48.0 KB
ID:	1418739
    vậy ra đây chính là lý do bị tiêu tốn rất nhiều thời gian đối với DS18 đó là do thời gian chuyển đổi từ giá trị nhiệt độ sang dạng số hóa của DS18 rất cao, với chế độ 9bit thì mất khoảng "93.75ms" với chế độ 12bit thì mất gần 1s ~=750ms. Thảo nào thấy nhiều code khi bắt đầu chạy 1 cái là họ config ngay cho DS18 chạy ở chế độ 9 bit. Có điều nắm được thông tin này thì đối với mình thì đã bắt đầu manh nha nghĩ ra cách để khắc phục tình trạng trễ.
    Do thời gian chuyển đổi là lớn nhất nên làm thế nào đó chia việc đọc DS18 thành 2 công đoạn 1 công đoạn là chỉ đặt DS18 ở trạng thái convert sau đó ta chuyển sang làm việc khác, sau 1 khoảng thời gian nhất định nào đó thì mình quay lại đọc tiếp, lúc này mới là đọc giá trị nhiệt độ. Hoặc sẽ dựa và DQ vì thấy datasheet bảo rằng trong quá trình convert DQ=0 khi convert hoàn thành thì DQ=1 vậy là có thể dùng chính DQ để tạo ra 1 cái ngắt ngoài cho chuơng trình của mình vậy là cơ bản mình đã có thể loại bỏ đựoc việc đợi DS18 convert dứoi đây mình có đính kèm project bằng mô phỏng để mọi người cùng tham khảo và góp ý. Do cách đọc làm 1 phase mình đã thử và làm việc cũng khá ok có điều lỡ xóa mất rồi, giờ chỉ còn cách dùng ngắt ngoài còn hàm đọc theo kiểu 2 phase thì mình có để lại đó nhưng không có code sử dụng cách đó, nếu ai đó cần thì mình có thể demo lại cho.
    đây là hình mô phỏng của em nó với cpu Load ~=20% khá nhẹ mà hình như do máy tính đang chạy ở chế độ tiết kiệm điện nên chip chạy tốc độ thấp -> CPU load còn hơi cao
    Click image for larger version

Name:	demo.jpg
Views:	1
Size:	108.4 KB
ID:	1418740
    Click image for larger version

Name:	temp.jpg
Views:	1
Size:	35.0 KB
ID:	1418741
    Đèn LED mình đặt ở đây để theo dõi quá trình đọc nhiệt độ. Mà cái này còn mắc mớ cái phần nhiệt độ âm, nếu ai đó có làm mạch thí nghiệm với cách này thì có thể đưa thắc mắc lên đây để tìm hướng giải quyết nhé do mình ko có điều kiện làm mạch thực nên chỉ mô phỏng chay đựoc đến vậy thôi.

  • #2
    Plus thêm là có thể đọc nhiệt độ thực với mẫu như "12,1*c" do mình dùng hàm sprintf để tạo chuỗi định dạng có điều ở 1 số mức nhiệt độ chắc do phạm vi số thực của 89xx hoặc có thể là do /16.0 không phải là số chia hợp lý nên khi cảm biến báo x.1 thì ở trên LED 7 đoạn lại hiển thị là x.2 x không phải là tất cả các giá trị nhiệt độ chỉ là 1 số giá trị.Click image for larger version

Name:	show.jpg
Views:	1
Size:	106.7 KB
ID:	1385528

    Comment


    • #3
      Full code đọc nhiệt độ cho DS18B20

      Giờ thì dự án này đã hoàn thành "trong khuôn khổ mô phỏng" nhưng mình tin chắc ra mạch thực tế cũng chạy rất ok, nếu có bạn nào có cơ hội làm mạch thực tế về DS18B20 thì chắc là có thể dùng code này để đọc nhiệt độ rồi. Mong rằng sẽ phần nào tạo ra được 1 hướng tư duy mới trong cách lập trình của mọi người.
      Attached Files

      Comment


      • #4
        rất cảm ơn bạn. Tuy nhiên cái này nhiều người làm được rồi bạn ơi. Chỉ có điều họ không đưa lên trên đây một cách toàn vẹn, chỉ có khung thực hiện thôi.
        chỉ có tâm hồn là nơi duy nhất: có thể biến thiên đường thành địa ngục và ngược lại có thể biến địa ngục hóa thiên đường
        Everything should be made as simple as possible, but not simpler

        Comment


        • #5
          Nguyên văn bởi daohuytien Xem bài viết
          rất cảm ơn bạn. Tuy nhiên cái này nhiều người làm được rồi bạn ơi. Chỉ có điều họ không đưa lên trên đây một cách toàn vẹn, chỉ có khung thực hiện thôi.
          Ý bác là họ đã đọc được thông tin nhiệt độ từ DS18B20 và quét nó lên LED hay dùng phương pháp đọc bằng ngắt ngoài? Bởi vì em thấy mọi người đọc theo kiểu cứ đợi cho đến khi nào có kết quả thì lấy kết quả về mà không để ý nó hoàn toàn có thể biến thành 1 ngắt để chương trình của mình không phải đợi cho nó chuyển đổi dữ liệu xong sau đó mới tiến hành đọc kết quả.

          Comment


          • #6
            Nguyên văn bởi myth-coder Xem bài viết
            Ý bác là họ đã đọc được thông tin nhiệt độ từ DS18B20 và quét nó lên LED hay dùng phương pháp đọc bằng ngắt ngoài? Bởi vì em thấy mọi người đọc theo kiểu cứ đợi cho đến khi nào có kết quả thì lấy kết quả về mà không để ý nó hoàn toàn có thể biến thành 1 ngắt để chương trình của mình không phải đợi cho nó chuyển đổi dữ liệu xong sau đó mới tiến hành đọc kết quả.
            bạn ơi cho mình hỏi cái này có vẻ cũng ko liên quan lắm, nhưng mihf nghĩ bạn biết câu trả lời

            Mình tham khảo 1 số tài lệu thấy có ghi
            - DS18B20: Độ phân giải khi đo nhiệt độ là 9->12 bit. Vậy độ phân giải 9 bit là sao ạ? theo như trên bài của bạn nó đặc trưng cho thời gian chuyển đổi từ giá trị nhiệt độ sang dạng số hóa đúng không ạ?

            -Cách kết nối DS18B20 với vđk


            Cách 1: cách này ít dùng
            Click image for larger version

Name:	tải xuống.png
Views:	1
Size:	13.6 KB
ID:	1387431
            Cách 2: cách này hay dùng nhất.
            Click image for larger version

Name:	tải xuống (1).png
Views:	1
Size:	12.5 KB
ID:	1387432
            Cách 3: cách này cũng ít dùng
            Click image for larger version

Name:	tải xuống (2).png
Views:	1
Size:	22.7 KB
ID:	1387433

            -->tại sao cách 2 lại hay đươc dùng nhất ạ, nó có những ưu điểm gì. 2 cách còn lại tại sao lại ít được sử dụng ạ. Thanks bạn.

            Comment


            • #7
              Cái độ phân giải nhiệt thì bạn cứ hiểu như nhạc 32kbits với nhạc 48kbits ấy, độ phân giải cao hơn thì độ chính xác sẽ cao hơn. Còn vấn đề thứ 2 bạn hỏi thì mình xin phép không trả lời vì mình không phải bên phần cứng, thực sự là mình cũng không biết đâu vì mình thấy mọi người mắc 18b20 thế nào thì mình mắc thế, quan trọng là mình tìm giải thuật để đọc nó tối ưu thôi.

              Comment


              • #8
                Nguyên văn bởi shimira Xem bài viết
                bạn ơi cho mình hỏi cái này có vẻ cũng ko liên quan lắm, nhưng mihf nghĩ bạn biết câu trả lời

                Mình tham khảo 1 số tài lệu thấy có ghi
                - DS18B20: Độ phân giải khi đo nhiệt độ là 9->12 bit. Vậy độ phân giải 9 bit là sao ạ? theo như trên bài của bạn nó đặc trưng cho thời gian chuyển đổi từ giá trị nhiệt độ sang dạng số hóa đúng không ạ?

                -Cách kết nối DS18B20 với vđk


                Cách 1: cách này ít dùng
                [ATTACH=CONFIG]76716[/ATTACH]
                Cách 2: cách này hay dùng nhất.
                [ATTACH=CONFIG]76717[/ATTACH]
                Cách 3: cách này cũng ít dùng
                [ATTACH=CONFIG]76718[/ATTACH]

                -->tại sao cách 2 lại hay đươc dùng nhất ạ, nó có những ưu điểm gì. 2 cách còn lại tại sao lại ít được sử dụng ạ. Thanks bạn.
                độ phân giải 9bits thì tương ứng độ thay đổi nhiệt độ là 0.5 độC/bit.
                độ phân giải 12bits thì tương ứng độ thay đổi nhiệt độ là 0.0625 độC/bit.
                Hình thứ 3 ko phải cách mắc mà là mô tả cách thiết lập phần cứng khi giao tiếp.
                Chỉ có 1 và 2 là cách mắc. Cách mắc thứ 2 dùng nhiều là vì người mới tiếp cận chưa hiểu nhiều về nguồn kí sinh của cách mắc thứ 1 nên họ mới dùng cách mắc thứ 2 từ đó cách mắc thứ 2 mới đc dùng nhiều thế thôi.

                Comment


                • #9
                  Nguyên văn bởi chung1608 Xem bài viết
                  độ phân giải 9bits thì tương ứng độ thay đổi nhiệt độ là 0.5 độC/bit.
                  độ phân giải 12bits thì tương ứng độ thay đổi nhiệt độ là 0.0625 độC/bit.
                  Hình thứ 3 ko phải cách mắc mà là mô tả cách thiết lập phần cứng khi giao tiếp.
                  Chỉ có 1 và 2 là cách mắc. Cách mắc thứ 2 dùng nhiều là vì người mới tiếp cận chưa hiểu nhiều về nguồn kí sinh của cách mắc thứ 1 nên họ mới dùng cách mắc thứ 2 từ đó cách mắc thứ 2 mới đc dùng nhiều thế thôi.
                  vậy cách 2 có gì tối ưu hơn cách 1 không bạn? tại sao dùng cách 2 lại không cần hiểu nhiều về nguồn kí sinh?
                  mà "nguồn kí sinh" là thế nào vậy ạ, bạn có thể cho mình xin các tài liệu liên quan đến 2 cách mắc này không. Thanks

                  Comment


                  • #10
                    Nguyên văn bởi shimira Xem bài viết
                    vậy cách 2 có gì tối ưu hơn cách 1 không bạn? tại sao dùng cách 2 lại không cần hiểu nhiều về nguồn kí sinh?
                    mà "nguồn kí sinh" là thế nào vậy ạ, bạn có thể cho mình xin các tài liệu liên quan đến 2 cách mắc này không. Thanks
                    Thật ra thì cách mắc 1 có ưu điểm là đỡ tốn thêm một dây nguồn dương nhưng phức tạp ở chỗ phải có thêm một transistor kéo nguồn + giải thuật phải có thêm khâu đóng cắt transistor này vì khi chuyển đổi nhiệt độ, cảm biến cần dòng lớn hơn, qua điện trở kéo lên nguồn dương (5k) khi kéo dòng lớn sẽ gây sụt áp phần lớn trên trở, cảm biến không còn đủ áp để hoạt động. nhưng khi ở chế độ truyền nhận dữ liệu, không thể nối trực tiếp đường truyền này lên nguồn mà không qua trở kéo. do vậy, vdk phải nhận thêm chức năng kéo nguồn thông qua transistor cho cảm biến khi cần thiết. từ đó, trong suốt quá trình chuyển đổi nhiệt độ, ta không thể giao tiếp gì với cảm biến.
                    cách thứ hai cấp nguồn trực tiếp nên loại được những rắc rối và phức tạp trên nhưng phải tốn thêm một dây nguồn dương. cách này đơn giản, phù hợp với người mới bắt đầu và hệ thống không phức tạp nên được dùng nhiều
                    nguồn cấp cho cảm biến trong cách 1 gọi là nguồn ký sinh vì khi dùng chế độ nguồn này, bên trong cảm biến có một tụ điện lưu trữ điện. tụ được nạp khi đường truyền ở mức cao (có điện, một phần điện này trích nạp cho tụ). khi đường truyền xuống thấp, tụ phóng điện cấp cho cảm biến hoạt động. tuy nhiên, trong quá trình chuyển đổi nhiệt độ, tụ không thể cấp đủ nguồn cho cảm biến nên vdk mới phải nhận thêm nhiệm vụ kéo dòng cho nó bằng cách kích mở transistor nối từ nguồn dơng xuống đường truyền.

                    Comment

                    Về tác giả

                    Collapse

                    myth-coder Tìm hiểu thêm về myth-coder

                    Bài viết mới nhất

                    Collapse

                    Đang tải...
                    X