![]() |
|
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 | |
Đệ tử 6 túi
Tham gia ngày: Oct 2006
Bài gửi: 147
: |
pwm của 16F877A
Trích:
ko biết tại sao nữa.mong các bác chỉ dùm cái???? thank!!!!! |
|
![]() |
![]() |
![]() |
#2 |
Trưởng lão PIC bang
|
Đề nghị bạn đọc mục 8.3.3 - SETUP FOR PWM OPERATION trong datasheet của PIC16F877A. Bạn sẽ thấy rằng CCP1 và CCP2 ở chế độ PWM sẽ dùng chung Timer2 làm bộ đếm thời gian chu kỳ. Bạn cũng dựa vào bảng 8-3 để xác định phạm vi cho phép của duty cycle, khi đã chọn giá trị cho PR2. Ngay cả khi dùng độ phân giải 10-bit cho duty cycle, bạn cũng không thể đặt duty cycle = 1024 (như bạn đã thực hiện trong code của bạn), vì 1024 không thể chứa trong 10 bit.
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
![]() |
![]() |
![]() |
#3 |
Đệ tử 4 túi
Tham gia ngày: Mar 2007
Nơi Cư Ngụ: Da Nang
Bài gửi: 69
: |
Bạn phải kích hoạt T2 bằng cách dùng hàm setup_timer_2(T2_DIV_BY_16,255,1) thì module PWM mới hoạt động. Các thông số trong hàm này bạn có thể thay đổi có tần số mong muốn.
Bạn nên dùng PWM 8 bit trước sau đó mới nghĩ đến 10bit. Theo tôi sử dụng 8 bit là đủ rồi. Đoạn Code sửa lại như sau: Code:
#include "16F877a.h" #device *=16 #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES RC //Resistor/Capacitor Osc with CLKOUT #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #FUSES NOWRT //Program memory not write protected #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) //#use fast_io(b) void main() { //int8 i; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,255,1); // KICH HOAT T2 TAI DAY, BAN CO THE THAY DOI CAC THONG SO TRONG HAM NAY DE CO TAN SO MONG MUON setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); while(1) { setup_ccp1(ccp_pwm); set_pwm1_duty(0); setup_ccp2(ccp_pwm); set_pwm2_duty(50); delay_ms(300); setup_ccp1(ccp_pwm); set_pwm1_duty(128); setup_ccp2(ccp_pwm); set_pwm2_duty(100); delay_ms(300); setup_ccp1(ccp_pwm); set_pwm1_duty(255); setup_ccp2(ccp_pwm); set_pwm2_duty(200); delay_ms(300); } } Mạch mô phỏng dưới đây: Chúc thành công! thay đổi nội dung bởi: namqn, 14-03-2008 lúc 04:30 PM. |
![]() |
![]() |
![]() |
#4 | |
Đệ tử 6 túi
Tham gia ngày: Oct 2006
Bài gửi: 147
: |
![]() Trích:
hóa ra pải dùng timer2 cho pwm,lại còn quên số bít nũa.hic.....mình GÀ thật !! thank! tối mình về làm có gì hỏi tiếp nha... |
|
![]() |
![]() |
![]() |
#5 |
Đệ tử 2 túi
Tham gia ngày: May 2008
Bài gửi: 28
: |
Em làm đoạn code như sau. Mặc định PWM là 8bit. Làm thế nào để khai báo PWM 10 bit?
setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); setup_timer_2(T2_DIV_BY_1,254,1); set_pwm1_duty(100); set_pwm2_duty(200); |
![]() |
![]() |
![]() |
|
|