Thông báo

Collapse
No announcement yet.

PIC đo tần số: Lý do sai số 2.4%.

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

  • PIC đo tần số: Lý do sai số 2.4%.

    Như trên tiêu đề, em làm mạch đo tần số dùng PIC. Nhưng mô phỏng đo tần số 1000Hz = 1kHz (dùng bộ tạo xung chuẩn của protues) nó lại ra kết quả là 1024Hz. E ko hiểu được lý do tại sao lại như vậy nữa , nên nhờ các bác xem giúp chỉ cho nguyên nhân.
    Code đây ah:
    PIC - do toc do dong co.rar
    Cảm ơn các bác.
    Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
    http://diencongnghiep360.com/
    http://tudienhathe.vn/


  • #2
    viết bằng C thì cái chuyện sai số là bình thường, muốn tăng độ chính xác bạn phải xem mã hợp dịch do ccs tạo ra sau đó tính toán các các chu kì cộng thêm, rồi phải bù trừ cho mấy cái thời gian này
    ví dụ như
    set_timer0(6); // Dat lai gia tri cua timer 0
    lúc này timer0 đã bắt đầu đếm
    count=0; // Dua count ve 0
    bcf count
    bcf count+1 mất 2 lệnh
    setup_timer_1(T1_EXTERNAL|T1_CLK_OUT); // Bat timer 1 de bat dau dem tiep
    ....
    và hình như bên css
    If(count >=2000)
    đúng : mất 2 chu kì
    sai: mất 3 chu kì thì phải, mình cũng không nhớ rõ lắm.
    Như vậy là thời gian đếm thực sự là lớn hơn giá trị bạn dự tính có nghĩa là số xung đếm được sẽ nhiều hơn mong đợi. Muốn tính toán chính xác thì bạn nên viết bằng asm còn không phải xem mã biên dịch của ccs với lại cách bỗ trí các lệnh của bạn.

    Comment


    • #3
      đo tần số muốn chính xác ở tần số cao phải tính toán kĩ từng dòng lệnh làm mất bao lâu, thạch anh cũng phải chọn cho thời gian chẵn. Bạn chọn 16Mhz là bị lẻ so với cách tính tần số trong 1 giây. Hơn nữa mỗi lần ngắt timer0 bạn ko nạp lại cho timer dẫn tới timer0 ngắt sau 512uS.

      Comment


      • #4
        Đếm sai thường do tính toán sai thời gian lấy mẫu.
        Đừng có nghĩ là timer thì chính xác hơn delay thông thường. Nếu tính toán sai thì timer còn sai số nhiều hơn. Sai 24Hz tức là thời gian lấy mẫu đã kéo dài hơn 24ms. Sai số này rất lớn, timer nếu chạy ở 8 bit mà tính thời gian thì chỉ cần sai 1 chu kì máy thì đã gây sai số rất lớn khi delay thời gian dài.

        Comment


        • #5
          Nguyên văn bởi youaremylife Xem bài viết
          viết bằng C thì cái chuyện sai số là bình thường, muốn tăng độ chính xác bạn phải xem mã hợp dịch do ccs tạo ra sau đó tính toán các các chu kì cộng thêm, rồi phải bù trừ cho mấy cái thời gian này
          ví dụ như
          set_timer0(6); // Dat lai gia tri cua timer 0
          lúc này timer0 đã bắt đầu đếm
          count=0; // Dua count ve 0
          bcf count
          bcf count+1 mất 2 lệnh
          setup_timer_1(T1_EXTERNAL|T1_CLK_OUT); // Bat timer 1 de bat dau dem tiep
          ....
          và hình như bên css
          If(count >=2000)
          đúng : mất 2 chu kì
          sai: mất 3 chu kì thì phải, mình cũng không nhớ rõ lắm.
          Như vậy là thời gian đếm thực sự là lớn hơn giá trị bạn dự tính có nghĩa là số xung đếm được sẽ nhiều hơn mong đợi. Muốn tính toán chính xác thì bạn nên viết bằng asm còn không phải xem mã biên dịch của ccs với lại cách bỗ trí các lệnh của bạn.
          uhm. Nhưng mình dùng thạch anh 16Mhz nên thời gian thực hiện các lệnh là rất nhanh(so với tần số mình cần đo là 1Khz). Việc bố trí dòng lệnh thì mình cũng đã cố gắng sao cho hợp lý nhất rồi (theo mình). MÌnh cũng dùng C nhưng nếu viết trên KeilC cho 8051 thì sai số chỉ nhỏ hơn 1% mà thôi.MOng bạn và mọi người cho thêm ý kiến.

          Nguyên văn bởi chung1608 Xem bài viết
          đo tần số muốn chính xác ở tần số cao phải tính toán kĩ từng dòng lệnh làm mất bao lâu, thạch anh cũng phải chọn cho thời gian chẵn. Bạn chọn 16Mhz là bị lẻ so với cách tính tần số trong 1 giây. Hơn nữa mỗi lần ngắt timer0 bạn ko nạp lại cho timer dẫn tới timer0 ngắt sau 512uS.
          Mình chọn thạch anh 16Mhz, rồi khi tạo timer đã chia 8 để tạo xung cho timer là 2Mhz. Khi đó nếu set timer khởi tạo bằng 6 thì mình nghĩ thời gian là đúng 1s mà bác. uhm. Sau mỗi lần ngắt mình ko cho nạp lại timer, chỉ đủ 1 giây thì mới nạp lại.hihi. M đã sửa lại cái này, và đã giảm sai số xuống còn ~ 1.2%. Kết quả này vẫn lớn hơn so với dùng KeilC. MOng bác góp ý thêm, sao cho sai số xuống còn <1% thì mới đảm bảo đúng thông số.
          Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
          http://diencongnghiep360.com/
          http://tudienhathe.vn/

          Comment


          • #6
            bạn làm mạch thật coi chạy sao chứ mô phỏng chưa chắc. mình làm đo chính xác đến 24 mhz ( tối đa 27 mhz- hơn nữa là ko đo được)
            16f877A dùng thạch anh 20mhz, timer1 chế độ xung ngoài , prescaler 8:1
            Setup_Timer_1(T1_EXTERNAL|T1_DIV_BY_8);
            hình nè : PIC Vietnam - View Single Post - Dùng prescaler đếm tần số
            Đang thất nghiệp 0988-010-486

            Comment


            • #7
              Nguyên văn bởi tay mơ Xem bài viết
              bạn làm mạch thật coi chạy sao chứ mô phỏng chưa chắc. mình làm đo chính xác đến 24 mhz ( tối đa 27 mhz- hơn nữa là ko đo được)
              16f877A dùng thạch anh 20mhz, timer1 chế độ xung ngoài , prescaler 8:1
              Setup_Timer_1(T1_EXTERNAL|T1_DIV_BY_8);
              hình nè : PIC Vietnam - View Single Post - Dùng prescaler đếm tần số
              Thạch anh 20M mà bạn đo được tần số 24M hả bạn, mình nghĩ như vậy thì timer sao đáp ứng được tần số cần đo nhỉ. Bạn có thể cho mình code và sơ đồ mạch ko vậy?
              Mua bán thiết bị điện công nghiệp tại Hà Nội, toàn quốc.
              http://diencongnghiep360.com/
              http://tudienhathe.vn/

              Comment


              • #8
                Nguyên văn bởi tay mơ Xem bài viết
                bạn làm mạch thật coi chạy sao chứ mô phỏng chưa chắc. mình làm đo chính xác đến 24 mhz ( tối đa 27 mhz- hơn nữa là ko đo được)
                16f877A dùng thạch anh 20mhz, timer1 chế độ xung ngoài , prescaler 8:1
                Setup_Timer_1(T1_EXTERNAL|T1_DIV_BY_8);
                hình nè : PIC Vietnam - View Single Post - Dùng prescaler đếm tần số
                Cái này mình cũng đã làm rồi tuy nhiên thường ở tần số thấp nó có sai số lớn hơn so với đo ở tần số cao, mà cao quá thì cũng lại sai số thôi

                Comment


                • #9
                  Nguyên văn bởi vietthanh123 Xem bài viết
                  Thạch anh 20M mà bạn đo được tần số 24M hả bạn, mình nghĩ như vậy thì timer sao đáp ứng được tần số cần đo nhỉ. Bạn có thể cho mình code và sơ đồ mạch ko vậy?
                  Mình dùng PIC 18F4431 để đo tần. Cũng do sai sót mạch nên nó đã đo tới 200MHz với thạch anh 20M. Điều này mình dám chắc vì máy đo tần cũng hiển thị như thế.
                  ____
                  Chết cười mình dùng delay thông thường để đo tần 50KHz nhưng mà chết cái sai số có 1 Hz, ở 20KHz thì không thấy sai
                  ( Mô phỏng còn thực tế chưa biết )
                  Attached Files
                  Last edited by duong_act; 12-11-2012, 18:18.

                  Comment


                  • #10
                    Nguyên văn bởi vietthanh123 Xem bài viết
                    Thạch anh 20M mà bạn đo được tần số 24M hả bạn, mình nghĩ như vậy thì timer sao đáp ứng được tần số cần đo nhỉ.
                    thạch anh 20mhz là cấp xung clock cho PIC ko liên quan tới tần số clock ngoài đưa vào Timer - Timer đáp ứng được tần số đến 50 mhz lận - Fcutoff của linh kiện cmos
                    Đang thất nghiệp 0988-010-486

                    Comment


                    • #11
                      Do giải thuật cả thôi, các bác đừng đổ tại PIC hay AVR.

                      Comment


                      • #12
                        pic có thể đo tới 50-60 Mhz +- 1Hz với direct counter ... mình đã từng làm . ( và trước đây có sản xuất máy đo tần số vài GHz để bán thương mại)
                        Còn với reciprocal counter ... thì ... khó mà chạy được ... còn đo trên 60Mhz được chắc là ... PIC giời ... do khả năng giới hạn về phần cứng nên chỉ tầm 60Mhz đổ lại .
                        việc làm sai số là do trình độ của người lập trình ... cách tính toán .. chứ không phải do PIC !
                        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                        Comment


                        • #13
                          Nguyên văn bởi queduong Xem bài viết
                          pic có thể đo tới 50-60 Mhz +- 1Hz với direct counter ... mình đã từng làm . ( và trước đây có sản xuất máy đo tần số vài GHz để bán thương mại)
                          Còn với reciprocal counter ... thì ... khó mà chạy được ... còn đo trên 60Mhz được chắc là ... PIC giời ... do khả năng giới hạn về phần cứng nên chỉ tầm 60Mhz đổ lại .
                          việc làm sai số là do trình độ của người lập trình ... cách tính toán .. chứ không phải do PIC !
                          Cũng chưa chắc đâu bác. Em đo nó hiển thị 220MHz trên LCD. Cứ nghĩ là số ảo nhưng vác máy đo tần ra đo thì nó cũng hiện 215MHz. Còn sai số là đương nhiên vì dùng thêm cả ngắt timer.

                          Comment


                          • #14
                            Đâu có ai nói là do PIC nó gây sai số đâu, trước mình làm mạch đếm tần dùng PIC8f4550 clock 48Mhz sử dụng timer để tạo hẵn 1s chế độ 16 bit, và dùng 1 bộ counter 16 bit viết trên c18 tính toán từng dòng lệnh có bù trừ mấy lệnh nhảy, điều kiện ví dụ như đk đúng mất 3 chu kì sai mất 2 chu kì thì bù thêm 1 chu kì vào bên cái sai sao cho số chu kì lệnh khi thực hiện các đk đó là như nhau,... thực tế thì nó cũng có sai số thôi. Còn với tần số rất cao thì do giới hạn phần cứng nên cũng bị hạn chế có thể dùng các bộ chia tần xuống rồi đo, nhưng như thế nó sẽ sai số tùy theo tỉ lệ của bộ chia

                            Comment


                            • #15
                              Nguyên văn bởi duong_act Xem bài viết
                              Cũng chưa chắc đâu bác. Em đo nó hiển thị 220MHz trên LCD. Cứ nghĩ là số ảo nhưng vác máy đo tần ra đo thì nó cũng hiện 215MHz. Còn sai số là đương nhiên vì dùng thêm cả ngắt timer.
                              nếu pic mà chịu được 200mhz thì đã giàu to rồi ! ( còn theo thuyết mà đếm direct counter ... thì lên đến cả nghìn MHZ )
                              nếu pic mà đếm direct được 200mhz thì :
                              - NEC chết vì không tiêu thụ được prescaler
                              - philips chết vì không bán được PLL
                              - Analog device móm vì không bán được DDS nữa
                              mình có đọc đâu đó giới hạn độ chính xác tầm <60Mhz ... PIC AXE lên đến 70MHz đã là khủng khiếp lắm rồi.
                              Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X