PDA

View Full Version : pwm asm pic6f877a


vuxuansyhut
19-03-2010, 10:35 AM
các anh em ơi, mình đang có vấn đề với pwm pic6f877a mong anh em giup đỡ chỉ bảo.
Ý tưởng của mình chỉ đơn giản là tạo xung pwm với duty có thể thay đổi được. Nhưng khi thực hiện với duty không đổi dã gặp rắc rối rồi. Mình đưa code viết bằng ccs và mplap anh em xem giúp mình nha
ccs
//chuong trinh test pwm
//mcu pic 16f877a
//thuc hien : Vu Xuan Sy
#include<16f877a.h>
#include<def_16f877a.h>
#device *=16,adc=8
#fuses nowdt,noprotect,nolvp,hs,nodebug
#use delay(clock=20000000)
void main()
{
set_tris_c(0x00);
setup_ccp1(CCP_PWM); // Configure CCP1 as a PWM
setup_timer_2(T2_DIV_BY_16, 123, 1);
set_pwm1_duty(62);
}

và bằng mplab
TITLE "CHUONG TRINH SU DUNG MODUN PWM"
PROCESSOR 16F877A
#INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC
ORG 0X000
GOTO START
START
BCF STATUS,RP1 ;CHON BANK 1
BSF STATUS,RP0
MOVLW 0X00 ;CAU HINH PORTC LA PORT RA
MOVWF TRISC
MOVLW D'124' ;NAP GIA TRI 124 CHO PR2 QUYET DINH PERIOD
MOVWF PR2
BCF STATUS,RP0 ;CHON BANK O
MOVLW 0X00 ;PORTC=0
MOVWF PORTC
MOVLW D'62' ;THIET LAP DO RONG XUNG
MOVWF CCPR1L
BCF CCP1CON,4
BCF CCP1CON,5
MOVLW B'00000111'
MOVWF T2CON
BSF CCP1CON,2
BSF CCP1CON,3
LOOP
GOTO LOOP
END

với period =10 khz
duty =0.5
mình dùng proteus để mô phỏng dạng xung pwm

nobody
24-03-2010, 09:38 AM
trích:
Bạn có thể dùng MS Excel để tạo ra bảng dữ liệu trên. Cách làm đơn giản như sau:

- Chọn giá trị đỉnh, ví dụ là 400, khi đó bạn sẽ cộng thêm offset bằng giá trị đỉnh để các giá trị trong bảng luôn luôn không âm.

- Chọn số phần tử trong bảng, ví dụ là 1000

- Trong bảng tính, tạo ra một cột với các giá trị chỉ số chạy từ 0 đến 999 (1000 hàng, tương ứng với 1000 phần tử).

- Ở cột bên cạnh, nhập công thức tính giá trị = 400*sin(giá trị của ô bên trái*2*pi/1000) + 400. Chẳng hạn, giả thiết cột A chứa các chỉ số từ 0 đến 999, ô B1 sẽ có công thức = 400*sin(A1*2*pi/1000) + 400

Sau đó xuất cột B ra một tập tin văn bản, rồi cắt/dán vào mã nguồn, và thêm các dấu "," vào những vị trí cần thiết. Nếu dùng MATLAB thì có thể tự động xử lý toàn bộ phần định dạng, rồi xuất ra tập tin văn bản, sau đó chỉ cần cắt/dán vào mã nguồn.

Lập trình khéo hơn một chút thì chỉ cần lưu 1/4 bảng trên vào flash/ROM là đủ.

Thân,
__________________
em là thành viên mới và đang còn chưa hiểu lắm về PWM ,anh chỉ giúp em tí nha.
anh cho em hỏi ở trên anh nói giá trị 400 là giá trị đỉnh em chưa hiểu lắm ,như vậy nếu em muốn nghịch lưu từ 12V DC sang 220V A thì giá trị đỉnh của em là 12V cũng là giá trị đặt lên cực D của MOSFET đúng không ạ(em dùng cầu H với IRF640).cảm ơn anh mong anh trả lời em sớm nha,để em biết đường mò mẫm và hỏi tiếp

ladykiller
19-11-2011, 12:45 AM
Tình hình là em làm cái PWM này trên mô phỏng ISIS vẫn không chạy không biết có bác nào
xem hộ giúp em
dưới đây là code của em (viết theo các bước của 1 tài liệu p16f877a)

PROCESSOR 16F877A
#INCLUDE<P16F877A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

;--------------------------------------------------------------------------------
ORG 0000H
;--------------------------------------------------------------------------------
BANKSEL TRISC
CLRF TRISC
BANKSEL PORTC
CLRF PORTC
;================================================= ===============================
MAIN
BANKSEL PR2
MOVLW D'250'
MOVWF PR2
BANKSEL CCPR1L
MOVLW D'127'
MOVWF CCPR1L
BCF CCP1CON,5
BCF CCP1CON,4
BSF T2CON,1
BSF T2CON,0
BSF T2CON,2
BSF CCP1CON,3
BSF CCP1CON,2
GOTO $
END