tăng giảm độ rộng xung

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • agnort
    Thành viên tích cực
    • May 2007
    • 156

    #1

    tăng giảm độ rộng xung

    cho mình hỏi làm sao để tăng giảm độ rộng xung để điều khiển động cơ quay nhanh hay chậm
  • aco2o
    Thành viên mới
    • Oct 2006
    • 5

    #2
    Tăng giảm độ rộng xung chính là tăng giảm thời gian trể của mức cao, mức thấp tại 1 chân nào đó của VĐK. Bạn đọc lại về bộ TIMER nhé.

    Comment

    • vinhsnooker
      Thành viên tích cực
      • May 2006
      • 142

      #3
      Nguyên văn bởi agnort Xem bài viết
      cho mình hỏi làm sao để tăng giảm độ rộng xung để điều khiển động cơ quay nhanh hay chậm
      đơn giản dùng timer với 89,còn với avr và pic thì lại càng đơn giản hơn nữa.

      Comment

      • Innovated
        Thành viên chính thức
        • Aug 2007
        • 68

        #4
        đơn giản lắm mà.
        Với 8051 : nếu không cần chính xác, bạn có thể tự tạo một hàm trễ, cách sử dụng : lăp : p1.1 =1; delay1; p1.1=0; delay2 ---> ok. Cần chính xác thì dùng timer để tạo thời gian trễ, cứ nghịch rùi sẽ thấy.
        pic,avr,psoc,... thì có sẵn bộ pwm bên trong, bạn chỉ việc thay đổi thời gian độ rộng xung là ok luôn (chi tiết nên xem trong datasheet nhé)
        "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

        Comment

        • bk_exp
          Thành viên chính thức
          • Jul 2006
          • 71

          #5
          Cách hay nhất là bạn sử dụng Timer,
          đầu tiên bạn xác lập khoảng timer xảy ra ngắt...
          Giả sử có 100 ngắt liên tiếp ( tương ứng 100% trên hình vẽ) của timer. Khi đó để điều khiển tốc độ motor ta cần điều chỉnh duty cycle ( %)
          Khi xảy ra ngắt chương trình phục vụ ngắt timer sẽ thực hiện đếm từ 0-> 100 ... đồng thời đoạn chương trình này củng thực hiện so sánh giá trị biến đếm với giá trị Duty_cycle nhận được từ chương trình chính hoặc do mình định trước, để thực hiện chuyển mức điện áp
          VD duty_cycle =70 (%) -> sau 70 lần ngắt biến đếm = duty_cycle -> đổi trạng thái chân ra về mức thấp (0) sau đó khi biến đếm đến 100 lại chuyển trạng thái lối ra về mức cao ....
          Attached Files

          Comment

          • rongvang
            Thành viên mới
            • Sep 2006
            • 3

            #6
            Anh ơi cho em hỏi một chút. Em thấy có hàm băm xung như sau:

            void bamxung(unsigned char dutycycle ,unsigned char motorselect)
            Khi gọi hàm thì em gọi :

            bamxung(200,motor_right)
            ở trên thì 200 là cái gì hả anh?
            Và làm sao để tính được tần số của xung? Mong anh chỉ rõ cho em. Cảm ơn anh nhiều!

            Comment

            • Ho Minh
              Thành viên chính thức
              • Sep 2007
              • 68

              #7
              Anh ơi cho em hỏi một chút. Em thấy có hàm băm xung như sau:

              void bamxung(unsigned char dutycycle ,unsigned char motorselect)
              Khi gọi hàm thì em gọi :

              bamxung(200,motor_right)
              ở trên thì 200 là cái gì hả anh?
              Và làm sao để tính được tần số của xung? Mong anh chỉ rõ cho em. Cảm ơn anh nhiều!
              Hì hì, nói 1 chút nhé nếu có sai mong anh em bỏ quá cho.
              theo mình biết thì cái dutycycle chính là độ rộng xung của bạn đó (bạn nhập sai roài 200% ah .... hic hic ), còn cái motoselect chính là động cơ mình chọn ngay trong ví dụ của em thì đó là Righ- motor.
              Ok

              Comment

              • Innovated
                Thành viên chính thức
                • Aug 2007
                • 68

                #8
                Để băm xung cần :
                - Đưa ra tần số băm xung mong muốn : ví dụng bạn muốn băm xung tần số là f = 5kHz chẳng hạn,
                - Giả sử ta sử dụng timer, ta cần tính được thời gian ngắt của timer. Thời gian ngắt tính thế nào? Xuất phát từ tần số xung mong muốn, có thời gian xung là T=1/f ; thời gian ngắt tính tương đối chính xác là T/100. Với 8051 là ta đã xác định được giá trị cần nạp cho thanh ghi timer
                - Trong chương trình ngắt timer ta cần làm gì ? ngoài các phần lằng nhằng khác, công việc chính sẽ là tăng 1 cái biến đếm (giả sử count), sau đókiểm tra biến đếm nếu đếm đến hết (100) thì reset lại biến đếm, tiếp sau đó kiểm tra, nếu biến đếm nhỏ hơn một số (số này chính là độ rộng xung mong muốn- nên để là một biến để có thể nhập từ ngoài- phục vụ cho việc điều chỉnh tự động- giả sử biến là duty) thì sẽ đưa chân băm xung lên cao, ngoài khoảng đó thì đưa xuống mức thấp,
                đây là một VD một đoạn trong ngắt timer :
                // giả sử ban đầu cho count=0;
                .
                .
                .
                .
                count++;
                if (count==100) count=0;
                if (count<duty) P1^1=1;
                else P1^1=0;
                .
                .
                .
                }
                Khi đó bạn có thể viết một hàm băm xung như bạn:
                void bamxung(unsigned char dutycycle)
                {
                duty=dutycycle; // chu y bien duty la bien toan cuc
                }

                Chúc thành công!
                Last edited by Innovated; 26-09-2007, 16:33.
                "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

                Comment

                • agnort
                  Thành viên tích cực
                  • May 2007
                  • 156

                  #9
                  các bạn cho mình 1 đoạn ASM

                  mình chỉ biết ngôn ngữ asm thôi bạn viết ví dụ cho mình học hỏi với, ví dụ như mình muốn tăng giảm khoảng 5 cấp thôi

                  Comment

                  • nthien98
                    Thành viên mới
                    • Jan 2010
                    • 1

                    #10
                    may bai nay xam qua.neu biet thi nguoi ta hoi lam gi!!

                    Comment

                    • hongson23_6
                      Thành viên mới
                      • Jan 2009
                      • 5

                      #11
                      cho mình hỏi có ai biết chương trình điểu chỉnh độ rộng xug PWM bằng chương trình assembly cho con 89s ko vậy..mình cảm ơn much...!!!

                      Comment

                      • songnguu
                        Thành viên mới
                        • Jul 2009
                        • 1

                        #12
                        thay đổi độ rộng xung !dung ic họ 74. hoac dung ic 555
                        thay đổi chu kỳ xung + hoặc _. điều khiển cho mosfet...

                        Comment

                        • 89v51
                          Thành viên chính thức
                          • Dec 2009
                          • 62

                          #13
                          Nguyên văn bởi hongson23_6 Xem bài viết
                          cho mình hỏi có ai biết chương trình điểu chỉnh độ rộng xug PWM bằng chương trình assembly cho con 89s ko vậy..mình cảm ơn much...!!!
                          hồi xưa cũng viết bằng asm nhưng dần về đây mình đã chuyển hẳng qua viết bằng c rồi nó hay hơn asm nhiều và viết những chương trình với các thuật toán khó thì làm cho ta dể dàng hơn nếu bạn chuyển sang c thì mình có thể giúp bạn được. bạn nên dùng con 89v51 đi nó tuy mắt nhưng khó die lắm. ah mà quên con 89v51 có 4 chân điều xung rồi độ phân giải là 8 bit cứ khai báo là xài thôi còn muốn nân độ phân giải thì chỉ có cách dùng timer 16 bit viết lệnh cho nó là được thôi
                          Last edited by 89v51; 28-03-2010, 14:29.
                          WHO AM I ??????????????

                          Comment

                          • 89v51
                            Thành viên chính thức
                            • Dec 2009
                            • 62

                            #14
                            Nguyên văn bởi hongson23_6 Xem bài viết
                            cho mình hỏi có ai biết chương trình điểu chỉnh độ rộng xug PWM bằng chương trình assembly cho con 89s ko vậy..mình cảm ơn much...!!!
                            đây là chương trình viết bàng c sử dụng timer nhưng có giao tiếp máy tính và hoàng toàn có thể mô phỏng trên protues mình chỉ up chương trình thôi để bạn tham khảo còn phần còn lại bạn tự nghiên cứu nha chương trình mình đã test trên protues chạy tốt.


                            #include "REG51M.h"
                            #include <stdio.h>
                            #include <math.h>
                            #include <string.h>
                            bit nhan;
                            int dem,index;
                            sbit PWM=P1^3;
                            char st_nhan[1];
                            char ss,phantram;
                            void delay(int timer)
                            { while (timer--)
                            { unsigned char j=125;
                            while (j--);
                            };
                            }

                            void ngatnoitiep() interrupt 4
                            { if (RI==1)
                            {
                            ss=SBUF;
                            if (ss==':')index=0;
                            if (ss=='#') { st_nhan[index++]=ss;
                            st_nhan[index]='\0';
                            index=0;
                            nhan=1;


                            }

                            else st_nhan[index++]=ss;
                            RI=0;TI=1;
                            }
                            }

                            void ngat_timer0() interrupt 1
                            { TR0=0;
                            TF0=0;
                            dem++;
                            if(dem>=phantram) {PWM=0;}
                            else {PWM=1;}
                            if (dem==99) dem=0;
                            TR0=1;
                            }

                            void init()
                            { //CMOD=0x00;
                            //CR=1;
                            //CCAPM4=0x42;
                            ////////////////
                            EA=1;// cho phep dung ngat
                            ES=1;//cho fep ngat noi tiep
                            TMOD|=0x02;//timer0 mode 2 reload
                            //thiet lap tan so baut
                            SCON=0x50;//unrat che do 8 bit
                            TMOD|=0x20;//timer 1 che do 2
                            TH1=0xFD;//chon toc do baut 9600
                            TR1=1; //cho phep timer 1


                            EA=1;//cho phep cac ngat
                            ET0=1;//cho phep ngat timer0

                            TR0=1;
                            }

                            main()

                            { //int i;
                            init();
                            while(1)
                            { //for(i=255;i>0;i--)

                            //{CCAP4H =st_nhan[0];delay(20);}

                            if (nhan==1)
                            {nhan=0;phantram=st_nhan[1];TH0=(- st_nhan[2]);//TL0=(- st_nhan[2]);
                            }
                            }
                            }
                            WHO AM I ??????????????

                            Comment

                            • vanlinh_dta2
                              Thành viên mới
                              • Sep 2010
                              • 3

                              #15
                              các bác ơi e dang ngiên cứu về điều khiển động cơ DC dùng 89c51, điều khiển động cơ chạy ngược xuôi, nhanh chậm mà chưa biết viết thế nào bác nào biết thì viết dup e cái code bằng hợp ngử với nhé vì e mới vào nghề nên đang gà lắm mong các bác giúp đở em cảm ơn các bác nhiều.\
                              các bác gửi cho em qua mail này nhé. \
                              vvlinhk03dta2@gmail.com or ngonsongdaiduong_1989@yahoo.com.vn

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...