View Full Version : Giúp mình băm xung điều khiển độ sáng đèn led
Mình viết một chương trinh băm xung cho pic16f877a để điều khiển độ sáng của đèn led. Nhưng không hiểu tại sao hai con led cứ nhấp nháy liên tục. Mong mọi người giúp mình vấn đề này. Sau đây là code của chương trinh, mạch mình có gửi file ảnh kèm theo.
#include <16f877a.h>
#fuses nowdt,noprotect,put,xt
#use fast_io(c)
#use delay(clock=4000000)
void led(int8 v1,int8 v2)
{
set_pwm1_duty(v1);
set_pwm2_duty(v2);
}
void main()
{
set_tris_c(0); // portc output.
output_c(0x00);
setup_timer_2(t2_div_by_16,249,1);
setup_ccp1(ccp_pwm); //2 chan ccp1 va ccp2 la 2 chan bam xung
setup_ccp2(ccp_pwm);
led(0,0);// hai led gan vao 2 chan 16,17 deu tat
led(125,125);//sang trong 1s
delay_ms(1000);
led(200,200);//sang hon 1 chut
delay_ms(1000);
led(255,255);
delay_ms(1000);// sang han
}
love_ac
17-10-2008, 07:26 AM
Theo mình phải hiệu chỉnh lại bước mô phỏng trong proteus.code của bạn mình thấy thế này
-led(0,0) nếu không có một độ trễ thì nó không có ý nghĩa gì
-code này sau 3s nó sẽ luôn tồn tại ở trạng thái cuối(led(255,255)
Nếu code này chạy mạch thực thì ok bạn ah
hopeman
17-10-2008, 09:33 AM
setup_timer_2(t2_div_by_16,249,1);
led(255,255);
hai dòng này không hợp lý này, bạn set tối đa là ở mức 249, nhưng lại dùng ở mức 255
bạn nên sửa lại
- thêm vòng while để lặp lại trạng thái sáng tối nhiều lần
- giảm trị số cho led hoặc tăng biên độ cho PWM bằng các setup lại timer
:)
Theo mình phải hiệu chỉnh lại bước mô phỏng trong proteus.code của bạn mình thấy thế này
-led(0,0) nếu không có một độ trễ thì nó không có ý nghĩa gì
-code này sau 3s nó sẽ luôn tồn tại ở trạng thái cuối(led(255,255)
Nếu code này chạy mạch thực thì ok bạn ah
Cám ơn bạn đã trả lời. Như vậy theo như bạn nói thì proteus mô phỏng không chính xác phải không? Vậy có phần mềm nào mô phỏng chính xác hơn không?
setup_timer_2(t2_div_by_16,249,1);
led(255,255);
hai dòng này không hợp lý này, bạn set tối đa là ở mức 249, nhưng lại dùng ở mức 255
bạn nên sửa lại
- thêm vòng while để lặp lại trạng thái sáng tối nhiều lần
- giảm trị số cho led hoặc tăng biên độ cho PWM bằng các setup lại timer
:)
Theo mình thì lệnh setup_timer_2(t2_div_by_16,249,1) là để khởi tạo cho timer2, ở đây mình dùng thạch anh 4Mhz, bộ chia tần số là 1:16, như vậy timer2 sẽ bị tràn sau 4ms. Còn lệnh led(255,255) là để băm với độ rông xung là 100%. Theo mình không có gì không hợp lí cả, mong bạn giải thích hộ mình lần nữa.
love_ac
17-10-2008, 10:49 PM
--"Như vậy theo như bạn nói thì proteus mô phỏng không chính xác phải không".Không đúng bạn ạ.Nó chính xác đó,nhưng do nó chạy trên hệ điều hành window nên nó không phải là hệ thời gian thực ,do đó bạn mô phỏng nó nhấp nháy thôi(dĩ nhiên là có cách chỉnh lại phần mềm này cho nó không nhấp nháy nữa).Bạn có thể quan sát thời gian băm xung nhờ oscilloscope ngay trong phần mềm có đó
--Thứ hai câu lệnh setup_timer_2 (mode,period,postscale)
mode bạn biết rồi
period :xác định giá trị mà tại đó bắt đầu đếm lại (dải 0-255)
postscale sẽ xác định sau bao nhiêu lần bắt đầu đếm lại bên trên mà nó xảy ra ngắt.
với set(t2_div_by_16,249,1) sẽ cho ta cycle time là :4ms hay tần số 250Hz
--Tôi tạm gọi giá trị V(cycle)=period+1(tương ứng với Tcycle=4ms)
và V(duty)=v1--tương ứng thời gian mà pwm ở mức cao trong 4ms đó bạn.Thế giờ áp dụng cho bài của bạn :
---->V(cycle)=249+1=250----tương ứng với Tcycle=4ms
---->V(v1=125)----->Tduty=4/2=2ms đúng không.Điều này nói lên độ sáng so với cao nhất là =1/2 đúng không
Và cũng từ giá trị Vcycle bạn thấy bạn chỉ cần gọi đến led(250,250)đã cho bạn 100% rộng xung rồi .
Bạn xem thêm hình tôi gửi kèm phía dưới cho led(125,125)
hopeman
18-10-2008, 12:42 AM
thế này nhé, bạn set timer 2 chính là timer điều khiển PWM của bạn
vì thế nên con số 249 tức là bạn có thể để độ rộng xung từ 0-249 tương ứng độ đầy xung là từ 0-100%
vì thế nên khi bạn set ở 255 tức là ngoài vùng này rồi
bạn xem thêm file ex_pwm.c của ccs để hiểu thêm nhé
:)
love_ac
18-10-2008, 07:59 AM
Tôi đảm bảo bạn gọi led(249,249) sẽ không được đầy xung 100%.Nếu bạn gọi Led(a,a) mà a>period+1 thì đầu ra sẽ cho ở sóng ra chu kì T=2*4ms=8ms,mà Tduty=4ms
anhthao10
04-11-2011, 08:57 PM
pro nào giúp E 1 ví dụ về băm xung điều khiển độ sáng led dùng VDK họ 89. e định làm led sao băng. hoac điều chỉnh sáng tối của cái biển LED ý mà
vBulletin® v3.8.11, Copyright ©2000-2025, vBulletin Solutions Inc.