Thông báo

Collapse
No announcement yet.

PWM Code

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

  • PWM Code

    Các anh cho em hỏi xíu:
    Chương trình dưới đây tạo xung có t=0.001s thì em hiểu ,nhưng em hỏi là ở chỗ em không hiểu những câu lệnh nào để tạo ra duty cycle=0.0005s.
    Và với một vài lệnh này ở trong chương trình có phải là đưa tín hiệu analog vào chân AN0 phải không?
    việc chọn Fosc/8[7-6] để làm gì vậy?

    clrf ADCON1 ;left justified, all inputs a/d
    bcf STATUS,RP0 ;bank 0
    movlw B'01000001' ;Fosc/8 [7-6], A/D ch0(channel 0) [5-3], a/d on [0]
    movwf ADCON0

    Và có phải là chương trình ở dưới đây điều chế xung từ tín hiệu analog ở chân AN0 và đưa ra chân RC2/CCP1 không?
    Cho em hỏi thêm nữa là :ta có thể tự điều chế xung theo tần số mình mong muốn ,cần gì phải nhận tín hiệu analog rồi sau đó mới điều chế xung?

    Code:
    ;============================
    ;CHUONG TRINH DIEU CHE DO RONG XUNG
    ;============================
    
    ;====KHAI BAO CHUONG TRINH===
    ;DUNG PIC DE TAO RA XUNG CO:
    ;T = 0.001(S) HAY F = 1000HZ
    ;DUTY CYCLE : 50%
    ;THACH ANH 4MHZ NEN T(OSC) = 0.25*10^(-7)(S)
    ;============================
    
    
    		#INCLUDE <P16F877A.INC>		;CHEN THU VIEN LIEN KET CHO CHUONG TRINH
    		__CONFIG   	3F71H			;CAU HINH CAC BIT HE THONG
    		ERRORLEVEL	-302
    
    ;=====DINH NGHIA CAC THONG SO==
    		#DEFINE		PWM		PORTC,2 	; CHAN XUAT XUNG PWM
    ;==============================
    
    		ORG		0H
    		GOTO	MAIN
    ;====KHAI BAO CAC VUNG RAM TRONG CT====
    		CBLOCK	0X20
    		ADRESH_TEMP
    		ADRESL_TEMP		
    		ADRESL_TEMP1		
    		ENDC
    ;=======================================
    
    ;===========BAT DAU CHUONG TRINH===================
    MAIN
    
    		;==XOA TAT CA CAC PORT VA NGAT===
    		
    		CLRF	PORTA
    		CLRF	PORTB
    		CLRF	PORTC
    		CLRF	PORTD
    		CLRF	PORTE
    		CLRF	INTCON
    		;==============
    
    		CALL	ADC_MODULE
    		;====BAT DAU TAO XUNG PWM =======
    
    ;==BUOC 1==
    ;SET CHU KI CHO PWM BANG CACH GHI GIA TRI VAO PR2
    ;PR2 = (PWM Period/(4 * Tosc * TMR2 Prescale)) - 1
    ;PR2 = (0.001/(4 * 2.5 * 10-7 * 4)) - 1 = 249
    
    		BSF		STATUS, RP0 	;CHON BANK 1 DE THAO TAC VOI PR2
    		MOVLW	D'249'
    		MOVWF	PR2
    
    ;==BUOC 2==
    ;SET PWM DUTY CYCLE BANG CACH GHI CAC GIA TRI THICH HOP VAO CCPR1L VA
    ;CAC BIT CCP1CON<5:4>
    ;CCPR1L = ADRESH_TEMP 
    ;CCP1CON<5:4> = ADRESL_TEMP<5:4>
    
    		BCF		STATUS, RP0  ; TRO VE BANK 0 DE THAO TAC VOI CCPR1L VA CCP1CON VA CAC BIEN TAM
    		MOVF	ADRESH_TEMP,W
    		MOVWF	CCPR1L
    		MOVF	ADRESL_TEMP,W
    		ANDLW	B'11000000'
    		MOVWF	ADRESL_TEMP1
    		BCF		STATUS,C		
    		RRF		ADRESL_TEMP1,1		
    		RRF		ADRESL_TEMP1,1		
    		MOVF	ADRESL_TEMP1,W
    		MOVWF	CCP1CON
    ;==BUOC 3==
    ;SET CHAN CCP1 LA NGO RA CUA XUNG PWM BANG CACH XOA CHAN 2 CUA TRISC
    		BSF		STATUS, RP0   ;CHON BANK 1 DE THAO TAC VOI TRISC
    		MOVLW	B'11111011'
    		ANDWF	TRISC
    
    ;==BUOC 4==
    ;SET TMR2 PRESCALE VALUE VA KHOI DONG TIMER2 THONG QUA GHI CAC GIA 
    ;TRI VAO T2CON
    		BCF		STATUS, RP0 ; TRO VE BANK0 DE THAO TAC VOI T2CON
    		MOVLW	B'00000101' ; TMR2 ON , PREWCALE = 1:4 
    		MOVWF	T2CON
    					
    ;==BUOC 5==
    ;XAC DINH THONG SO CUOI CUNG CHO THANH GHI CCP1CON DE PWM HOAT DONG
    		MOVF	CCP1CON,W
    		ANDLW	B'00110000'
    		IORLW	B'00001111' ; CHON CHE DO PWM
    		MOVWF	CCP1CON
    		GOTO MAIN
    
    ;===ADC=============================================================
    ADC_MODULE
    	    bsf     STATUS,RP0      ;bank 1
            bcf     STATUS,RP1
        ;   movlw   H'00'
        ;   movwf   TRISC           ;portc [7-0] outputs
            clrf    ADCON1          ;left justified, all inputs a/d
            bcf     STATUS,RP0      ;bank 0
            movlw   B'01000001'     ;Fosc/8 [7-6], A/D ch0(channel 0) [5-3], a/d on [0]
            movwf   ADCON0
    ;Main
            ;call    ad_portc
            ;goto    Main
    
    
    ;ad_portc
                                    ;wait for acquision time (20uS)
                                    ;(non-critical for this test)
    
            bsf     ADCON0,GO       ;Start A/D conversion
    Wait
            btfsc   ADCON0,GO       ;Wait for conversion to complete
            goto    Wait
    
            movf    ADRESH,W        ;Write A/D result to PORTC
            movwf	ADRESH_TEMP
    		movf	ADRESL,W
    		movwf	ADRESL_TEMP
    		;movwf   PORTC           ;LEDs
            ;return
    
    return
    
    ;====================================================================
    
    
    END

  • #2
    Không để ý là có post này không được ai trả lời.

    Chương trình trên đặt chu kỳ (tần số) của xung ra bằng cách đặt giá trị thích hợp vào PR2 (thanh ghi chu kỳ của Timer 2, dùng cho module CCP), còn duty cycle sẽ được lấy từ giá trị analog đọc vào, và đặt vào tổ hợp thanh ghi CCPR1L:CCP1CON<5:4> (CCPR1L chứa 8 bit cao nhất, CCP1CON<5:4> chứa 2 bit thấp nhất của duty cycle). Chỉ cần đặt PR2 và tổ hợp CCPR1L:CCP1CON<5:4> là có thể thiết lập chu kỳ và duty cycle của tín hiệu PWM tại ngõ ra của CCP module. Tất nhiên để CCP module làm việc thì cần thiết lập thêm các điều kiện khác.

    Thân,
    Biển học mênh mông, sức người có hạn

    Comment


    • #3
      pwm_mode

      nếu chương trình trên em nạp cho pic16f876a ,dùng thạch anh 12meg ,tín hiệu analog cho vào chân AN0 thì nó có chạy không , ở chân RC2 có cho ra xung không?

      Comment


      • #4
        Nếu chỉ để đọc analog vào và thay đổi độ rộng xung thì chương trình trên có thể dùng được, mặc dù chẳng mấy ai viết chương trình theo kiểu như vậy.

        Thân,
        Biển học mênh mông, sức người có hạn

        Comment


        • #5
          Pwm

          viết chương trình theo kiểu này rất ít người viết ,vì sao vậy anh?
          (thường thì đọc tin hiệu analog vào để dùng vào những việc gì là chủ yếu)

          Comment


          • #6
            minh cung dang biet chuong trinh dieu che pwm theo dau vao adc. Nhung biet theo CCS, doc chuong trinh nay chang hieu gi.
            Ban nao viet roi cho minh tham khao ti chut.
            Cam on nhieu.

            Comment


            • #7
              Chào bạn friend ,khi viết chương trình lấy AD và điều khiển PWM , bạn nên đồng bộ việc lấy mẫu AD và xuất PWM .Việc này thực hiện bằng ngắt ADC và ngắt PWM.Lấy mẫu AD nên thực hiện tự động và điều khiển bởi PWM.Nên chọn chu kỳ PWM đủ lớn để AD lấy mẫu.Dưới là đoạn code C cho bạn tham khảo :
              void __attribute__((__interrupt__)) _PWMInterrupt(void)//khai bao ngat PWM
              {
              IFS2bits.PWMIF = 0;//xoa co ngat PWM
              ADCValue = ADCBUF0; // nhap ADC ve
              ADCDong = ADCBUF3;
              ADCON1bits.ADON = 1;//chay ADC
              }
              //################################################## ############
              void __attribute__((__interrupt__)) _ADCInterrupt (void)
              {
              IFS0bits.ADIF = 0; // xoa co ngat ADC
              ADCON1bits.ADON = 0;//dung ADC
              }

              Comment


              • #8
                Nguyên văn bởi duycuong289 Xem bài viết
                Chào bạn friend ,khi viết chương trình lấy AD và điều khiển PWM , bạn nên đồng bộ việc lấy mẫu AD và xuất PWM .Việc này thực hiện bằng ngắt ADC và ngắt PWM.Lấy mẫu AD nên thực hiện tự động và điều khiển bởi PWM.Nên chọn chu kỳ PWM đủ lớn để AD lấy mẫu.Dưới là đoạn code C cho bạn tham khảo :
                void __attribute__((__interrupt__)) _PWMInterrupt(void)//khai bao ngat PWM
                {
                IFS2bits.PWMIF = 0;//xoa co ngat PWM
                ADCValue = ADCBUF0; // nhap ADC ve
                ADCDong = ADCBUF3;
                ADCON1bits.ADON = 1;//chay ADC
                }
                //################################################## ############
                void __attribute__((__interrupt__)) _ADCInterrupt (void)
                {
                IFS0bits.ADIF = 0; // xoa co ngat ADC
                ADCON1bits.ADON = 0;//dung ADC
                }
                Bạn friends hỏi về ADC trong PIC16F, còn code C của bạn là dành cho dsPIC. Hy vọng bạn để ý hơn khi post bài.

                Thân,
                Biển học mênh mông, sức người có hạn

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                • nguyendinhvan
                  Trả lời cho Vấn đề về tốc độ quay
                  bởi nguyendinhvan
                  Sử dụng động cơ servor, hoặc lắp thêm một cái encoder vào động cơ bước. Encoder sẽ kiểm soát động cơ có quay hoặc đứng im.
                  14-12-2025, 19:50
                • Andrea14
                  Vấn đề về tốc độ quay
                  bởi Andrea14
                  Chào mọi người,

                  Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
                  12-12-2025, 12:42
                • bqviet
                  Trả lời cho Đấu tắt điện cho máy tính bảng
                  bởi bqviet
                  Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
                  06-12-2025, 17:17
                Đang tải...
                X