Thông báo

Collapse
No announcement yet.

PWM tất cả các chân của pic

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • PWM tất cả các chân của pic

    em có bo mạch quảng cáo 31 cổng(pic 28 chân) em thấy lạ chỗ là nó PWM được tất cả 31 cổng (có 2 con logic) để mở rộng cổng,không hiểu làm kiểu gì ta khi chỉ có 2 kênh PWM nó không PWM nguồn đâu nha
    SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

  • #2
    Dùng 74595, ví dụ dùng 2 con bạn sẽ có 16 cổng pwm.
    Kỷ thuật này gọi là pwm mềm

    Comment


    • #3


      Kỷ thuật này gọi là pwm mềm do Mr.DuyPhi tự nghỉ hihii
      Attached Files

      Comment


      • #4
        Cái này đơn giản mà. Ví dụ dùng cổng AND hoặc OR thì dùng 1chân ON/OFF, 1 chân PWM. Nếu dùng 74HC595 thì có thể PWM vào chính chân OE.
        Bạn hãy xem con mở rộng cổng là gì, xem chân RST hoặc Enable ở đâu rồi dùng oscilloscope kiểm tra là thấy ngay.

        Comment


        • #5
          cám ơn 2 cao thủ đã trả lời !
          -bác DuyPhi sao lại dùng nick này vậy
          -em thì dùng 1 con fet treo ở đầu nguồn PWM all bo luôn
          -em thắc mắc là những chân không cho vào 595 mà nó vẫn PWM được ,tầm khoảng hơn chục chân không qua 595 mà vẫn PWM all bo chả nhẽ nó quét nhanh sao ? giải thích giúp em với
          SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

          Comment


          • #6
            Thực tế để driver cho led tui ít khi dùng phần cứng vì k đủ chân PWM, với lại khi cần thay đổi độ rộng xung cho các chân khác nhau thì k được nên tui dùng phần mềm k à bác, dĩ nhiên tần số đạt được là k cao nhưng ứng dụng cho led thì ok.

            Comment


            • #7
              Nguyên văn bởi kevo1tinh Xem bài viết
              Thực tế để driver cho led tui ít khi dùng phần cứng vì k đủ chân PWM, với lại khi cần thay đổi độ rộng xung cho các chân khác nhau thì k được nên tui dùng phần mềm k à bác, dĩ nhiên tần số đạt được là k cao nhưng ứng dụng cho led thì ok.
              ý mình là không phải bo này để chuyên PWM ,nó là bo led quảng cáo 31 cổng để tạo thêm hiệu ứng người ta cho thêm chức năng PWM cả 31 cổng với con pic chỉ 28 chân ,và tần số thì chỉnh bằng 1 cái biến trở ,,PWM với 595 thì mấy anh có giải pháp rồi ,nhưng còn hơn chục chân của nó nối không qua con ghi dich nào mà PWM được luôn mới khó hiểu chứ
              SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

              Comment


              • #8
                Biến trở kết nối chân ADC nhé, giá trị này tùy chỉnh độ rộng xung hoặc tần số nha bác. Thông thường tui tùy chỉnh độ rộng xung, còn tần số tui cho cố định. Khi lập trình led, vì phải tạo hiệu ứng cho nhiều PIN nên tui khai báo 1 mảng lưu trạng thái của PIN với độ lớn tương ứng số PIN sử dụng, VD: PIN_PRE[31], trong đó PIN_PRE[0]....PIN_PRE[5] dành cho cụm led A, PIN_PRE[6]....PIN_PRE[10] dành cho cụm led B,.....Việc tạo hiệu ứng được thực hiện trên mảng này nha.
                Tạo 1 hàm xuất trạng thái ra chân VXL, vd:
                void xuat_pin()
                {
                output_bit(PIN_A1,PIN_PRE[0]);
                output_bit(PIN_C2,PIN_PRE[1]);
                .
                .
                .
                }
                để tạo PWM cần tạo 1 timer phụ, nằm trong ngắt timer, VD tui xử dụng timer 1, timer phụ lấy tên là "A_TIMER".
                #int_TIMER1
                void TIMER1_isr(void) //500us ngắt nha, vd thôi.
                {
                set_timer1(xxxxx);
                if (A_TIMER>0) A_TIMER--;
                else A_TIMER = nnn; //như vậy T=500us * nnn
                }
                sửa lại hàm xuất trạng thái
                void xuat_pin()
                {
                if (A_TIMER<BBBB)
                {
                output_bit(PIN_A1,PIN_PRE[0]);
                output_bit(PIN_C2,PIN_PRE[1]);
                .
                .
                .}
                else
                {
                output_bit(PIN_A1,OFF);
                output_bit(PIN_C2,OFF);
                .
                .
                }
                giá trị BBBB lấy từ ADC thông qua 1 phép tính nào đó tùy bạn muốn.
                Nếu muốn độ rộng xung cho từng PIN thì lồng hàm if vào cho mỗi lệnh output_bit(..,..)
                Thân.

                Comment


                • #9
                  Bạn có thể tham khảo chương trình này để dễ hình dung, nhưng chương trình này chỉ dùng ADC để tăng giảm tốc độ chạy cho hiệu ứng chứ không PWM. Không đính kèm được, thôi paste vào vậy:
                  #define DB0 PIN_C5
                  #define DB1 PIN_C4
                  #define DB2 PIN_C3
                  //----------------------gia tri
                  #define SANG 1
                  #define TAT 0
                  //----------------------duong bien
                  #define ADD_DOWNDB 0 //dia chi duoi cho DB
                  #define ADD_UPDB 2 //dia chi tren cho DB
                  //----------------------noi dung 1
                  #define ADD_DOWN1 3 //dia chi duoi cho HU 1
                  #define ADD_UP1 3 //dia chi tren cho HU 1
                  int8 PIN[12];
                  int8 db_index=0,idb=0;
                  int8 value_adc=100;
                  int8 hu1_index=0;
                  int16 DB_TIMER=0,db_delay=500;
                  int16 A_TIMER=0,hu1_delay=500;

                  #int_TIMER1 //TA=16MHz, delay 0,5ms
                  void TIMER1_isr(void)
                  {
                  set_timer1(63535);
                  if (DB_TIMER>0) DB_TIMER--;
                  if (A_TIMER>0) A_TIMER--;
                  }
                  //-------------------------------------
                  void Db_tat()
                  {
                  int8 jdb;
                  for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
                  {
                  PIN[jdb]=TAT;
                  }
                  }
                  void Db_sang()
                  {
                  int8 jdb;
                  for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
                  {
                  PIN[jdb]=SANG;
                  }
                  }
                  void Hu1_tat()
                  {
                  int8 j1;
                  for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
                  {
                  PIN[j1]=TAT;
                  }
                  }
                  void Hu1_sang()
                  {
                  int8 j1;
                  for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
                  {
                  PIN[j1]=SANG;
                  }
                  }
                  //-------------------------------------
                  void Duong_bien()
                  {
                  int8 kdb;
                  if(db_index==0)
                  {
                  // db_delay=DELAY_DB_MIN;
                  idb=ADD_DOWNDB;
                  db_index=1;
                  }
                  else if (db_index==1)
                  {
                  if (DB_TIMER==0)
                  {
                  for (kdb=ADD_DOWNDB;kdb<=ADD_UPDB;kdb++)
                  {
                  PIN[kdb]=TAT;
                  }
                  PIN[idb]=SANG;
                  idb++;
                  if (idb>ADD_UPDB)
                  {
                  idb=ADD_DOWNDB;
                  }
                  DB_TIMER=db_delay;
                  }
                  }
                  else
                  {
                  idb=0;
                  }
                  }
                  //--------------------------------------
                  void Hu1()
                  {
                  if (hu1_index==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_sang();
                  hu1_index=1;
                  }
                  else if (hu1_index==1)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_tat();
                  hu1_index=2;
                  }
                  }
                  else if (hu1_index==2)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_sang();
                  hu1_index=3;
                  }
                  }
                  else if (hu1_index==3)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_tat();
                  hu1_index=4;
                  }
                  }
                  else if (hu1_index==4)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_sang();
                  hu1_index=5;
                  }
                  }
                  else if (hu1_index==5)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_tat();
                  hu1_index=6;
                  }
                  }
                  else if (hu1_index==6)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay;
                  Hu1_sang();
                  hu1_index=7;
                  }
                  }
                  else if (hu1_index==7)
                  {
                  if (A_TIMER==0)
                  {
                  A_TIMER=hu1_delay * 5;
                  Hu1_sang();
                  hu1_index=1;
                  }
                  }
                  }
                  //------------------------------------
                  void Calculate_delay()
                  {
                  value_adc = read_adc ();
                  db_delay = make16(0,value_adc);
                  hu1_delay = db_delay *10;
                  db_delay = db_delay *2;
                  }


                  void Out_led()
                  {
                  //duong bien
                  output_bit(DB0,PIN[0]);
                  output_bit(DB1,PIN[1]);
                  output_bit(DB2,PIN[2]);
                  //noi dung 2
                  output_bit(PIN_C2,PIN[3]);
                  output_bit(PIN_C1,PIN[3]);
                  }

                  void main()
                  {

                  setup_adc_ports(sAN0|VSS_VDD);
                  setup_adc(ADC_CLOCK_INTERNAL);
                  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt( WDT_2304MS);
                  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
                  setup_timer_2(T2_DISABLED,0,1);
                  setup_comparator(NC_NC_NC_NC);
                  setup_vref(FALSE);
                  enable_interrupts(INT_TIMER1);
                  enable_interrupts(GLOBAL);
                  set_adc_channel(0);
                  delay_ms(10);
                  //Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

                  // TODO: USER CODE!!
                  while (TRUE)
                  {
                  restart_wdt();
                  Calculate_delay();
                  Duong_bien();
                  Hu1();
                  Out_led();
                  }

                  }

                  Comment


                  • #10
                    Nguyên văn bởi kevo1tinh Xem bài viết
                    Biến trở kết nối chân ADC nhé, giá trị này tùy chỉnh độ rộng xung hoặc tần số nha bác. Thông thường tui tùy chỉnh độ rộng xung, còn tần số tui cho cố định. Khi lập trình led, vì phải tạo hiệu ứng cho nhiều PIN nên tui khai báo 1 mảng lưu trạng thái của PIN với độ lớn tương ứng số PIN sử dụng, VD: PIN_PRE[31], trong đó PIN_PRE[0]....PIN_PRE[5] dành cho cụm led A, PIN_PRE[6]....PIN_PRE[10] dành cho cụm led B,.....Việc tạo hiệu ứng được thực hiện trên mảng này nha.
                    Tạo 1 hàm xuất trạng thái ra chân VXL, vd:
                    void xuat_pin()
                    {
                    output_bit(PIN_A1,PIN_PRE[0]);
                    output_bit(PIN_C2,PIN_PRE[1]);
                    .
                    .
                    .
                    }
                    để tạo PWM cần tạo 1 timer phụ, nằm trong ngắt timer, VD tui xử dụng timer 1, timer phụ lấy tên là "A_TIMER".
                    #int_TIMER1
                    void TIMER1_isr(void) //500us ngắt nha, vd thôi.
                    {
                    set_timer1(xxxxx);
                    if (A_TIMER>0) A_TIMER--;
                    else A_TIMER = nnn; //như vậy T=500us * nnn
                    }
                    sửa lại hàm xuất trạng thái
                    void xuat_pin()
                    {
                    if (A_TIMER<BBBB)
                    {
                    output_bit(PIN_A1,PIN_PRE[0]);
                    output_bit(PIN_C2,PIN_PRE[1]);
                    .
                    .
                    .}
                    else
                    {
                    output_bit(PIN_A1,OFF);
                    output_bit(PIN_C2,OFF);
                    .
                    .
                    }
                    giá trị BBBB lấy từ ADC thông qua 1 phép tính nào đó tùy bạn muốn.
                    Nếu muốn độ rộng xung cho từng PIN thì lồng hàm if vào cho mỗi lệnh output_bit(..,..)
                    Thân.
                    rất cám ơn bác ạ, -.- chắc trình độ học vấn của em có hạn nên giải thích bác chưa hiểu được
                    SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

                    Comment


                    • #11
                      Nguyên văn bởi kevo1tinh Xem bài viết
                      Bạn có thể tham khảo chương trình này để dễ hình dung, nhưng chương trình này chỉ dùng ADC để tăng giảm tốc độ chạy cho hiệu ứng chứ không PWM. Không đính kèm được, thôi paste vào vậy:
                      #define DB0 PIN_C5
                      #define DB1 PIN_C4
                      #define DB2 PIN_C3
                      //----------------------gia tri
                      #define SANG 1
                      #define TAT 0
                      //----------------------duong bien
                      #define ADD_DOWNDB 0 //dia chi duoi cho DB
                      #define ADD_UPDB 2 //dia chi tren cho DB
                      //----------------------noi dung 1
                      #define ADD_DOWN1 3 //dia chi duoi cho HU 1
                      #define ADD_UP1 3 //dia chi tren cho HU 1
                      int8 PIN[12];
                      int8 db_index=0,idb=0;
                      int8 value_adc=100;
                      int8 hu1_index=0;
                      int16 DB_TIMER=0,db_delay=500;
                      int16 A_TIMER=0,hu1_delay=500;

                      #int_TIMER1 //TA=16MHz, delay 0,5ms
                      void TIMER1_isr(void)
                      {
                      set_timer1(63535);
                      if (DB_TIMER>0) DB_TIMER--;
                      if (A_TIMER>0) A_TIMER--;
                      }
                      //-------------------------------------
                      void Db_tat()
                      {
                      int8 jdb;
                      for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
                      {
                      PIN[jdb]=TAT;
                      }
                      }
                      void Db_sang()
                      {
                      int8 jdb;
                      for (jdb=ADD_DOWNDB;jdb<=ADD_UPDB;jdb++)
                      {
                      PIN[jdb]=SANG;
                      }
                      }
                      void Hu1_tat()
                      {
                      int8 j1;
                      for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
                      {
                      PIN[j1]=TAT;
                      }
                      }
                      void Hu1_sang()
                      {
                      int8 j1;
                      for (j1=ADD_DOWN1;j1<=ADD_UP1;j1++)
                      {
                      PIN[j1]=SANG;
                      }
                      }
                      //-------------------------------------
                      void Duong_bien()
                      {
                      int8 kdb;
                      if(db_index==0)
                      {
                      // db_delay=DELAY_DB_MIN;
                      idb=ADD_DOWNDB;
                      db_index=1;
                      }
                      else if (db_index==1)
                      {
                      if (DB_TIMER==0)
                      {
                      for (kdb=ADD_DOWNDB;kdb<=ADD_UPDB;kdb++)
                      {
                      PIN[kdb]=TAT;
                      }
                      PIN[idb]=SANG;
                      idb++;
                      if (idb>ADD_UPDB)
                      {
                      idb=ADD_DOWNDB;
                      }
                      DB_TIMER=db_delay;
                      }
                      }
                      else
                      {
                      idb=0;
                      }
                      }
                      //--------------------------------------
                      void Hu1()
                      {
                      if (hu1_index==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_sang();
                      hu1_index=1;
                      }
                      else if (hu1_index==1)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_tat();
                      hu1_index=2;
                      }
                      }
                      else if (hu1_index==2)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_sang();
                      hu1_index=3;
                      }
                      }
                      else if (hu1_index==3)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_tat();
                      hu1_index=4;
                      }
                      }
                      else if (hu1_index==4)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_sang();
                      hu1_index=5;
                      }
                      }
                      else if (hu1_index==5)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_tat();
                      hu1_index=6;
                      }
                      }
                      else if (hu1_index==6)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay;
                      Hu1_sang();
                      hu1_index=7;
                      }
                      }
                      else if (hu1_index==7)
                      {
                      if (A_TIMER==0)
                      {
                      A_TIMER=hu1_delay * 5;
                      Hu1_sang();
                      hu1_index=1;
                      }
                      }
                      }
                      //------------------------------------
                      void Calculate_delay()
                      {
                      value_adc = read_adc ();
                      db_delay = make16(0,value_adc);
                      hu1_delay = db_delay *10;
                      db_delay = db_delay *2;
                      }


                      void Out_led()
                      {
                      //duong bien
                      output_bit(DB0,PIN[0]);
                      output_bit(DB1,PIN[1]);
                      output_bit(DB2,PIN[2]);
                      //noi dung 2
                      output_bit(PIN_C2,PIN[3]);
                      output_bit(PIN_C1,PIN[3]);
                      }

                      void main()
                      {

                      setup_adc_ports(sAN0|VSS_VDD);
                      setup_adc(ADC_CLOCK_INTERNAL);
                      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt( WDT_2304MS);
                      setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
                      setup_timer_2(T2_DISABLED,0,1);
                      setup_comparator(NC_NC_NC_NC);
                      setup_vref(FALSE);
                      enable_interrupts(INT_TIMER1);
                      enable_interrupts(GLOBAL);
                      set_adc_channel(0);
                      delay_ms(10);
                      //Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

                      // TODO: USER CODE!!
                      while (TRUE)
                      {
                      restart_wdt();
                      Calculate_delay();
                      Duong_bien();
                      Hu1();
                      Out_led();
                      }

                      }
                      bác có thể code 15 chân PWM cho em được mở mang tầm mắt với em vẫn ngu dốt chỗ này quá =.= !
                      SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

                      Comment


                      • #12
                        Cái chương trình trên là dùng ADC để chỉnh tốc độ chạy của hiệu ứng chứ không phải để PWM. Lưu ý là tui lập trinh cho LED thì xử lý data trên RAM (khai báo 1 mảng), mục đích là có nhiều hiệu ứng, có thể tạo 1 library (giống như lbrary có sẵn của PIC C Compiler) để sau này có thể sử dụng cho nhiều khách hàng khác nhau, nhiều bảng khác nhau mà k cần chỉnh sửa gì nhiều. CÒn việc xuất dữ liệu đó ra chân nào là việc của hàm "OUT_LED". Chính vì vậy có thể PWM từ hàm OUT_LED. Như vậy các PIN cần PWM thì đưa vào hàm IF, các chân không PWM thì nằm ngoài hàm IF.
                        void OUT_LED()
                        {
                        //các PIN không PWM
                        output_bit(PIN_A1,PIN_PRE[0]);
                        output_bit(PIN_A2,PIN_PRE[1]);
                        output_bit(PIN_A3,PIN_PRE[2]);
                        //các PIN cần PWM thì đưa vào đây
                        if (A_TIMER<BBBB)
                        {
                        output_bit(PIN_C0,PIN_PRE[10]);
                        output_bit(PIN_C1,PIN_PRE[11]);
                        output_bit(PIN_C2,PIN_PRE[12]);
                        }
                        else
                        {
                        output_bit(PIN_C0,OFF);
                        output_bit(PIN_C1,OFF);
                        output_bit(PIN_C2,OFF);
                        }
                        }
                        Nếu bạn cần PWM cho 15 PIN thì đưa 15 PIN đó vào hàm if, các chân không PWM nằm ngoài hàm if.
                        Chốt lại là bạn muốn dùng PWM để điều chỉnh độ sáng của LED đúng k và các chân đó không có chức năng PWM!! Nếu cảm thấy k đúng thì tui sorry vậy, nếu đúng thì cách của tui vừa xử lý hiệu ứng, vừa PWM (tạm chấp chận cho LED được thì tần số không được cao). Nếu cần 1 cái PWM mẫu thì tui có thể viết cho bạn được để test chạy thử.
                        Last edited by kevo1tinh; 05-09-2014, 17:21.

                        Comment


                        • #13
                          Nguyên văn bởi kevo1tinh Xem bài viết
                          Cái chương trình trên là dùng ADC để chỉnh tốc độ chạy của hiệu ứng chứ không phải để PWM. Lưu ý là tui lập trinh cho LED thì xử lý data trên RAM (khai báo 1 mảng), mục đích là có nhiều hiệu ứng, có thể tạo 1 library (giống như lbrary có sẵn của PIC C Compiler) để sau này có thể sử dụng cho nhiều khách hàng khác nhau, nhiều bảng khác nhau mà k cần chỉnh sửa gì nhiều. CÒn việc xuất dữ liệu đó ra chân nào là việc của hàm "OUT_LED". Chính vì vậy có thể PWM từ hàm OUT_LED. Như vậy các PIN cần PWM thì đưa vào hàm IF, các chân không PWM thì nằm ngoài hàm IF.
                          void OUT_LED()
                          {
                          //các PIN không PWM
                          output_bit(PIN_A1,PIN_PRE[0]);
                          output_bit(PIN_A2,PIN_PRE[1]);
                          output_bit(PIN_A3,PIN_PRE[2]);
                          //các PIN cần PWM thì đưa vào đây
                          if (A_TIMER<BBBB)
                          {
                          output_bit(PIN_C0,PIN_PRE[10]);
                          output_bit(PIN_C1,PIN_PRE[11]);
                          output_bit(PIN_C2,PIN_PRE[12]);
                          }
                          else
                          {
                          output_bit(PIN_C0,OFF);
                          output_bit(PIN_C1,OFF);
                          output_bit(PIN_C2,OFF);
                          }
                          }
                          Nếu bạn cần PWM cho 15 PIN thì đưa 15 PIN đó vào hàm if, các chân không PWM nằm ngoài hàm if.
                          Chốt lại là bạn muốn dùng PWM để điều chỉnh độ sáng của LED đúng k và các chân đó không có chức năng PWM!! Nếu cảm thấy k đúng thì tui sorry vậy, nếu đúng thì cách của tui vừa xử lý hiệu ứng, vừa PWM (tạm chấp chận cho LED được thì tần số không được cao). Nếu cần 1 cái PWM mẫu thì tui có thể viết cho bạn được để test chạy thử.
                          xí quên là em dùng hitech với mikroc nhưng xem cách viết cũng ổn,thank vì đã rất nhiệt tình !
                          SỐNG THEO BẢN CHẤT,KỆ MỌI NGƯỜI NÓI GÌ THÌ NÓI

                          Comment


                          • #14
                            Anh kevo1tinh cho e hỏi là:
                            E băm xung PWM vào chân OE của 3 con 74595 cho led ma trận 8*8 2 màu RG để ra được 3 màu ,thì 3 con 74595 có dịch bit và đẩy bit kịp tốc độ của xung PWM không ạ (PWM đủ lớn để ra 24 hình/giây).À e hỏi thêm là phải băm xung PWM vào chân OE của cả 3 con hay chỉ cần cho con 595 đầu tiên ạ ?
                            Cảm ơn a
                            Last edited by toan.ndn; 30-10-2014, 22:37.

                            Comment


                            • #15
                              Nguyên văn bởi toan.ndn Xem bài viết
                              Anh kevo1tinh cho e hỏi là:
                              E băm xung PWM vào chân OE của 3 con 74595 cho led ma trận 8*8 2 màu RG để ra được 3 màu ,thì 3 con 74595 có dịch bit và đẩy bit kịp tốc độ của xung PWM không ạ (PWM đủ lớn để ra 24 hình/giây).À e hỏi thêm là phải băm xung PWM vào chân OE của cả 3 con hay chỉ cần cho con 595 đầu tiên ạ ?
                              Cảm ơn a
                              Cách PWM bằng phần phần như của tui chỉ thích hợp cho mấy cái bảng led, không khả thi khi xử dụng cho led ma trận. Tuy nhiên, góp ý thêm với bạn thế này:
                              - Sử dụng 2 kênh ccp1 và ccp2 để PWM cho 2 con 595, như thế thì phần mềm bạn rảnh việc để làm chuyện khác, đồng thời tần số cao sẽ giúp chuyển màu mềm mại hơn.
                              - Các tín hiệu điều khiển cho 2 con 595 này nên đấu song song (RCK,SCK), còn chân DS thì đấu riêng, OE thì đưa vào ccp, mỗi lần tạo clk để dịch bit, bạn sẽ dịch được 2 bit, sẽ tăng được tốc độ dịch bit và dư thời gian để làm việc khác.
                              - Điều hiển nhiên cách này theo phần cứng của bạn, điểm hạn chế của nó là bạn k thể tạo màu khác nhau cho từng pixel được.

                              Comment

                              Về tác giả

                              Collapse

                              h11540 Tìm hiểu thêm về h11540

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X