![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Nhập môn đệ tử
Tham gia ngày: Jul 2009
Bài gửi: 8
: |
pwm asm pic6f877a
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 |
![]() |
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Mar 2010
Bài gửi: 10
: |
![]() 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 |
![]() |
![]() |
![]() |
#3 |
Đệ tử 3 túi
Tham gia ngày: Nov 2011
Bài gửi: 58
: |
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 |
![]() |
![]() |
![]() |
|
|