View Single Post
Old 11-08-2008, 06:01 PM   #50
cong1810
Đệ tử 4 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 62
:
Send a message via Yahoo to cong1810
Trích:
Nguyên văn bởi ngtdung.nguyen View Post
Em dùng Wizard của CCS 4.065, tạo chương trình xuất xung PWM cho PIC6F877A như sau:
(mục đích là tần số điều xung= 10kHz, 2 xung độ rộng 30% và 80%)

#include "F:\TRANNING-PIC\PWM.H"

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4,124,1); //tần số PWM = 10kHz
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_tris_c(0x00);
set_pwm1_duty(150); // độ rộng xung 30%
set_pwm2_duty(400); // độ rộng xung 80%
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

while (1);
}

Mô phỏng bằng Proteus 7.2 cho thấy xung ra bị sai, cả về tần số và độ rộng xung
(xin lỗi các bác em chưa biết cách post hình lên)

Khi cài lại duty cycle, thì mô phỏng cho thấy xung ra đúng:

set_pwm1_duty(37);
set_pwm2_duty(100);


2 trường hợp này sai lệch nhau ở hệ số nhân 4 là hệ số chia tần đưa vào timer2.
Em đọc Data sheet thấy trường hợp 1 do CCS tự tính giá trị value là hợp với miêu tả về PWM. Tuy nhiên mô phỏng thấy sai.

Em có mạch chạy PIC tuy nhiên không có Oscilocope nên không biết thực tế ra sao.
Em không biết đây là do CCS sai hay do Proteus mô phỏng sai.

Mong các bác giải đáp giúp em với. Em xin cám ơn.

mình cũng mới tìm hiểu về PIC và PWM!
vần đề của bạn là ở chỗ duty(150) và 400. đó là 150 là 1 số int còn 400 là số long int.cái này được đề cập trong VDu PWM của CCS c.nếu là duty là số int thì công thức tính: value=4*duty/clock*t2div.
nếu là số long int thì value=duty/clock*t2div.
thân!!
cong1810 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn