Thông báo

Collapse
No announcement yet.

mạch khống chế nhiệt độ hiển thị trên máy tính

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

  • mạch khống chế nhiệt độ hiển thị trên máy tính

    em đang làm về đề tài này.nhưng khi ra mạch thực tế thì lúc hiển thị trên máy tính thì nhiệt độ no cứ bị nhảy liên tục và nhiệt độ nhẩy lớn hơn 1 độ.nên em lâp topic này để mong mọi người góp ý và sửa hộ em với.thanhk mọi người.đây là mạch ocard + mạch nguyên lý và code của em.
    http://www.mediafire.com/?aqwgk167g8cfakt.

  • #2
    mình chưa xem code của bạn, nhưng mà khoảng bao lâu bạn update dữ liệu lên máy tính 1 lần. thử tăng time lên xem.


    Comment


    • #3
      bạn nói rõ hơn được ko?.ý bạn là tốc độ baud hay là tốc độ xử lý của ADC0804(xung cấp vào chân CLK IN và CLK R ) hay j vậy.cái này mình chưa tìm hiểu nhiều lắm.hix.thank!

      Comment


      • #4
        hixhix.ko ai giúp mình vậy.chán wa.

        Comment


        • #5
          Nguyên văn bởi daohong.haui Xem bài viết
          hixhix.ko ai giúp mình vậy.chán wa.
          Bạn xem lại datasheet của ADC0804 đi, trong đó có mạch dao dộng RC giữa 2 chân CLK R và CLK IN đấy.
          Công ty TNHH Tự Động Hóa Đạt Lân
          32/36, Ông Ích Khiêm, F14, Q11
          ĐT: 08.3974 7308 - 0937.197.001
          email:
          Webite:

          Comment


          • #6
            _ Bạn xem lại chân CLK IN có cung cấp xung cho nó không?
            _ Nếu có thì bạn xem lại tần số có đúng không (giá trị theo khuyến cáo của datasheet)
            _ Bạn kiểm tra chân out put của lm35 có đấu tụ lọc nhiễu không?
            _ Bạn kiểm tra lại điện áp nguồn cũng như điện áp VREF có ổn định không, có bị nhiễu không?
            Chúc vui!

            Comment


            • #7
              void bien_doi_adc()
              {
              adc_rd=0;
              adc_wr=0;
              delay(100);
              adc_wr=1;
              while(!adc_intr);
              dien_ap=P1;
              nhiet_do=dien_ap;
              // nhiet_do=P1;
              }
              void hien_thi(unsigned char nhiet_do) // hien thi nhiet do moi truong
              {

              chuc = nhiet_do/10;
              donvi = nhiet_do%10;




              chương trình của bạn viết bị sai
              bạn cần xem lại đoạn này.
              bạn chưa biến đổi mức điện áp thành nhiệt độ mà đã gán nhiet_do=dien_ap;
              đúng ra phải là nhiệt độ= điện áp*điện áp tham chiếu/255;
              chúc thành công!
              và có lẽ nên để chân ref/2 bỏ trống(điện áp tham chiếu=5v)

              Comment


              • #8
                hix.các chân CLK IN và CLK R mình mối với tụ 50pF và điện trở 10k rồi mà,chỉ có là chân out của LM35 chưa có tụ thội.mà có tụ thì lá giá trị bao nhiêu vậy bạn doanhatphong.
                cái này mình tìn trên mang thì trong sơ đồ ko thấy cố tụ mà.
                còn theo như bạn hatrongquy nói thì mình để điện áp vào chân VRFF/2(chân số 9 của ADC) là 1,28V nên ta có điện áp tham chiếu là 2,56V.mặt # dải nhiết độ cần đo là tư 0=>100.nên ta có nhiết độ ~điện áp còn gì.đấy là nhửng j mình biết.mong mọi người giúp đỡ với,sắp phải lộp đồ án rồi.thanks!

                Comment


                • #9
                  ừm! mình nghĩ là do bạn để điện áp tham chiếu và code thôi! vì theo mình là bạn để vref=1.28v nhưng chắc gì đã chính xác được 1.28v. Nó vẫn có sai số chứ! mà chỉ có 255 mức thôi (từ 0 đến 255). như vậy điện áp tính ra sẽ luôn là một số thực dạng 1,2345 gì gì đó. khi đó câu lệnh donvi=nhiệt độ%10; sẽ sai hay sao ấy và kết quả đo của bạn sẽ bị nhảy số liên tục ở hàng đơn vị. đại khái là mình nghĩ bạn cần dùng biến kiểu số thực và dùng các hàm trong math.h để xử lí.
                  mình cũng chỉ nêu quan điểm của mình thôi vì mình cũng mới làm xong đồ án vdk về voltmeter dùng adc0804 hiển thị trên led 7seg. cũng là dân HaUI cả thôi! hi!

                  Comment


                  • #10
                    "hatrongquy" bạnnois ro hơn dc ko?.cai này mình cũng chưa hiu lắm.cũng co thể đấy la chỗ sai của minh.ban cho minh nick dc ko.co j re ll.thank!

                    Comment


                    • #11
                      nick của mình lá f_rezo mình thấy thế này: lm35 của bạn chắc là lm35dz (nếu mua ở chợ trời mình cũng mua ở đó mà! hì) nên đầu ra sẽ là: 0*c->0mv, 100*c->100mv, mỗi độ tăng 10mv, vì vậy cần adc có độ phân giải <=10mv. Nếu bạn để vref/2=1,28 tức là độ phân giải 10mv thì sẽ có sai số đến hàng độ do adc0604 có sai số +-1bit. vì vậy nên bạn nên chọn vref/2 xuống thấp hơn ví dụ như 0.5v, khi đó độ phân giải sẽ là 3,9mv và đoạn code là
                      float nhiet_do;
                      unsigned int dien_ap;
                      unsigned int chuc, donvi, fanmuoi;
                      void bien_doi_adc()
                      {
                      adc_rd=0;
                      adc_wr=0;
                      delay(100);
                      adc_wr=1;
                      while(!adc_intr);
                      dien_ap=P1;
                      nhiet_do=dien_ap*100/255;//hinh như phép chia này ra kết quả là số thực, nhiệt độ là *c

                      }
                      void hien_thi(void)
                      {

                      chuc = nhiet_do/10;
                      donvi = floor(nhiet_do)-chuc*10;//mình dùng lệnh floor() này để làm tròn xuống;
                      fanmuoi=floor(nhiet_do*10)-chuc*100-donvi*10;//thêm phần thập phân nếu cần;
                      ...
                      bạn thử xem thế nào! chúc vui!

                      Comment


                      • #12
                        Nguyên văn bởi daohong.haui Xem bài viết
                        em đang làm về đề tài này.nhưng khi ra mạch thực tế thì lúc hiển thị trên máy tính thì nhiệt độ no cứ bị nhảy liên tục và nhiệt độ nhẩy lớn hơn 1 độ.nên em lâp topic này để mong mọi người góp ý và sửa hộ em với.thanhk mọi người.đây là mạch ocard + mạch nguyên lý và code của em.
                        http://www.mediafire.com/?aqwgk167g8cfakt.
                        1/
                        Code:
                        void bien_doi_adc()
                        {
                        adc_rd=0;
                        adc_wr=0;
                        delay(100);
                        adc_wr=1;
                        while(!adc_intr);
                        dien_ap=P1;
                        nhiet_do=dien_ap;
                        // nhiet_do=P1;
                        }
                        đoạn code này hình như có vấn đề.
                        delay(100); ...->dòng này không có ý nghĩa vì ADC vẫn chưa bắt đầu chuyển đổi.
                        adc_wr=1; ...-> đến dòng này ADC mới bắt đầu lấy mẫu và chuyển đổi.
                        while(!adc_intr); ...->lệnh này là chờ cho đến khi nào tín hiệu ở chân adc_intr =1, mà trong khi đó mức 1 là lúc adc chưa chuyển đổi xong, khi nó chuyển đổi data xong thì chân này về 0 chứ không phải 1. như vậy nó sẽ đọc về data của lần trước đó.

                        2/
                        như bạn hatrongqui đã viết, bạn nên hạ điện áp tham chiếu để tăng độ phân giải lên:
                        LM35 chỉ đo nhiệt độ đến 150°C, mà theo ứng dụng của bạn chỉ dùng 2 con số thì chỉ cần đến 99°C--> điện áp cao nhất là 99*10=990mV--> chọn Vref = 1V
                        3/
                        lấy giá trị trung bình để giảm nhiễu. với tần số 640kHz thì thời gian chuyển khoảng 100us (hoặc hơn tí), khá là nhanh nên bạn đọc về khoảng 10 lần (hoặc hơn nếu muốn) rồi lấy giá trị trung bình của 10 lần này sau đó mới tính toán để cho ra giá trị nhiệt độ.

                        -->
                        ※ giảm điện áp tham chiếu xuống còn 1V
                        ※ sửa lại code ở đoạn đọc data từ adc về
                        ※ thêm giải thuật lấy trị trung bình để giảm nhiễu.

                        Comment


                        • #13
                          adc_rd=0;
                          adc_wr=0;
                          delay(100);
                          adc_wr=1;
                          while(!adc_intr);
                          dien_ap=P1;
                          ý mình ở đoạn code này là từ luc ADC chưa hoạt động đến lúc no bắt đầu xuất giá trị ra VDK thì tạo 1 khỏng chễ,"delay(100)"trễ này có thể để nho đi mà nên lệnh này ko sai.
                          chỉ có là thêm giai thuật để tinhd gtri BT thì mình thiếu.còn điện áp tham chiếu thì mình cũng đã hạ nhưng nhiệt độ nhẩy của mình vẫn không giảm dáng kể khoảng ±2 độ.hixhix.thank moi ng

                          Comment


                          • #14
                            bạn lập trình okie, chú ý quân tâm đến Vref, cái này quan trọng nhất nếu muốn chính xác... ( khuyến khích sử dụng Pic), làm 89 mệt lắm bạn ơi
                            Be quan. Plz contact through email:

                            Comment


                            • #15
                              Nguyên văn bởi daohong.haui Xem bài viết
                              adc_rd=0;
                              adc_wr=0;
                              delay(100);
                              adc_wr=1;
                              while(!adc_intr);
                              dien_ap=P1;
                              ý mình ở đoạn code này là từ luc ADC chưa hoạt động đến lúc no bắt đầu xuất giá trị ra VDK thì tạo 1 khỏng chễ,"delay(100)"trễ này có thể để nho đi mà nên lệnh này ko sai.
                              chỉ có là thêm giai thuật để tinhd gtri BT thì mình thiếu.còn điện áp tham chiếu thì mình cũng đã hạ nhưng nhiệt độ nhẩy của mình vẫn không giảm dáng kể khoảng ±2 độ.hixhix.thank moi ng
                              hi.. thì ctr bạn vẫn chạy được mà, chỉ có là nó hiển thị ko đúng thôi..
                              Mà nếu là sai số tới ±2 thì mạch không sử dụng được rồi. Kiểm tra từ phần nguồn.., tìm bộ nguồn nào đó ổn định tí, các tụ lọc nguồn và chống nhiễu cho 89 ADC và LM35.. tiếp nữa là đường mạch từ LM35 đến ADC đã được bọc GND chưa, nó có đi cạnh đường tín hiệu số hay xung nào hay ko... thử các phương pháp chống nhiễu xem có hiệu quả gì ko.

                              code dùng delay:
                              adc_wr=0;
                              nop;
                              adc_wr=1;
                              delay(100);
                              dien_ap=P1;

                              //hàm delay chỉ cần khoảng 120us, nhưng với hàm delay của bạn thì dòng delay(100) nó có thể lên đến vài trăm us.

                              code dùng cách kiểm tra chân ngắt
                              adc_wr=0;
                              adc_wr=1;
                              while(adc_intr);
                              adc_rd=0;
                              delay(5);
                              dien_ap=P1;
                              adc_rd=1;
                              nhiet_do=dien_ap;

                              Comment

                              Về tác giả

                              Collapse

                              daohong.haui Tìm hiểu thêm về daohong.haui

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

                              Collapse

                              Đang tải...
                              X