Thông báo

Collapse
No announcement yet.

input capture trong AVR

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

  • #16
    Thấy AE trao đổi xôi nổi quá cho mình hỏi cái này :
    -mình muốn do vận tốc cua DC MOTOR có 3 dây hồi tiếp A,B,Z mình chư biết nên đưa pha nào vao chân ICP để co thể đo được vận tốc cho chính xác nhớ AE chì giáo với . ThanhK!

    Comment


    • #17
      đưa chân nào vào mà chả được. Có điều nếu đưa càng nhiều thì độ phân giải tốc độ càng cao
      Nếu tôi chết đi, hãy chôn tôi với R,L,C...

      Bùi Đức Thọ
      (ductho0409@gmail.com)

      Comment


      • #18
        Nguyên văn bởi jindo_vn Xem bài viết
        Xung được đưa trực tiếp vào chân ICP. Giả sử đặt ICP làm việc ở chế độ gọi ngắt khi có rising edge thì trong hàm ngăt sẽ có một biến counter dùng để đếm số lần có xung sườn lên đưa vào pin ICP. Như vậy mỗi lần có xung thì giá trị counter sẽ tăng lên 1.

        Chú ý: - counter bi tràn.
        - Nếu xung được tạo ra bởi các sự kiện bấm nút thì vấn đề lọc các xung
        nhiễu cần được xử lý trước khi đưa vào ICP

        Vì ICP nó làm việc cùng với các bộ định thời nên khi có ngắt ICP, bạn có thể ghi lại thời điểm xảy ra ngắt. Từ đó có thể ứng dụng làm các applications khác nhau. Chẳng hạn đo tần số, đo vận tốc, đo gia tốc. vv....

        Jindo_vn
        bác jindo_vn thân mến em có một bài như vầy. bác xem giúp em nhé
        em có một nguồn phát xung vuông từ một cảm biến. Em muốn đo số xung trong một giây thì em nên làm sao.em dùng atmega16
        -em có ý làm bằng cách dùng counter0 đếm cạnh xuống để đo số xung trong 200ms rồi sau đó lấy thanh ghi TCNT0 nhân lên 5 lần rồi lưu vào cặp th.ghi xh:xl
        không biết em làm vậy có ổn không.
        -nếu dùng bộ input capture thì mình có đếm xung được không và mình phải làm sao, mong bác chỉ gấp cho em nhé. Em đang làm một mô hình để nộp bài mà tới chỗ này không biết làm sao cho tối ưu cả.
        Mấy ai định nghĩa được tình yêu.
        Có gì đâu một buổi chiều.
        Kề dao lên cổ yêu hay chết .
        Gật đầu cái rụp thế là yêu.

        --------
        Apple

        Comment


        • #19
          Mình gặp khó khăn về capture va compare trong timer/counter 2. Mình chưa hiểu cách sử dụng 2 chức năng này và các chân của AVR có liên quan đến chức năng này. Mình học Pic mới chuyển sang học thêm AVR nên gặp khó khăn. Giúp mình với
          -----------------------
          Nếu tôi chết hãy chôn tôi với 1 cái máy tính màn hình phẳng có kết nối Internet tốc độ cao và 1 cái điện thoại di động để dễ liên lạc....

          Comment


          • #20
            ai đã viết về input capture, có thể post bài lên cho em tham khảo không? Bài gì cũng được, miễn là liên quan đến input Cature!

            Comment


            • #21
              Mình mới thử làm về capture với Timer1 của ATmega16:
              Mình đưa nguyên lý bài làm của mình như sau:
              -mình có một xung vuông cần đo tần số trong 1s, mình đo cạnh xuống
              -Đưa xung này vào chân ICP
              -định nghĩa cho chân ICP là ngõ vào
              -khởi tạo timer1 sang chế độ normal sao cho khoảng thời gian giữa hai cạnh xuống của hai xung liên tiếp không được lớn hơn thời gian làm timer1 bị tràn
              -nhớ set cái bit Capture interrupt Enable của timer1 và cái bit chống nhiễu cho bộ capture nhé.
              -mỗi khi có một cạnh xuống ở chân ICP, mcu sẽ gọi ngắt của bộ capture
              -mỗi khi ngắt capture xảy ra giá trị của hai thanh ghi TCNT1h:TCNT1l sẽ được đưa vào cặp thanh ghi ICR1h:ICR1l
              -Lúc này trong chuong trình ngắt bạn chỉ cần copy ICR1h:ICR1l sang một cặp thanh ghi trung gian nào đó (VD: r17:r16) sau đó đặt lại giá trị cặp TCNT1h:TCNT1l về 0 và viết code một phép nhân nho nhỏ:
              VD:
              ----->thời gian giữa 2 cạnh xuống liên tiếp = T
              ----->thời gian để timer1 tick lên 1 đơn vị = j (j phụ thuộc vào bộ chia tần(prescaler) của timer1
              ----->giá trị của cặp ICR1h:ICR1l khi có ngắt là p
              vậy ta có:
              T=j*p
              để tính tần số trong 1s ta viết chương trình chia để tìm tần số.

              Trên đây là một chút ý kiến nhỏ của mình mong các bạn tham khảo và góp ý, mình cũng mới mò mẫm về AVR nên cũng chưa rành lắm nên code còn nhiều rác không tiện post lên nhưng mình làm thử thấy đo tốc độ động cơ cũng tốt đấy.

              Có thể thử bộ capture bắng cách tạo xung vuông ơ một chân port nào đó rồi nối sang chân ICP
              Last edited by apple; 15-02-2008, 19:31.
              Mấy ai định nghĩa được tình yêu.
              Có gì đâu một buổi chiều.
              Kề dao lên cổ yêu hay chết .
              Gật đầu cái rụp thế là yêu.

              --------
              Apple

              Comment


              • #22
                Chào các bạn!
                Mình muốn tìm hiểu về bộ timer/counter 16 bít của ATmega8, về cả cấu trúc và chức năng cũng như cách thức điều khiển. Bác nào biết xin được chỉ giáo (Tớ đã đọc kỹ cả tài liệu tiếng anh cũng như tiếng việt nhưng đoạn này là chịu, mong các bác chỉ giáo).
                |

                Comment


                • #23
                  chào các a!
                  e thử input capture của con atmega16 như sau:

                  interrupt [TIM1_CAPT] void timer1_capt_isr(void)
                  {
                  PORTC++;
                  }

                  mỗi lần nhấn remote hồng ngoại thì sẽ có 1 chuỗi xung kích vào chân ICP, e thử nhấn lần lượt các phím và thấy kết quả là như nhau giá trị xuất ra luôn là 0x22; cái này e hơi thắc mắc, vì mỗi phím sẽ có mã khác nhau, vậy thì số cạnh lên và cạnh xuống trong mỗi chuỗi xung phải khác nhau, vậy nhưng tại sao nó lại chỉ xuất ra cug 1 giá trị 22h.
                  các bác có cách nào giải mã cái remote hồng ngoại chỉ e với. thanks a lot.

                  Comment


                  • #24
                    e đã hiểu tại sao nó luôn cho giá trị bằng nhau rồi, tại vì bit 0 thì sẽ ứng với 01 và bit 1 là 10, vì thế với mỗi bit luôn có 1 cạnh lên và 1 cạnh xuống.

                    Comment


                    • #25
                      Các bác có thể tham khảo một source code mẫu của Input Capture ở đây:
                      http://winavr.scienceprog.com/avr-gc...th-winavr.html
                      Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                      Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                      Comment


                      • #26
                        Các bác cho hỏi làm sao đọc được giá trị thanh ghi của Input capture trong chương trình interrupts của nó nhỉ . Em dùng biến x=ICR1, thì nó báo lỗi không hiểu ICR1 là gì ( viết bằng codevision ) . nếu dùng phép gán
                        x1=ICR1L;
                        x2=ICR1H;
                        x=x2*100+x1;
                        thì đến lúc hiển thị cũng ko đúng thời điểm mà em tính nó capture . làm thế nào đọc hết 16 bít của nó nhỉ ???
                        ADC thì có ADCW
                        OCR1A, OCR1B thì vẫn viết vậy.
                        Còn ICR1 thì bó cánh

                        Comment


                        • #27
                          Nguyên văn bởi smallflame Xem bài viết
                          Các bác cho hỏi làm sao đọc được giá trị thanh ghi của Input capture trong chương trình interrupts của nó nhỉ . Em dùng biến x=ICR1, thì nó báo lỗi không hiểu ICR1 là gì ( viết bằng codevision ) . nếu dùng phép gán
                          x1=ICR1L;
                          x2=ICR1H;
                          x=x2*100+x1;
                          thì đến lúc hiển thị cũng ko đúng thời điểm mà em tính nó capture . làm thế nào đọc hết 16 bít của nó nhỉ ???
                          ADC thì có ADCW
                          OCR1A, OCR1B thì vẫn viết vậy.
                          Còn ICR1 thì bó cánh
                          Có nhiều cách lắm bác ạ. Sau đây là 1 cách

                          unsigned int x; // khai báo x là số từ 0 đến 65535
                          x=(unsigned int)ICR1H <<8 + ICR1L; // chuyển ICR1H sang kiểu 16 bit, sau đó dịch sang trái 8 bit rồi cộng với ICR1L
                          //Cách này tương đương với: x=(unsigned int)ICR1H * 256 + ICR1L;
                          //Ta phải chuyển sang kiểu 16 bit (cái này gọi là type casting) nếu không kết quả của ICR1H * 256 sẽ vẫn là 1 số 8 bit

                          Theo cách làm của bác thì có 2 cái sai, 1 là phải nhân 256 chứ không phải là 100, 2 là thiếu type casting.
                          Last edited by nghaiha; 30-08-2008, 23:58.
                          Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
                          Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

                          Comment


                          • #28
                            Trong codevision mình khai báo ngăt ICP như thế nào nhỉ?

                            Comment


                            • #29
                              interrupt [TIM1_CAPT] void timer1_capt_isr(void)
                              Syntax tuân theo đúng như trên.
                              Từ khóa là từ in đậm.
                              TIM1_CAPT có thể thay bằng hằng số trực tiếp là thứ tự trong bảng vector ngắt hoặc dưới dạng 1 tên khác.
                              timer1_capt_isr có thể đặt tên khác tùy ý.

                              Phần Help (F1) của CodeVisionAVR diễn giải mọi điều cần biết rất chi tiết, nên đọc kỹ.

                              Thân mến,
                              blackmoon.
                              blackmoon.

                              Comment


                              • #30
                                cảm ơn bạn. Tại hôm nọ cài cài win theme lạ , nên nó ko hiển thị chỗ ngắt trong timer 1...:d. Chứ ngắt thì xài rồi.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X