Thông báo

Collapse
No announcement yet.

bộ đếm dùng PIC ??

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

  • bộ đếm dùng PIC ??

    Gởi lời chào thân ái tới tất cả các anh em trên diễn đàn. Tôi muốn ứng dụng PIC vào bộ đếm được không ?? Yêu cầu bài toán :
    - mạch hiển thị khoảng thời gian giữa 2 xung start và stop, dùng LED 7 thanh [0,000] (s) (1/1000s).
    - mạch thời gian dùng dao động thạch anh chuẩn như 4MHz, ..
    Tôi vẫn dùng IC rời (quá nhiều) nên mong muốn anh em chỉ giùm ứng dụng PIC vào mạch này. Mạch cũ dùng dao động thạch anh 4MHz, qua bộ chia 4 và chia 10 (3 bộ chia nối tiếp để lấy 1/1000s), rồi qua cổng có điều khiển đóng/mỏ nhờ xung start/stop và ra bộ giải mã BCD/hiển thị LED 7 thanh.
    Cảm ơn anh em trước nhiều nhiều. email: eizo@inmail24.com

  • #2
    Nguyên văn bởi eizo
    Gởi lời chào thân ái tới tất cả các anh em trên diễn đàn. Tôi muốn ứng dụng PIC vào bộ đếm được không ?? Yêu cầu bài toán :
    - mạch hiển thị khoảng thời gian giữa 2 xung start và stop, dùng LED 7 thanh [0,000] (s) (1/1000s).
    - mạch thời gian dùng dao động thạch anh chuẩn như 4MHz, ..
    Tôi vẫn dùng IC rời (quá nhiều) nên mong muốn anh em chỉ giùm ứng dụng PIC vào mạch này. Mạch cũ dùng dao động thạch anh 4MHz, qua bộ chia 4 và chia 10 (3 bộ chia nối tiếp để lấy 1/1000s), rồi qua cổng có điều khiển đóng/mỏ nhờ xung start/stop và ra bộ giải mã BCD/hiển thị LED 7 thanh.
    Cảm ơn anh em trước nhiều nhiều. email: eizo@inmail24.com
    Anh có thể vẽ giản đồ xung lên đc ko, như thế sẽ dễ hơn về bài toán, một xung theo sườn hay nhiều xung?....
    Có 2 cách design:
    Cách 1: dùng ngắt ngoài(hoặc onchange) để phát hiện thời điểm đọc timer hoặc reset timer
    Cách 2: dùng capture trong PIC(dùng prescale lối vào timer tương đối lớn)
    Dùng PIC hoàn toàn có thể làm tốt việc này

    Comment


    • #3
      Rất cảm ơn em về câu trả lời ngay. Thấy anh em trên FR khen trình độ của em lắm. Mạch cũ của anh dùng để đếm khoảng thời gian giữa 2 cảm biến hồng ngoại khi có 1 vật đi qua, độ phân giải 1/1000 (s) hoặc 1/100 (s) tùy chọn từ 1 công tắc bên ngoài.
      Xung nhịp 1ms hoặc 10ms sẽ qua cổng 4011 khi có xung START mở cổng -> đến đầu CLK của bộ đếm 4518 -> qua bộ giải mã BCD/hiển thị -> LED 7 thanh, và bộ đếm dừng đếm khi có xung STOP đóng cổng 4011.
      Trước khi đếm lần tiếp theo, ấn nút RESET xóa bộ đếm 4518.
      Anh gửi kèm giản đồ xung để em tham khảo.
      Chú thích: IR unit = cảm biến thu/phát hồng ngoại
      Anh mới đọc 1 số bài về PIC nên rất khó thiết kế được mạch và viết prog phù hợp. Nếu có thể khi nào rảnh, em hướng dẫn giúp anh thiết kế và viết code được k ? Mạch này anh vẫn dùng trong dạy học để đo time rơi của vật rơi tự do từ điểm A -> B (tại A và B đặt 2 cảm biến IR).

      Comment


      • #4
        Admin cho hỏi muốn attach 1 file trong bài viết thì làm ntn nhi ? (Tôi muốn đính kèm file *.gif có vẽ giản đồ xung) Cảm ơn rất nhiều ..

        Comment


        • #5
          http://dientuvietnam.net/board/showt...1482#post11482
          Bạn xem thao tác post bài kèm ảnh tại đó

          Comment


          • #6
            giản đồ xung (bộ đếm dùng PIC ??)

            Cảm ơn Admin đã chỉ dẫn.. Phía dưới giản đồ có viết lưu đồ diễn giải đơn giản nguyên lý của mạch đếm (đã thiết kế dùng IC số rời rạc và đang dùng) !!

            Comment


            • #7
              tôi có tìm trên Net 1 số bài về đếm dùng PIC. VD :http://www.qsl.net/dl4yhf/freq_count...q_counter.html
              Mạch này cho phép đếm freg từ bên ngoài. Mà tôi cần phép đo khác. Mong anh em trên FR chỉ giáo cho. Cảm ơn nhiều !!
              Mà có thể mạo muội đưa ra ý kiến này. Anh em nào có thể cộng tác cùng tôi design mạch này vì tôi muốn cải tiến mạch cũ, để nâng cao độ tin cậy trong sử dụng..

              Comment


              • #8
                PIC có bộ chia trước(prescale) nên có thể đếm được tần số đến 50Mhz.Khi thiết kế nên chú ý tới nó để mở rộng dải đếm.
                Về phần đầu vào nên dùng JFET để có trở kháng vào lớn.
                Cũ người mới ta!

                Comment


                • #9
                  Nguyên văn bởi phanbobo
                  PIC có bộ chia trước(prescale) nên có thể đếm được tần số đến 50Mhz.Khi thiết kế nên chú ý tới nó để mở rộng dải đếm.
                  Về phần đầu vào nên dùng JFET để có trở kháng vào lớn.
                  Hihi... chưa tìm thấy một lời giải ở đây.

                  Nếu như không nhầm thì yêu cầu bài toán đo thời gian giữa 2 sự kiện. Theo em,đây là phương án tối ưu nhất.

                  Do thời gian có thể kéo dài 9s, yêu cầu bài toán chính xác 1ms.

                  Vậy anh dùng ngắt onchange để xác định thời điểm start và stop(nối 2 trong 4 chân RB4..RB7)

                  Dùng timer 16 bit để đếm thời gian(giar sử timer1), i là số lần tràn timer.

                  Khởi tạo:
                  T1 có prescale=1;//clkt1=5mhz để tăngđộ chính xác.
                  Cho phép ngắt T1;
                  Cho phep ngắt onchange;

                  Ngắt start:
                  TMR1L=0;
                  TMR1H=0;//nạp giá trị ban đầu cho T1
                  TMR1ON=1;//chạy T1
                  i=0;

                  Ngắt stop:
                  TMR1ON=0;//Dừng bộ T1
                  T=i*65536+(65536-(TMR1H*256+TMR1L));//Tổng số xung tần số 5mhz.
                  T=(T*0.2)\1000 ms;//Có thể dùng làm tròn để tăng độ chinh xác
                  i=0;

                  Ngắt T1:
                  i++;

                  //Chú ý:viết chương trình thì có thêm một số lệnh như xóa cờ ngắt, xác định vector ngắt....

                  Comment


                  • #10
                    Anh nhầm với mạch đo tần số!
                    Cũ người mới ta!

                    Comment


                    • #11
                      Chương trình 3T viết ở trên có thể xảy ra trường hợp(cho dù xác suất xảy ra ít) sai số tới 65536*0.2uS khoảng 10ms.

                      Comment


                      • #12
                        Rất cảm ơn anh em trên FR vì ý kiến đóng góp. Tôi sẽ thử làm và sẽ hỏi thêm. Thanks again for help !!

                        Comment


                        • #13
                          Nguyên văn bởi BinhAnh
                          Chương trình 3T viết ở trên có thể xảy ra trường hợp(cho dù xác suất xảy ra ít) sai số tới 65536*0.2uS khoảng 10ms.
                          Anh nói có vẻ huyền bí quá, em debug mã mà không tìm ra trường hợp đó. Em nghĩ nếu có sai thì chỉ sai số khoảng vài chục uS là cùng, vì mình có thể bù bằng phần mềm nên chỉ khoảng tối đa chục uS(50 chu kỳ lệnh). Trong khi yêu cầu bài toán sai số cỡ 0.5ms. Như vậy cách giải của em quá đạt yêu cầu(sai số 0.01ms).
                          Trường hợp đặc biệt có thể dẫn tới sai số quá lớn như anh nói(10ms)thì em ko thấy xảy ra ở đâu cả.
                          Hihi... nghe nói anh sắp mở lớp dạy PIC, nếu anh sai thì anh cho em học miễn phí nhé...hihi...
                          Các anh, ai ủng hộ em?

                          Comment


                          • #14
                            Nguyên văn bởi thaithutrang
                            Anh nói có vẻ huyền bí quá, em debug mã mà không tìm ra trường hợp đó. Em nghĩ nếu có sai thì chỉ sai số khoảng vài chục uS là cùng, vì mình có thể bù bằng phần mềm nên chỉ khoảng tối đa chục uS(50 chu kỳ lệnh). Trong khi yêu cầu bài toán sai số cỡ 0.5ms. Như vậy cách giải của em quá đạt yêu cầu(sai số 0.01ms).
                            Trường hợp đặc biệt có thể dẫn tới sai số quá lớn như anh nói(10ms)thì em ko thấy xảy ra ở đâu cả.
                            Hihi... nghe nói anh sắp mở lớp dạy PIC, nếu anh sai thì anh cho em học miễn phí nhé...hihi...
                            Các anh, ai ủng hộ em?
                            Anh vừa ủng hộ vừa không ủng hộ.
                            lý do là vì nếu như em đặt mức ưu tiên ngắt T1> ngắt Stop thì okie, không vấn đề gì. Nhưng nếu ngược lại thì xảy ra trường hợp đang vào ngắt T1 (chưa kịp tăng i) thì xuất hiện ngắt Stop và do đó kết quả tính toán bị thiếu mất một giá trị của i, --> sai số 10ms như anh BA nói.

                            Một giải pháp khác cho bài toán này đó là sử dụng PSoC, kết quả còn hơn cả mong đợi, độ chính xác nhỏ hơn 10us (không tính sai số ở thiết bị ngoài như tốc độ cảm nhận của IR...). tuy nhiên phải biết cấu hình phần cứng cho phù hợp.
                            Sử dụng một Counter24 hoặc Counter32 là vô tư rồi. Chân Start sẽ mở cho counter chạy còn chân Stop thì ngắt Counter. Nhân tiện đọc giá trị counter trong ngắt Stop luôn.
                            AFH

                            Comment


                            • #15
                              Nguyên văn bởi thaithutrang
                              Ngắt stop:
                              TMR1ON=0;//Dừng bộ T1
                              T=i*65536+(65536-(TMR1H*256+TMR1L));//Tổng số xung tần số 5mhz.
                              T=(T*0.2)\1000 ms;//Có thể dùng làm tròn để tăng độ chinh xác
                              i=0;
                              //Chú ý:viết chương trình thì có thêm một số lệnh như xóa cờ ngắt, xác định vector ngắt....
                              Khi vào ngắt stop, đúng lúc đó T1 tràn, PIC phải thực hiện hết phần ngắt stop nên đã bỏ qua khoảng 65536 xung(đáng lẽ i phải tăng lên 1 đon vị).

                              Như anh đã nói, đây là lỗ hổng trong lập trình, do mình chạy thực tế khó tìm thấy lỗi bởi nó hiếm khi xảy ra khi test.
                              Em chỉ cần thêm vài dòng lệnh như sau ở ngắt stop:
                              Ngắt stop:
                              TMR1ON=0;//Dừng bộ T1
                              if(TMR1IF)
                              {
                              TMR1IF=0;
                              i++;
                              }

                              T=i*65536+(65536-(TMR1H*256+TMR1L));//Tổng số xung tần số 5mhz.
                              T=(T*0.2)\1000 ms;//Có thể dùng làm tròn để tăng độ chinh xác
                              i=0;

                              (PIC16 thông dụng thì việc ưu tiên ngắt trong ngắt không thực hiện bằng phần cứng của PIC, dòng PIC18 trở lên mới có chế độ ưu tiên ngắt bằng phần cứng của nó, bài toán này giải với PIC16 thông dụng?. Tóm lại, 3T thua cuộc rồi... he he..., nhưng vẫn hoan nghênh 3T đến tham gia lớp PIC)

                              Comment

                              Về tác giả

                              Collapse

                              eizo Tìm hiểu thêm về eizo

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

                              Collapse

                              Đang tải...
                              X