Thông báo

Collapse
No announcement yet.

bộ đếm dùng PIC ??

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

  • #16
    Để tăng độ chính xác thì có thể dùng phương án capture của PIC+ ngắt T1.
    Nhưng cách của 3T có vẻ hợp lý nhất, em có thể giảm sai số xuống khoảng dưới 20 chu kỳ lệnh(20*0.2=4uS) bởi nhờ việc tối ưu mã trong ngắt+bố cục chương trình+bù trừ lệnh.

    Comment


    • #17
      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?
      Không phải cứ debug , dựa vào cái phần mềm mà giải quyết được vấn đề đâu em ạ , Lý thuyết chỉ là lý thuyết và nó sẽ hoàn hảo nếu thí nghiệm. BỞi vậy cần nhiều kinh nghiệm khi vào vấn đề cụ thể . Anh lấy đơn giản ví dụ về cái bộ đếm này , bình thường không sao nếu đưa vào đếm xung , cao tần ở mức độ nhiễu mù trời như thế đồng hồ thời gian chưa chắc đã đúng !!!
      Anh được biết có những người làm rất nhiều nhưng không phải là nhất, Khi đụng chạm tới các vấn đề " THời gian thực " "Analog" thì hãy bình tĩnh mà xem xét .
      Có những người quấn cái biến áp " Blocking " là cái rất đơn giản mà cả một năm trời cũng không làm được ra hồn. Để đạt được đến độ hoàn mỹ thì cái gì cũng khó.
      Bảo trọng.
      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


      • #18
        chỉ biết

        Tối F lên lab coi lại đoạn code

        Hehhe, báo cho anh em một tin vui... F sắp được quay trở lại với PIC rồi... hehhe, bây giờ phải học lại các anh em thôi..

        Tối hôm qua, trong ngày lễ tình nhân lãng mạn, F đang nóng máu vì cái điện thoại củ chuối làm F không gọi được về VN... Chef F bước vào, dường như muốn chia sẻ với hai anh em VN trong cái ngày mà chef biết chắc hai thằng vẫn phải ngồi trong lab...

        Sau một hồi thảo luận với F, vì thương cho sự thiếu thốn của F, chef quyết định mua cho F 2 cái động cơ và toàn bộ công cụ thí nghiệm. Và bây giờ F phải xây dựng một cái tool để chơi với 2 cái động cơ.. hihi...

        Sau khi thảo luận với chef khoảng tiếng, nửa đêm, F đã gọi được về nhà...

        Happy valentine...

        Thanks god!...
        Falleaf
        Công ty TNHH Thương mại và Giao nhận R&P
        58/57 Nguyễn Minh Hoàng - Phường 12 - Quận Tân Bình - TP.HCM
        mail@falleaf.net - VP: (04) 36408561 - (08) 38119870

        Comment


        • #19
          Hihi.. sau một hồi suy nghĩ, cố tìm lời phản bác... nhưng không được. Anh BinhAnh đã tìm đúng lỗi đó.

          Comment


          • #20
            (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)
            Em chưa học PIC16 cũng như PIC18, mới chỉ học dsPIC nên không biết vụ PIC16 không cho phép ưu tiên ngắt bằng phần cứng. ha ha... qua cái này lại học thêm được một thứ. Thích thật đấy.
            Thanks anh BinhAnh.
            AFH

            Comment


            • #21
              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
              Đây là bộ đếm dùng led 7 đoạn kích thước 14" đếm từ 0000 đến 9999.

              Bộ này sử dụng để hiển thị số mét trong 1 dây chuyền sản xuất cáp dài, để công nhân 2 phía trên và cuối dây chuyền đều thấy được. Đây là 1 ứng dụng rất đơn giản của 16f84a. Bạn có thể tham khảo để ứng dụng cho mình. Sơ đồ và chương trình là chính xác và đã hoạt động.
              Opentdoors- Thành viên của Rock'n'Roll club

              Comment


              • #22
                Chào chị Thu Trang và các anh chị em trong diễn đàn. Tôi đang mày mò tự học về VĐK PIC nên chưa thành thạo. Tôi có một bài toán cần giải quyết như sau:
                - Đếm đồng thời 2 xung kênh A từ hai Encoder và cũng đồng thời phát hai xung để điều khiển hai driver của 2 motor step không biết có thể thực hiện trên PIC16F877A được không? (Encoder và motor step không gắn với nhau)
                - Sau khoảng 1s thì lại đếm một xung TTL khác từ bên ngoài.
                Rất mong được chị và các anh chị em trong diễn đàn giúp đỡ. Xin liên lạc qua địa chỉ mail: qminhmap@yahoo.com.
                Cảm ơn nhiều.

                Comment


                • #23
                  sao mình viết như thuật toán trên mà nó không hiện thị đúng bà con nhỉ?
                  Nhờ các bác pro kiểm tra hộ chút nhé. Đo độ lệch pha dùng ngắt rb và timer2.


                  code mình viết ở dưới. Mọi người chỉ giúp chỗ đo độ lệch pha nhé. thanks!

                  Comment


                  • #24
                    Code:
                     
                    #include <16F877A.h>
                    #include <def_877a.h>
                    #device *=16 ADC=10
                    #use delay(clock=8000000)
                    #FUSES HS
                    #USE FAST_IO(D)
                    #USE FAST_IO(b)
                    #USE FAST_IO(c)
                    #bit rs = portb.5
                    #bit rw = portb.4
                    #bit en = portb.3
                    #bit tmr2on = 12.2
                    #byte tmr2 = 11
                    
                    
                    int8 i,j;
                    int16 adc1,adc2;
                    int16 x,y,u,f1,f2,df,T;
                    
                    //--------------------------------------------------------
                    void lenh_lcd(int8 malenh)
                    {
                    portd=malenh;
                    rs=0;
                    rw=0;
                    en=1;
                    delay_us(5);
                    en=0;
                    delay_ms(3);
                    }
                    //--------------------------------------------------------
                    void data_lcd(unsigned char dulieu)
                    {
                    portd=dulieu;
                    rs=1;
                    rw=0;
                    en=1;
                    delay_us(5);
                    en=0;
                    delay_ms(3);
                    }
                    //--------------------------------------------------------
                    // do dien ap
                    void docap1()
                    {
                          set_adc_channel(0);
                          delay_us(10);
                          adc1 =read_adc();
                          DELAY_US(10);
                    }
                    void docap2()
                    {
                          set_adc_channel(1);
                          delay_us(10);
                          adc2 =read_adc();
                          DELAY_US(5);
                       }
                    //------------------------- cac chuong trinh ngat
                    #int_rb
                    void dolechpha()
                    {
                       
                       if((RBIF)&&(RBIE))
                       {
                          if (!rb6)
                          {
                          
                            // RBIF=0;
                             set_timer2(0);
                             setup_timer_2( T2_DIV_BY_1,255,1);
                             enable_interrupts(int_timer2);
                             //tmr2on=1;
                             x=0;
                          }
                          if (!rb7)
                          {
                             disable_interrupts(int_rb);
                             
                             if(TMR1IF)
                             {
                                TMR1IF=0;
                                x++;
                             }
                             setup_timer_2(T2_disabled,255,1);
                             //TMR1ON=0;
                             T=x*256+get_timer2();//To^?ng so^' xung.
                             T=T*0.05 ;//Có the^? dùng làm tròn ?e^? ta(ng ?o^. chinh xác
                             x=0;
                             RBIF=0;
                          }
                       }
                    }
                    #int_timer2
                    void hesongat()
                    {
                       x++;
                    }
                    //---------------------------------------------------
                    void main()
                    {
                       set_tris_c(0x01);
                       set_tris_d(0x00);
                       set_tris_a(0xFF);
                       set_tris_b(0xc0);
                       f1=0;
                       f2=0;
                       x=0;
                       setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
                       setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
                       setup_timer_2( T2_DIV_BY_1,255,1);
                       enable_interrupts(GLOBAL);
                       enable_interrupts(int_timer2);
                       enable_interrupts(int_rb);
                       ext_int_edge(l_to_h);  
                    
                       lenh_lcd(0x38);
                       lenh_lcd(0x0e);
                       lenh_lcd(0x01);
                       lenh_lcd(0x06);
                       //---------------
                    
                       lenh_lcd(0x80);
                       data_lcd("U1:");
                       lenh_lcd(0x88);
                       data_lcd("U2:");
                       delay_ms(1);
                       lenh_lcd(0xC0);
                       data_lcd("F1:");
                       delay_ms(1);
                       lenh_lcd(0xC8);
                       data_lcd("F2:");
                       delay_ms(1);
                       while(true)
                       {
                          disable_interrupts(int_rb);
                          //docap1();
                          //docap2();
                          set_timer1(0);
                          set_timer0(0);
                          delay_ms(1000);
                          F1=get_timer1();
                          f2=get_timer0();
                          //----------------------- hien thi TAN SO 1
                          f1=f1*100;
                          lenh_lcd(0xc3);
                          data_lcd(f1/1000+48);
                          delay_ms(1);
                          data_lcd((f1%1000)/100 + 48);
                          delay_ms(1);
                          lenh_lcd(0xc5);
                          data_lcd(",");
                          delay_ms(1);
                          data_lcd(((f1%1000)%100)/10 + 48);
                          delay_ms(1);
                          data_lcd(((f1%1000)%100)%10 + 48);
                          delay_ms(1);
                       
                          //------------------------------hien TAN SO 2
                          enable_interrupts(int_rb);
                          f2=100*T;
                          lenh_lcd(0xcb);
                          data_lcd(f2/1000+48);
                          delay_ms(1);
                          data_lcd((f2%1000)/100 + 48);
                          delay_ms(1);
                          lenh_lcd(0xcd);
                          data_lcd(",");
                          delay_ms(1);
                          data_lcd(((f2%1000)%100)/10 + 48);
                          delay_ms(1);
                          data_lcd(((f2%1000)%100)%10 + 48);
                          delay_ms(1);
                       }
                    }

                    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