PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Rất Cần Giúp Đỡ Về Code Làm Cho Led Sáng Dần Và Tắt Dần !!!! (http://www.picvietnam.com/forum/showthread.php?t=4376)

xalachxoan 11-11-2009 01:54 PM

Trích:

Nguyên văn bởi nhanh0112 (Post 28158)
Theo tui bạn thử sử dụng PWM với duty cycle thay đổi dần với tần số cố định (Một số cái còi "ngân" của ô tô cũng sử dụng phương pháp này... tiếng nhỏ dần).
Còn về nguyên lý hoạt động thì dutycle càng ngắn thì thời gian sáng của led càng ngắn (chớp nhanh) -> tối và ngược lại.
Như vậy khoảng thời gian để đèn từ tắt hẳn đến sáng hoàn toàn thì cũng chính là thời gian để duty cycle chạy từ 0 đến max.
Ví dụ:
Code:

void main()
        {
        setup_ccp1(CCP_PWM);
        setup_timer_2(T2_DIV_BY_1,25,1);
        set_pwm1_duty(0);
        while(true)
        {
        for(i=0;i<25;i++)
                {
                set_pwm1_duty(i);               
                delay_ms(200);
                }
        }
        }

Như vậy để từ tắt hẳn đến sáng nhất là 200x25=5000ms (5s).
Cái này tui chưa làm thử, nhưng đây là ý tưởng của tui... bạn tham khảo xem sao :)

Mình thử code của bạn, biên dịch và mô phỏng nhưng led ở chân CCP1 không có tín hiệu gì cả. Mình mô phỏng bằng proteus.
Mình thấy pic16f877a chỉ có 2 chân băm xung thôi nhưng mình muốn sử dụng 8 chân thì làm như thế nào mong được chỉ giáo!
Trân trọng cảm ơn!

nhanh0112 11-11-2009 03:55 PM

Trích:

Nguyên văn bởi xalachxoan (Post 31114)
Mình thử code của bạn, biên dịch và mô phỏng nhưng led ở chân CCP1 không có tín hiệu gì cả. Mình mô phỏng bằng proteus.
Mình thấy pic16f877a chỉ có 2 chân băm xung thôi nhưng mình muốn sử dụng 8 chân thì làm như thế nào mong được chỉ giáo!
Trân trọng cảm ơn!

Nếu thử với Proteus thì mình đã thử với đoạn code này trên PIC12F683... và đèn led có nhấp nháy mà bạn
Code:

#include <12F683.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                //Internal RC Osc, no CLKOUT
#FUSES NOCPD                    //No EE protection
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOMCLR                  //Master Clear pin used for I/O
#FUSES NOPUT                    //No Power Up Timer
#FUSES BROWNOUT                //Reset when brownout detected
#FUSES IESO                    //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled

#use delay(clock=4000000)

int i;

void main()
  {
  setup_ccp1(CCP_PWM);
  setup_timer_2(T2_DIV_BY_1,25,1);
  set_pwm1_duty(0);
        while(true)
        {
  for(i=0;i<25;i++)
      {
      set_pwm1_duty(i);     
      delay_ms(200);
      }
        }
  }

Còn với việc làm PWM nhiều kênh thì theo mình ko thể sử dụng chân CCPX đc. Mà phải sử dụng phương pháp quét lần lượt theo chu kỳ thời gian thôi. Ai có cách hay hơn thì post lên cho anh em tham khảo với.

xalachxoan 12-11-2009 09:10 AM

Chào bạn Nhanh0112!
Mình đã thử mô phỏng lại với PIC2f683, led nhấp nháy rồi! Nếu mạch thực thì nó sáng dần phải không bạn? Mình đã thử lại với PiC6f877a nhưng vẫn không được. Bạn thử mô phỏng xem sao?
Còn giả sữ mình muốn điều khiển 8 led đơn cho nó sáng dần từ con 1 đến con thứ 8 thì không sử dụng chân CCPx được rồi! Vậy mình lập trình ra sao? Mong được anh em post lên cho y kiến với!
Trân trọng cảm ơn!

xalachxoan 12-11-2009 08:32 PM

Các bạn xem thử sự lợi hại của PWM để điều khiển led nhé!
Xem xong cho ý kiến để làm nhé các bạn!
http://www.youtube.com/watch?v=SKe67xZG8Sg
Thân!

nhanh0112 13-11-2009 09:41 AM

Trích:

Nguyên văn bởi xalachxoan (Post 31166)
Chào bạn Nhanh0112!
Mình đã thử mô phỏng lại với PIC2f683, led nhấp nháy rồi! Nếu mạch thực thì nó sáng dần phải không bạn? Mình đã thử lại với PiC6f877a nhưng vẫn không được. Bạn thử mô phỏng xem sao?
Còn giả sữ mình muốn điều khiển 8 led đơn cho nó sáng dần từ con 1 đến con thứ 8 thì không sử dụng chân CCPx được rồi! Vậy mình lập trình ra sao? Mong được anh em post lên cho y kiến với!
Trân trọng cảm ơn!

đây là đoạn code nhỏ đc viết trong ngắt timer (với khoảng thời gian tràn là 1 xung lấy mẫu)
Ở đây viết là xung mẫu là 500us, và chiều dài của 1 xung đc băm ra là 100 khoảng (là độ phân giải của nó ấy). Thời gian của 1 xung là T=500x100=50ms
Đoạn code đc viết cho 4 chân (bạn có thể mở rộng tùy thích)
Các giá trị độ rộng xung đc nạp 1 lần vào mảng Pulse[] từ phần tử 0 đến phần tử 3 tương ứng từ kênh 1 đến kênh 4, với giá trị:0-100
ví dụ
pulse[0]=20;//0=min,100=max
pulse[1]=45;
.....
Code:

#int_timer0 //overflow every 500us
void decode()
  {
        set_timer0(0);
        xung++;
        if(xung<pulse[0])//1
                {output_high(PIN_D0);}
        else
                {output_low(PIN_D0);}
        if(xung<pulse[1])//2
                {output_high(PIN_D1);}
        else
                {output_low(PIN_D1);}
        if(xung<pulse[2])//3
                {output_high(PIN_D2);}
        else
                {output_low(PIN_D2);}
        if(xung<pulse[3])//4
                {output_high(PIN_D3);}
        else
                {output_low(PIN_D3);}               
        if(xung>100){xung=0;}//end of pulse
  }

đoạn code này tui lấy từ một ứng dụng khác của tui, và đã sửa sang lại chút để phù hợp với đầu bài, nên chưa kịp test. Bạn nào có dịp làm thì test dùm luôn. Ai có ý tưởng nào hay về PWM nhiều kênh thì post lên tham khảo với nha

zero07a 13-11-2009 02:35 PM

trang web hay thật.

Demostone 12-11-2010 03:12 PM

Mình đang học PIC và có 1 bài tập như thế này.Ai giúp mình..tham khảo với:)..
1.Cho LED sáng lần lượt từ Rb7-RD0 mà vẫn giữ cho các LED trước sáng và ngược lạo
2.Sử Dụng chức năng ngắt ngoài cho LED sáng lần lượt như câu 1
3.Tương tự câu 2 nhưng sử dụng ngắt Timer1

vinhphucbk08 21-11-2010 11:14 AM

có bạn nào có kit mô phỏng led chasing trên protues k? share cho mình với! mình đang cần! thanks mọi người nhiều!!

cuongero2012 20-12-2011 10:15 PM

cho mình hỏi: mình muốn post B chạy riêng 5 kiểu có 8 con led đơn, đồng thời post C cũng chạy 3 kiểu có 8 con led đơn. 2 dãy chạy đồng thời. mình viết chương trình bằng CCS, mình viết cách: outputb,outputc,delay rất phúc tạp khi viết nhiều kiểu led chạy. bạn nào biết dùng lệnh gì để tách ra chạy riêng biệt 2 post ko


Múi giờ GMT. Hiện tại là 08:30 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam