Thông báo

Collapse
No announcement yet.

PWM - tutorial

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

  • #16
    Pwm

    Nguyên văn bởi maxx Xem bài viết
    Theo hiểu biết nông cạn của mình PWM (Pulse Width Modulator) là một dạng điều khiển theo chu kỳ hay xung nhịp của hệ thống (Gọi nôm na là điều khiển bằng cách Băm Xung), trên thực tế có cả những loại IC chuyên dụng để điều khiển và một số loại MCU được tích hợp khả năng điều khiển này. Hiểu một các đơn giản nhất PWM hoạt động tương tự như đóng mởi một cái công tắc nhiều lần trong 1 giây ( hàng ngàn lần) coi như thời gian đóng và ngắt công tắc đó là như nhau, vậy thì khi điều khiển tốc độ dộng cơ số lần đóng ngắt nhanh hay chậm trong 1 giây thì ảnh hưởng đến tốt độ chạy của động cơ trong 1 giây.

    ................................

    Đây là một trong những kiểu điều khiển ứng dụng rộng rãi nhất và mong có nhiều đóng góp từ phía các cao thủ để giúp anh em trong vấn đề này
    Thân
    LanHuong học và sử dụng PWM khá nhiều mà đọc "cách hiểu" của bạn cũng thấy lạ. Trong cái tên Pulse Width Modulator đã nói rõ PWM là phương thức điều khiển bằng độ rộng xung kia mà. Trong PWM, tổng công suất điều động từ nguồn lên tải lệ thuộc vào độ rộng của xung dưới một tần số đóng ngắt ổn định .

    Thành viên LanHuong (not Mod).

    Comment


    • #17
      Nguyên văn bởi lanhuong Xem bài viết
      LanHuong học và sử dụng PWM khá nhiều mà đọc "cách hiểu" của bạn cũng thấy lạ. Trong cái tên Pulse Width Modulator đã nói rõ PWM là phương thức điều khiển bằng độ rộng xung kia mà. Trong PWM, tổng công suất điều động từ nguồn lên tải lệ thuộc vào độ rộng của xung dưới một tần số đóng ngắt ổn định .

      Thành viên LanHuong (not Mod).
      Tại có nhiều lúc trình bày cho rõ ràng lai khiến người mới đọc cảm thấy nặng nề về lý thuyết,nên phải chọn một cách hiểu thật là bình dân học vụ để ai cung có thể làm quen, còn khi gặp khó khăn thực sự thì tự giác người ta sẽ chịu khó mò trong mớ lý thuyết

      Comment


      • #18
        Cuối cùng thì cũng tìm ra dc, đây là vài ví dụ về thuật toán điều xung của 2 động cơ sử dụng PWM
        KỸ THUẬT ĐIỀU XUNG PWM
        MCU P89V51RD2 Có 5 kênh điều xung (PWM) từ P1.3 - P1.7. Sử dụng rất đơn
        giản và linh hoạt cho việc điều xung. Nếu mạch công suất được thiết kế dạng mạch
        cầu H thì ta điều khiển được 2 động cơ. Tuy nhiên ta có thể điều xung được cho 5
        động cơ nếu mạch công suất được thiết kế bao gồm 1 FET và 1 Rơle.Trong bài này
        chúng tôi lấy 1 ví dụ là chương trình điều khiển vận tốc động cơ tăng dần và giảm
        dần . Các điều kiện được khai báo ở đầu chương trình là bắt buộc, nên đọc trước
        Datasheets để hiểu rõ hơn. Chúc các bạn thành công.
        Ví dụ :
        $mod51fx ;include <mod51fx> : Định nghĩa các biến thanh ghi
        (CCAP0H,CCAP1H,...)
        ;================ DEFINE BIT =================
        ;-------- MOTOR
        MOTOR1 DATA CCAP0H ; P1.3
        MOTOR2 DATA CCAP1H ; P1.4
        MOTOR3 DATA CCAP2H ; P1.5
        MOTOR4 DATA CCAP3H ; P1.6
        MOTOR5 DATA CCAP4H ; P1.7
        ;-------- START
        BIT_START BIT P2.0 ; Nút nhấn start
        ;-------- GIÁ TRỊ ĐIỀU XUNG
        PWM_COUNT BIT 50H ; 0 - 255
        ;=================== MAIN ====================
        ORG 0000H
        MAIN
        ; Cho phép điều xung 5 kênh P1.3 - P1.7
        MOV CMOD,#0 ;Chế độ 6 chu kì xung nhịp = 1/2 chu kì máy
        SETB CR ;Cho phép PCA (programing counter array) hoạt
        động
        MOV CCAPM0,#01000010B ; P1.3 PCA hoạt động ở chế độ PWM 8
        bits
        MOV CCAPM1,#01000010B ; P1.4
        MOV CCAPM2,#01000010B ; P1.5
        MOV CCAPM3,#01000010B ; P1.6
        MOV CCAPM4,#01000010B ; P1.7
        ; * Chương trình điều khiển vận tốc động cơ
        ; từ 0 - max và từ max - 0 trên kênh P1.3
        ; * Vận tốc động cơ từ 0 - max ứng với
        ; PWM_COUNT từ 0 - 255 và ngược lại
        MOV PWM_COUNT,#0 ; Động cơ dừng
        JB BIT_START,$ ; Cho phép động cơ chạy
        RUN_UP: ; 0 – max
        INC PWM_COUNT
        MOV MOTOR1,PWM_COUNT
        LCALL DELAY200MS
        MOV A, PWM_COUNT
        CJNE A,#255,RUN_UP
        RUN_DOWN: ; max - 0
        DEC PWM_COUNT
        MOV MOTOR1,PWM_COUNT
        LCALL DELAY200MS
        MOV A, PWM_COUNT
        CJNE A,#0,RUN_DOWN
        JMP RUN_UP
        SJMP $
        ;-------- DELAY 200MS
        DELAY200MS:
        MOV R2,#2
        LOOP200_1:
        MOV R0,#200
        LOOP200_2:
        MOV R1,#250
        DJNZ R1,$
        DJNZ R0, LOOP200_2
        DJNZ R2, LOOP200_1
        RET
        ;--------
        END

        Comment


        • #19
          Mình cũng đang định viết chương trình nháy led kiểu lấp lánh (sáng lên dần rồi tắt dần). Mình nghĩ chắc là dùng cái PWM này nhưng chưa hiểu gì hết. Bạn nào biết thì post lên cho mình chương trình này với, chỉ cần 1 led thôi. Mình viết bằng CCS.

          Thanx!
          ||

          Comment


          • #20
            Nguyên văn bởi maxx Xem bài viết
            Theo hiểu biết nông cạn của mình PWM (Pulse Width Modulator) là một dạng điều khiển theo chu kỳ hay xung nhịp của hệ thống (Gọi nôm na là điều khiển bằng cách Băm Xung), trên thực tế có cả những loại IC chuyên dụng để điều khiển và một số loại MCU được tích hợp khả năng điều khiển này. Hiểu một các đơn giản nhất PWM hoạt động tương tự như đóng mởi một cái công tắc nhiều lần trong 1 giây ( hàng ngàn lần) coi như thời gian đóng và ngắt công tắc đó là như nhau, vậy thì khi điều khiển tốc độ dộng cơ số lần đóng ngắt nhanh hay chậm trong 1 giây thì ảnh hưởng đến tốt độ chạy của động cơ trong 1 giây. Dựa vào đó ta có thể tạo ra một chế độ PWM cơ bản bằng cách tạo ra một xung vuông bằng MCU thông thường như 8051 hay IC555, thực ra thì không hoàn toàn đúng theo nguyên tắc của PWM nhưng với những bài toán điều khiển đơn giản thì hoàn toàn có thể đáp ứng được
            Về ứng dụng của PWM trong thực tế là rất nhiều, Tốc độ động cơ, độ sáng tối của màng hình LCD, ĐTDĐ, Pha màu cho bảng quang báo, các loại biến tần, các thuật toán điều khiển Robot PI, PD, PID, Điều khiển nhiệt độ, Van Tuyến tính....
            Đây là một trong những kiểu điều khiển ứng dụng rộng rãi nhất và mong có nhiều đóng góp từ phía các cao thủ để giúp anh em trong vấn đề này
            Thân
            đúng là tạo sung để điều khiển Đ.Cơ ví dụ như đ.cơ bước...
            coi như thời gian đóng và ngắt công tắc đó là như nhau, vậy thì khi điều khiển tốc độ dộng cơ số lần đóng ngắt nhanh
            đoạn này thì theo mình ko đúng lắm vì thực chất nó là điều khiển độ rộng của sung. Ta tưởng tượng nôm na với nhau thế này cho dễ hiểu: nếu ta gọi sung đó có độ rộng 100% là giá trị lớn nhất mà nó có đc, vdụ: trong 1s có 100 sung, như cái công tắc của bạn đóng, ngắt 100 lần/s, nhưng thời gian đóng=t1; ngắt=t2; t1 ≠ t2; thì t1 coi như độ rộng của sung tính theo % của giá tri max mà t1 có đc....
            Last edited by daominhchien; 31-03-2011, 22:59.
            Tôi thích cái cầu kỳ của kỹ thuật
            Nhưng ghét mọi phức tạp trong tính cách con người

            Comment


            • #21
              bổ sung: Nếu giả sử thời gian đóng công tắc bằng thời gian ngắt thì ta có tỷ số sung là 50% và.....
              trò này thường đc các thợ quảng cáo lập trình để biểu diễn kiểu sáng dần dần hoặc ngược lại. bằng cách trong khoảng thời gian led sáng họ các chuỗi sung có tỷ số độ rộng khác nhau...VD: 20 sung đầu có tỷ số 30% và 20 sung sau có t.s cao hơn và cứ thế...
              vi dụ: viết cho 8051

              #define led P2_0;
              void sang_dan(float tyso)
              {
              led=1;
              TR0=0;
              TH0=-(unsigned int) (tyso*1000)/256;
              TL0=-(unsigned int) (tyso*1000)%256;
              TR0=1;
              while(!TF0);
              TF0=0;
              led=0;
              TR0=0;
              TH0=-(unsigned int) ((1-tyso*1000)/256;
              TL0=-(unsigned int) ((1-tyso*1000)%256;
              TR0=1;
              while(!TF0);
              TF0=0;
              }
              //---------------.......
              void main(void)
              {
              TMOD=0x01;
              while(1)
              {
              sang_dan(0.25);
              sang_dan(0.50);
              sang_dan(0.75);
              --------- ;
              --------- ;
              }
              }
              Tôi thích cái cầu kỳ của kỹ thuật
              Nhưng ghét mọi phức tạp trong tính cách con người

              Comment


              • #22
                Làm như bác tốn bộ nhớ lắm. Vì dùng đến float rùi. Giải pháp là dùng ngắt timer ấy. Tạo chuẩn luôn, nêu chỉ thử nghiệm thì dùng delay cũng được, tạo ra các khoảng thời gian khác nhau là ra PWM ngay. Hiiii.

                Comment


                • #23
                  đúng đấy bây giờ mình chơi delay nhỏ và thay đổi tỷ số giữa delay sáng và tối, rồi nhét vào vòng lặp for, mỗi vòng lặp thay đổi tỷ số delay sang/tối....là OK
                  Tôi thích cái cầu kỳ của kỹ thuật
                  Nhưng ghét mọi phức tạp trong tính cách con người

                  Comment


                  • #24
                    Bác nào pro về lập trình C cho VDK. cho E 1 ví dụ về băm xung điều khiển độ sáng tối của LED. E muốn lập trình để mô phỏng thử mạch LED sao băng.

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X