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

                        • since0501
                          Trả lời cho Pin Li-FePO4 (pin sắt) rất dể hỏng! Các biện pháp ngăn ngừa.
                          bởi since0501
                          Mình đào mộ xíu, cho mình hỏi là pin của bác vẫn ok chứ? Mình vừa đóng khối pin 16 cell 40135 thì khi chạy điện áp nó sụt so với khi nghỉ như video mình dẫn link, vậy cho mình hỏi là dung lượng pin sẽ tính khi áp nghỉ hay áp đang hoạt động, và pin sụt áp như vậy là bình thường hay pin kém?
                          ht...
                          hôm nay, 17:56
                        • mèomướp
                          Trả lời cho Sửa bộ nguồn DC 60V 45A
                          bởi mèomướp
                          Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                          Hôm qua, 13:11
                        • tuyennhan
                          Trả lời cho Sửa bộ nguồn DC 60V 45A
                          bởi tuyennhan
                          Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                          Hôm qua, 09:25
                        • tuyennhan
                          Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                          bởi tuyennhan
                          Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                          Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                          Hôm qua, 09:10
                        • Ng.Phuong.5
                          Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                          bởi Ng.Phuong.5
                          Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                          Mấy con...
                          09-01-2025, 19:44
                        • viettinh
                          Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                          bởi viettinh
                          Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                          Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                          09-01-2025, 18:12
                        • nguyendinhvan
                          Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                          bởi nguyendinhvan
                          Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                          Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                          Cách đơn giản...
                          09-01-2025, 00:04
                        • mèomướp
                          Trả lời cho Sửa bộ nguồn DC 60V 45A
                          bởi mèomướp
                          Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                          08-01-2025, 19:02
                        • tuyennhan
                          Trả lời cho Sửa bộ nguồn DC 60V 45A
                          bởi tuyennhan
                          Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                          08-01-2025, 15:43
                        • tuyennhan
                          Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                          bởi tuyennhan
                          Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                          08-01-2025, 15:28
                        Đang tải...
                        X