Thông báo

Collapse
No announcement yet.

Chương trình tạo PWM bằng 8051

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

  • Chương trình tạo PWM bằng 8051

    Mình viết 1 chương trình tạo PWM sử dụng 8051. Sử dụng timer0 tạo ra các khoảng ngắt cứ 100us 1 lần, còn timer1 thì đưa các giá trị từ TABLE vào TH1 và TL1 để tạo các giá trị thời gian T1 khác nhau từ 0 đến 100us. Cứ hết T1 thì setb cho P2.0 và CLR P2.1. Đồng thời cứ hết T0 thì lại setb P2.1 và clr P2.0, như vậy sẽ tạo ra các xung vuông độ rộng thay đổi trên P2.0 và P2.1. Tuy nhiên chương trình viết ko cho ra khoảng T1 mong muốn mặc dù đã mov giá trị vào TH1 và TL1 đúng công thức tính toán. Mọi người cho ý kiến nhé
    Code:
    #include <sfr51.inc>
    ORG 0000H
    LJMP MAIN                   ; Bo qua bang vector ngat
    
    ; Chuong trinh ISR cho timer0
    ORG 000BH                   ; ISR cho timer0
    SETB P2.0
    CLR P2.1
    RETI 
    
    ;Chuong trinh chinh
    ORG 0030H
    MAIN:   MOV TMOD,#12H       ; Chon timer0 che do 2 va timer1 che do 1
            MOV IE,#82H         ; Cho phep ngat timer0
            MOV TH0,#-92        ; Dat thoi gian cho timer0 la 100us
            SETB TR0            ; Khoi dong timer0
    AGAIN:      
            MOV DPTR,#TABLE     ; Dua con tro DPTR den TABLE
            MOV R0,#200         
    BACK:   
            MOV TH1,#0FFH
            CLR A
            MOVC A,@A+DPTR
            MOV TL1,A
            INC DPTR
            ACALL DELAY
            CLR P2.0
            SETB P2.1
    WAIT:   JNB TF0,WAIT
            DJNZ R0,BACK
            SJMP AGAIN
    DELAY:
            SETB TR1
    AGAIN2:
            JNB TF1,AGAIN2
            CLR TR1
            CLR TF1
            RET
    TABLE:  DB Cho nay dat cac gia tri can nap vao TL1 de lam cho do rong xung thay doi
    END
    Last edited by VNarmy; 24-01-2008, 18:01. Lý do: Sửa tag code

  • #2
    Lần sau làm ơn post code như vậy sẽ dễ dàng cho người đọc, và có vài điều muốn hỏi:

    Code:
    #include <sfr51.inc>
    
    	ORG 0000H			; Bo qua bang vector ngat
    	LJMP MAIN 			;
    
    
    	ORG 000BH 			; ISR cho timer0
    	SETB P2.0			; Chuong trinh ISR cho timer0
    	CLR P2.1			;
    	RETI				; 
    
    
    	ORG 0030H			; Chuong trinh chinh
    
    MAIN:	MOV TMOD,#12H 			; Chon timer0 che do 2 va timer1 che do 1
    	MOV IE,#82H 			; Cho phep ngat timer0
    	MOV TH0,#-92 			; Dat thoi gian cho timer0 la 100us
    	SETB TR0 			; Khoi dong timer0
    
    AGAIN: 	MOV DPTR,#TABLE 		; Dua con tro DPTR den TABLE
    	MOV R0,#200			; Cái này để làm gì??
    BACK: 	MOV TH1,#0FFH			;
    	CLR A				;
    	MOVC A,@A+DPTR			;
    	MOV TL1,A			;
    	INC DPTR			; Inc dptr rồi giá tri kế tiếp là gì
    	ACALL DELAY			; Sao phải Delay ở đây
    	CLR P2.0			;
    	SETB P2.1			;
    
    WAIT: 	JNB TF0,WAIT			;
    	DJNZ R0,BACK			;
    	SJMP AGAIN			;
    
    
    DELAY:	SETB TR1			;
    AGAIN2:	JNB TF1,AGAIN2			;
    	CLR TR1				;
    	CLR TF1				;
    	RET				;
    
    TABLE:	DB 				; Cho nay dat cac gia tri can nap vao TL1 de lam cho do rong xung thay doi
    	END
    Nói thật đọc code của bạn tôi chả thể nào hiểu nỗi.
    Muốn tạo PWM bạn chỉ cần làm như sau:
    Trước hết là phải chọn resolution 8 hay 16 bit, tần số của PWM là tần số của timer overflow.

    Example:
    SysClk = 12MHz
    Timer = 16bit = 65535us để overflow
    T_On = 1000us (port = high)
    Timer preload = 55355
    T_Off = (65535 - T_On) = 55535us (port = low)
    Timer reload = 1000


    Code như sau:
    1/ Preload Timer for T_On (On time)
    2/ Set Port = high
    3/ Enable interrupts
    4/ Start timer
    5/ Wait for timer interrupt
    6/ Change On/Off reload value if needed
    7/ Go back to 5

    Code cho ISR làm như sau:
    1/ Stop timer
    2/ If port = high, set Port = Low => Reload for T_Off (Off time)
    3/ If port = low, set Port = High => Reload for T_On (On time)
    4/ Start timer
    5/ Return from interrupt

    Comment


    • #3
      Uhm, mình định tạo PWM có dạng sóng sine tần số 50Hz. Ý định của mình đó là:
      - Chia 1 chu kỳ 50Hz tức là T=20ms ra thành 200 khoảng nhỏ, mỗi khoảng 100us.
      - Dùng timer0 để tạo ra khoảng 100us này, sử dụng ngắt để cứ 100us thì nó CLR P2.0
      - Dùng timer1 tạo ra những khoảng delay khác nhau, giá trị khoảng delay này thay đổi trong khoảng từ 0 đến 100us do giá trị mình đưa vào TL1, còn TH1 thì để 0FFH
      - Giá trị đưa vào TL1 được lấy từ TABLE
      - Cứ hết khoảng T1 thì SETB cho P2.0 rồi chờ đến khi P2.0 đc CLR thì lại bắt đầu đếm T1 với thời gian đưa vào kế tiếp
      - MOV R0,#200 chính là 200 giá trị được đưa vào TABLE.
      Mong các bạn giúp đỡ!

      Comment


      • #4
        Bạn xem đây là chương trình băm xung 1 kênh sử dụng 1Timer, với độ đầy xung được nhập vào, tất nhiên là tần số băm xung được thay đổi bởi giá trị nạp cho Timer/counter
        Ta hoàn toàn có thể tạo nhiều kênh băm xung bằng 1 timer, nhưng chúng đều có cùng tần số.

        Bạn chỉ cần tính toán giá trị TOP cho bien_phu để đạt tần số 50Hz là được.
        Attached Files
        Last edited by VNarmy; 25-01-2008, 11:01.

        Comment


        • #5
          Xin hỏi:
          1. Có cách nào tính Áp khi điều xung không ?. VD như T xài DC 24V bây giờ T muốn điều xung để áp còn 18V hoặc 20V được không ?
          2. Vì T làm cái Xe lăn Tự Hành xài 2 DC giảm tốc 24V, dùng 2 bình 12V_12AH của xe đạp điện, T muốn giảm áp xuống để tăng thời gian sử dụng của bình, T sẽ giảm áp đến khi nào động cơ vẫn tải nổi thì ngưng điều xung. Hi...

          Comment


          • #6
            Nếu tỷ lệ là 18/24 nghĩa là 3/4=tỉ lệ đầy xung là 75%
            Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

            Comment


            • #7
              Nguyên văn bởi hiodong Xem bài viết
              Nếu tỷ lệ là 18/24 nghĩa là 3/4=tỉ lệ đầy xung là 75%
              Hịc... Vậy nghĩa là sao ?. Giá trị nạp T_on (thời gian Set cho DC), & T_off (thời gian Clear cho DC) là bao nhiêu ?. Tỉ lệ T_on/T_off là bao nhiêu để ra áp là 18V ?.

              Comment


              • #8
                tỷ lệ đầy xung = tỷ lệ xung cao /1 chu kì . Nên T_on 75% , T_off 25% --> T_on/Toff =3.
                Nhưng chú ý chọn lựa tần số băm xung thích hợp . Cao quá thì ko chạy. Thấp quá thì bị giật.
                Cung cấp Oscilocope , Inverter , Switching , DC power supply , AC millivolt meter ....

                Comment


                • #9
                  bạn thelam viết tôi cũng chẳng hiểu mấy, bạn làm ơn viết hẳn ra thành code để tôi xem với, hoặc tôi có thể test trên emulator.
                  Thank!!!

                  Comment


                  • #10
                    Chương trình của bạn lexluthorvn tôi test trên emulator cung ko chay được ma bị dừng ở đoạn
                    AGAIN2: JNB TF1,AGAIN2
                    .Nhờ bạn có thể chỉnh lại chtrinh chuẩn lại được hỏng?!!!
                    Thank nhìu nhìu!!!!!

                    Comment


                    • #11
                      Nhờ bạn TheLam viết code đk motor dc bằng cách PWM hộ với nhé.
                      Đợi mãi mà chả thấy cao thủ nào giúp thế, chắc mải ăn bánh trưng quá rồi.

                      Comment


                      • #12
                        Có bác nào cho em code 1 chương trình băm xung động cơ bằng ngôn ngữ C với . Thanks các bác nhiều !!!!

                        Comment


                        • #13
                          mình tên là hùng, mĩnh cũng đang tìm hiểu về PWM trong 8951. Nhưng mình vẫn chưa hiểu được cách tạo PWM bằng timer .Mình có nguồn 24 VDC và PWM có thể điều chỉnh từ 1V đến 24V.Mong các sư huynh giúp mình với.Thanks!

                          Comment


                          • #14
                            Trong 8051 làm gì có PWM nhỉ ? AVR mới có chứ !
                            Nếu 8051 không có thì mình xử lí PWM bằng 8051 được thôi.
                            Để làm được điều này trước tiên anh bạn phải hiểu thế nào là PWM, hoạt động của Timer, sử dụng ngắt trong 8051... và cuối cùng là thuật toán.
                            Làm xong rồi thì yên tâm cầm con dao băm từng khúc xung rồi

                            Comment


                            • #15
                              Nguyên văn bởi Multi System Xem bài viết
                              Trong 8051 làm gì có PWM nhỉ ? AVR mới có chứ !
                              Nếu 8051 không có thì mình xử lí PWM bằng 8051 được thôi.
                              Để làm được điều này trước tiên anh bạn phải hiểu thế nào là PWM, hoạt động của Timer, sử dụng ngắt trong 8051... và cuối cùng là thuật toán.
                              Làm xong rồi thì yên tâm cầm con dao băm từng khúc xung rồi
                              8051 có 5 kênh PWM từ chân P1.3 đến P1.7

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X