Thông báo

Collapse
No announcement yet.

bạn nào giúp mình đo tốc độ đọng cơ có encoder hiện thị lên led 7 thanh với

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

  • bạn nào giúp mình đo tốc độ đọng cơ có encoder hiện thị lên led 7 thanh với

    mình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn

  • #2
    Nguyên văn bởi canhdt4 Xem bài viết
    mình đang học vđk 8051 và đang nghiên cứu đo tốc độ động cơ. mình đọc và biết cách sử dụng couter để đếm xung ngoài. vậy làm thế nào để hiển thị nó lên led 7 thanh được với hiện thị là vòng/giây. các bạn nào biết dạy bảo mình với nhé. càng chi tiết càng tốt ạ. mình xin cảm ơn
    Bạn Dùng thêm ngắt timer nữa. để chu kỳ ngắt khoảng vài chục ms. trong chương trình con phục vụ ngắt thì tính số sung đếm được. giả sử là chu kỳ ngắt là 20ms thì số sung đó sẽ nhân với 50 để ra số sung trong một giây. đồng thời xóa bộ đếm về o. ở đây mình nói với emcoder 1 xung.

    Comment


    • #3
      Nguyên văn bởi caonhan_2004 Xem bài viết
      Bạn Dùng thêm ngắt timer nữa. để chu kỳ ngắt khoảng vài chục ms. trong chương trình con phục vụ ngắt thì tính số sung đếm được. giả sử là chu kỳ ngắt là 20ms thì số sung đó sẽ nhân với 50 để ra số sung trong một giây. đồng thời xóa bộ đếm về o. ở đây mình nói với emcoder 1 xung.
      mình chưa làm cái này bao giờ, bạn có thể hướng dẫn mình cụ thể hơn không. encoder của mình là 100xung/vong. mình trình bày ý hiểu thế này nhé: mình dùng counter đếm số xung trong 1s. được bao nhiêu xung thì chia cho số xung trên 1 vòng. số xung đếm dc trên 1s/100xung=số vòng/s) nhưng mình không hình dung ra là làm thế nào. thế đấy
      Last edited by canhdt4; 18-11-2013, 09:48.

      Comment


      • #4
        Nguyên văn bởi canhdt4 Xem bài viết
        mình chưa làm cái này bao giờ, bạn có thể hướng dẫn mình cụ thể hơn không. encoder của mình là 100xung/vong. mình trình bày ý hiểu thế này nhé: mình dùng counter đếm số xung trong 1s. được bao nhiêu xung thì chia cho số xung trên 1 vòng. số xung đếm dc trên 1s/100xung=số vòng/s) nhưng mình không hình dung ra là làm thế nào. thế đấy
        Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
        số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
        Last edited by caonhan_2004; 18-11-2013, 11:38.

        Comment


        • #5
          Nguyên văn bởi caonhan_2004 Xem bài viết
          Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
          số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.
          bạn có thể hướng đẫn cho mình viết code được không. mình không hình dung ra được là phải làm thế nào để counter đếm trong 1 khoảng thời gian. bạn có thể viết cho mình đoạn code đó và chú thích vào đấy được không. mình cảm ơn

          Comment


          • #6
            bạn ấy đã nói tới thê này thì gần như là viết code cho bạn rùi mà!
            hãy làm theo cách của bạn!

            Comment


            • #7
              Nguyên văn bởi tjeunjnzah Xem bài viết
              bạn ấy đã nói tới thê này thì gần như là viết code cho bạn rùi mà!
              mình loay hoay mãi mà chả biết viết thể nào. dùng timer để thiết lập thời gian đếm cho counter lưa giá trị đếm được và xuất ra ... mình cứ loang quanh ở đoạn đấy không biết viết như thế nào. mình mới học dùng timer và counter thôi

              Comment


              • #8
                Nguyên văn bởi canhdt4 Xem bài viết
                bạn có thể hướng đẫn cho mình viết code được không. mình không hình dung ra được là phải làm thế nào để counter đếm trong 1 khoảng thời gian. bạn có thể viết cho mình đoạn code đó và chú thích vào đấy được không. mình cảm ơn
                bạn cứ viết đi. Nếu mắc chỗ nào thì nhờ anh em trên diễn đàn giúp đỡ. Bạn đã biết dùng timer chưa, Nếu dùng được timer và Counter là làm lần lượt theo các bước mình nói ở trên là ra. ở đây giá trị của bộ đếm sẽ lưu ở thanh ghi TL và TH của bộ đếm . Việc còn lại chỉ là đọc giá trị đó .Trên diễn đàn này có rất nhiều code, nhưng chỉ nên tham khảo. Bạn tự mày mò tìm hiểu sẽ tốt hơn là xin code.
                Last edited by caonhan_2004; 19-11-2013, 00:06.

                Comment


                • #9
                  Nguyên văn bởi caonhan_2004 Xem bài viết
                  bạn cứ viết đi. Nếu mắc chỗ nào thì nhờ anh em trên diễn đàn giúp đỡ. Bạn đã biết dùng timer chưa, Nếu dùng được timer và Counter là làm lần lượt theo các bước mình nói ở trên là ra. ở đây giá trị của bộ đếm sẽ lưu ở thanh ghi TL và TH của bộ đếm . Việc còn lại chỉ là đọc giá trị đó .Trên diễn đàn này có rất nhiều code, nhưng chỉ nên tham khảo. Bạn tự mày mò tìm hiểu sẽ tốt hơn là xin code.
                  mình viết đoạn code đếm thế này:
                  void main()

                  {


                  TMOD=0x50; //0x50=0101 0000 : C/T=1, bo dem 16bit
                  TL1=0x00;
                  TH1=0x00; //xoa bo dem

                  P3_5=1; //set chân vào
                  TR1=1; //khoi dong bo dem



                  // P2=0;
                  not_enough=0;
                  full=1;
                  while(1)
                  {
                  ham();
                  }
                  }
                  void delay(unsigned short d)
                  {
                  while(d>0)d--;
                  }
                  void ham(void)
                  {
                  bien=TL1;

                  tg1=bien/100000;
                  tg2=bien%100000;
                  tg3=tg2/10000;
                  tg4=tg2%10000;
                  tg5=tg4/1000;
                  tg6=tg4%1000;
                  tg7=tg6/100;
                  tg8=tg6%100;
                  tg9=tg8/10;
                  tg10=tg8%10;


                  dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
                  dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
                  dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
                  dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
                  dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
                  dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
                  gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị
                  Last edited by canhdt4; 19-11-2013, 12:16.

                  Comment


                  • #10
                    Nguyên văn bởi canhdt4 Xem bài viết
                    mình viết đoạn code đếm thế này:

                    gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị
                    gái trị trong TL1 tối đa là 255 vậy làm sao để mình đếm đến 999999 hoặc hơn nữa đực nhỉ. mình cho biếm đêm=TH1 thì cứ phải TL1 tràn thì TH1 nó mới tăng thêm 1 dơn vị[/QUOTE]


                    Timer1 gồm 2 thanh ghi TH1,và TL1. gộp lại là 16bit. vậy giá trị của nó có thể đếm được là 2^16-1=65535. muốn đếm nhiều hơn thì bạn nên dùng ngắt ngoài (intx) , hoặc có thể dùng chế độ ngắt tràn của counter với giá trị nạp cho nó là lớn nhất (vớ timer0 nạp 0xff, với tỉmer1 nạp giá trị 0xffff, khi đó nếu giá trị trong bộ đếm vượt qua giá trị Max của bộ đếm thì xảy ra ngắt tràn bộ đếm, cũng giống như ngắt tràn timer. Điểm khác nhau là ngắt tràn timer là timer đếm xung hệ thóng, còn conter đếm xung bên ngoài. Nếu bạn muốn đếm giá trị lớn hơn 65535, phải dùng một biến có thể lưu được giá trị lớn hơn hoặc bằng số cần đếm. VD kiểu Long với giá trị có thể lưu là 32bit, ban đầu cho biến đó bằng 0, cứ mỗi khi xảy ra ngắt ngoài hoặc ngắt do tràn bộ đếm, thì tăng biến đó lên 1 đơn vị. Như vậy bạn sẽ dùng biến đó thay cho việc phải đọc giá trị của bộ đếm. Và việc còn lại tiếp tục như mình nói hôm trước.
                    Last edited by caonhan_2004; 19-11-2013, 19:13.

                    Comment


                    • #11
                      Bạn hiểu hoàn toàn đúng. Vấn đề là bạn phải tạo ra một khoảng thời gian chuẩn để lấy mẫu , như mình ví dụ là 200ms. chẳng hạn dùng count1 để đếm xung, còn timer0 để tạo khoảng thời gian chuẩn 200ms, . vậy cứ sau 200ms thì xảy ra ngắt tràn timer0 một lần. Trong chương trình phục vụ ngắt timer0 , phải gán gán trị bộ đếm mà counter1 đếm được cho một biến x. sau khi lưu giá trị đếm được vào x, ta lại reset Conter1 về 0, để để bộ đếm đếm lại từ đầu, vậy cứ 200ms, giá trị bộ đếm lại được cập nhật một lần vào biến x. như vậy ta đã có được số xung đếm được trong 20ms chính là x.
                      số xung trong một giây sẽ là y=x*1000/2=x*500. Do encoder 100 xung , nên số vòng quay đông cơ trong 1s =y/100 .Lấy giá trị y này hiển thị ra led 7 thanh chính là số vòng của động cơ trên 1s.

                      #include <REGX51.H>

                      void delay(unsigned short );

                      sbit dk1=P0^5;
                      sbit dk2=P0^4;
                      sbit dk3=P0^3;
                      sbit dk4=P0^2;
                      sbit dk5=P0^1;
                      sbit dk6=P0^0;

                      unsigned char code M[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};


                      unsigned long int tg1;
                      unsigned long int tg2;
                      unsigned long int tg3;
                      unsigned long int tg4;
                      unsigned long int tg5;
                      unsigned long int tg6;
                      unsigned long int tg7;
                      unsigned long int tg8;
                      unsigned long int tg9;
                      unsigned short tg10;

                      unsigned int i,dem=0, n=0, x=100;


                      void delay(unsigned short d)
                      {
                      while(d>0)d--;
                      }

                      void hienthi(){
                      tg1=n/100000;
                      tg2=n%100000;
                      tg3=tg2/10000;
                      tg4=tg2%10000;
                      tg5=tg4/1000;
                      tg6=tg4%1000;
                      tg7=tg6/100;
                      tg8=tg6%100;
                      tg9=tg8/10;
                      tg10=tg8%10;


                      dk1=1;P2=M[tg10];delay(40);dk1=0; // hang don vi
                      dk2=1;P2=M[tg9];delay(40) ;dk2=0; // hang chuc
                      dk3=1;P2=M[tg7];delay(40) ;dk3=0; // hang tram
                      dk4=1;P2=M[tg5];delay(40) ;dk4=0; // hang nghin
                      dk5=1;P2=M[tg3];delay(40) ;dk5=0; // chuc nghin
                      dk6=1;P2=M[tg1];delay(40) ;dk6=0; // tram nghin
                      }



                      void main() // chuong trinh chinh
                      {

                      while (1)
                      {
                      for(i=0;i<20;i++)
                      {
                      TMOD=0x61; //su dung conter 1 che do 8bit va timer0 che do 16bit
                      TH0=0xc3; //-50000 us
                      TL0=0x50; //
                      TH1=0x00; TL1=0x06; // xoa thanh ghi TH va TL
                      TR0=1; TR1=1; // cho phep timer0 va counter 1 chay
                      P3_5=1; // set chan T0 cho nhan xung ngoai
                      }
                      if(i==20)i=0; //cho timer0 tràn
                      {
                      TR0=0;TR1=0;
                      dem = TL1;
                      n = (dem/x)*(10^6/50000)*60;
                      hienthi();
                      TR0=1;TR1=1;
                      }
                      }
                      }

                      mình viết theo ý hiểu của mình với nhưng gì bạn nói, nó không chạy được. bạn xem giúp là chỗ nào chưa đúng cho mình với nhé!

                      Comment


                      • #12
                        bạn nào biết lập trình hiển thị tốc độ đông cơ cho mình hỏi code này viết chuẩn không ạ. mình test thử hình như sai ở đâu đó thì phải. mọi người xem giúp với ạ

                        #include <REGX51.H>
                        sbit A1 = P1^3;
                        sbit A2 = P1^4;
                        sbit A3 = P1^5;
                        sbit A4 = P1^6;
                        sbit TANG=P1^0;
                        sbit GIAM=P1^1;
                        unsigned char so[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
                        unsigned long xung,i;
                        unsigned int k;
                        unsigned char dem,tocdo;
                        ///////////////////////////////////////
                        void delay(int time) // ham delay phuc vu quet led
                        {int n;
                        for(n=0;n<time;n++)
                        {
                        ;
                        }
                        }
                        //////////////////////////////////////
                        void quetled7() // ham quet led 7
                        { //////////////// hang nghin
                        A1 = 1;
                        P2 = so[i/1000];
                        delay(50);
                        A1 = 0;
                        P2=0xff;
                        ////////////////////////// hang tram
                        A2=1;
                        P2=so[(i/100)%10];
                        delay(50);
                        A2=0;
                        P2=0xff;
                        ///////////////////////////////// hang chuc
                        A3=1;
                        P2=so[(i/10)%10];
                        delay(50);
                        A3=0;
                        P2=0xff;
                        //////////////////////////////// hang don vi
                        A4=1;
                        P2=so[i%10];
                        delay(50);
                        A4=0;
                        P2=0xff;
                        }
                        /////////////////////////////////////
                        void khoitaotimer() // 0010 0001 timer2 che do 8bit. timer1 che do 16bit
                        { TMOD = 0x21; // timer0 che do 1
                        IE = 0x8A;
                        TH0 = 0xC3; // tre 50us
                        TL0 = 0x50;
                        ET0 = 1;
                        TR0 = 1;
                        TH1 = -100;
                        TL1 = -100;
                        ET1 = 1;
                        TR1 = 1;

                        }
                        ////////////////////////////
                        void khoitaongatngoai()
                        { EA=0;
                        EX0=1;
                        IT0=1;
                        EA=1;
                        }
                        ///////////////////////////////////////////
                        void isr_timer0() interrupt 1
                        { TF0=0;
                        TR0=0;
                        quetled7();
                        k++;
                        TH0=0xC3; // gia tri nap lai
                        TL0=0x50;
                        if(k==20) // lay mau 1s
                        {
                        ixung*60)/100); // vong/phut encoder dung loai 32x
                        k=0;
                        xung=0;
                        }
                        TR0=1;
                        }
                        /////////////////////////////////////////
                        void isr_timer1() interrupt 3
                        { TF1=0;
                        TR1=0;
                        dem++;
                        if(dem>100)
                        dem=0;
                        if(dem<tocdo)
                        P1_6=1;
                        else
                        P1_6=0;
                        TR1=1;
                        }
                        /////////////////////// phim nhan
                        void phimnhan()
                        {
                        //////////////////////////
                        if((TANG==0)&&(GIAM==1))
                        {
                        while(!TANG);
                        tocdo=tocdo+10;
                        if(tocdo==110)tocdo=100;
                        }
                        ////////////////////////////////
                        if((GIAM==0)&&(TANG==1))
                        {while(!GIAM);
                        tocdo=tocdo-10;
                        if(tocdo==-10)tocdo=0;
                        }
                        }
                        /////////////////////////////////// ham ngat ngoai
                        void isr_ex0() interrupt 0
                        {
                        xung++;
                        }
                        ////////////////////////////////////// ham chinh
                        void main()
                        {P1_6=1;
                        khoitaotimer();
                        khoitaongatngoai();
                        while(1)
                        {phimnhan();
                        }
                        }

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        • tuyennhan
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi tuyennhan
                          Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
                          Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
                          hôm nay, 07:44
                        • vi van pham
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi vi van pham
                          Cám ơn những lời chúc tốt đẹp của em.

                          Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

                          Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
                          hôm nay, 02:00
                        • nhathung1101
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi nhathung1101
                          Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                          Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                          Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                          Hôm qua, 22:18
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                          Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                          Hôm qua, 14:51
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                          Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                          Hôm qua, 14:39
                        • dinhthuong80
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi dinhthuong80
                          Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                          Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                          Hôm qua, 14:28
                        • bqviet
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi bqviet
                          Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                          21-02-2025, 20:26
                        • mèomướp
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi mèomướp
                          Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                          21-02-2025, 12:32
                        • vi van pham
                          Trả lời cho Tiếng Anh cho người Việt
                          bởi vi van pham
                          Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                          Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                          20-02-2025, 21:31
                        • bqviet
                          Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                          bởi bqviet
                          Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                          20-02-2025, 17:22
                        Đang tải...
                        X