Thông báo

Collapse
No announcement yet.

Quét phím + PWM

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

  • #31
    Nguyên văn bởi mast090 Xem bài viết
    ko hiểu cách viết code của người ta lại hay chém to, chính xác nó là code tạo pwm 3.9khz với duty 50%, code này chỉ cần chỉnh giá trị nạp cho TH0 và TL0 là thành 10khz

    chắc chỉ có mỗi bạn biết xài cái timer tạo pwm và người khác tạo pwm bằng delay, haizzz. việc sử dụng các ngắt để lập trình nó tùy thuộc vào số lượng công việc của con chip, nếu số lượng công việc ít đơn giản và ko đòi hỏi cao thì chả xài mấy cái ngắt ngủm làm j vì vốn dĩ nó cũng đáp ứng đc, với các chương trình lớn người ta sẽ tận dụng tối đa các ngắt và khả năng đáp ứng được của con chip để đáp ứng đc yêu cầu, ví dụ như cái bài này chả xài 1 tí tẹo delay nào, cái trò mà nhét tất cả vào main chỉ dành cho người mới học mà thôi.
    P/s: ko nên phán người khác ra sao trước khi ko biết họ thế nào, ai cũng có phần xanh và non cả
    PHP Code:
    ORG    0000H
    JMP START
    ORG    000BH     
    NGAT TIMER 0
    LJMP    NGAT_TIME_0
    ORG    001BH     
    NGAT TIMER 1
    LJMP    NGAT_TIME_1


    START
    :

    MOV     TMOD,#21H    ; TIMER 0 CHE DO 1, TIMER1 CHE ĐỘ 2
    MOV     TL0,#0FEH ; 1KHZ 
    MOV     TH0,#0CH ; 

    MOV     TH1,#-50H    ; 10KHZ
    SETB ET0
    SETB     ET1
    SETB TR0
    SETB TR1
    SETB EA
    DUNG
    :    JMP     DUNG
    NGAT_TIMER_0
    :
    CLR     TR0
    CLR     TF0
    CPL     P1.7
    MOV     TL0
    ,#0FEH ; 
    MOV     TH0,#0CH 
    SETB     TR0
    RET
    NGAT_TIMER_1
    :
    CLR     TR1
    CLR     TF1
    MOV     TH1
    ,#-50H
    CPL     P1.6
    SETB     TR1
    RET    
    END 
    Nếu cái đoạn trên này mà tạo đựoc PWM với duty là 50% thì tui về vườn được rồi, đúng là cái đoạn code với comment tiếng anh tui chưa hiểu mà thực chất là không để ý thực sự nó như thế nào, vì trình bày quá kém.

    Comment


    • #32
      Không khó lắm ! Đặt độ phân giải cho pwm = 4. 1 lần timer tràn = 50 tcy. Chắc vẫn đủ thời gian quét phím.

      Comment


      • #33
        Nguyên văn bởi tmtm Xem bài viết
        Cảm ơn các bác đã đọc và phân tích vấn đề. Nói thật là "em xin" các bác giúp em cái code, các bác cứ post lên, biết đâu mò mẫm em lại giải được.
        Vừa có bạn nhắn vào hộp thư diễn đàn bán cái code này 100K đó. Thật chẳng biết nghĩ sao nữa.
        Gửi các bác nguyên văn cái đề (áp dụng cho toàn quốc các bác ạ) mà em nghĩ nếu áp dụng cho toàn quốc thì chắc chắn là khó sai được.
        code này 100k thì hơi bị lố thật

        Comment


        • #34
          Đây là những gì cuối cùng mình muốn nói ở cái chủ đề này nếu ai đó tiếp nhận được gì thì tốt, nếu mình vẫn là "siêu nhân cuồng phong" hay "chuột chỉ sống trong phòng thí nghiệm vì chỉ dựa vào mô phỏng" và "phi thực tế" thì cũng chịu thôi không còn ý kiến được gì nữa.
          Tóm tắt về phương pháp của mình:
          1: tạo ra tần số gấp 4 lần so với tần số thực tế.
          2: set dương tại các đỉnh "đỉnh nhỏ, vì mỗi chu kỳ sẽ bao gồm 8 đỉnh nhỏ" 0, 7, 15, ....
          3: kiểm tra xem có bao nhiêu "đỉnh nhỏ" được để để tạo duty (1->25%, 2->50%, 3->75%,..... ,7->175%)
          Click image for larger version

Name:	1.JPG
Views:	1
Size:	58.8 KB
ID:	1388372
          Click image for larger version

Name:	2.JPG
Views:	1
Size:	50.4 KB
ID:	1388373
          dưới đây là code theo phương pháp của mình, đủ đơn giản để bất kỳ ai cũng có thể hiểu và chỉnh sửa.
          PHP Code:
          #include <at89x52.h>

          #define pulse P1_0
          volatile char num=1count=0;
          //num= 1 -> 25%
          //     2 -> 50%
          //     3 -> 75%
          //     4 -> 100%
          //     7 -> 175%
          void main(void)
          {
              
          pulse=0;
              
          TMOD=0x02;// Chế độ 2 (8bit auto reload)
              
          TH0=206;
              
          /*
              Chỗ này theo như tính toán thì phải là 250 (vì tần số cần tạo là 4.000Hz -> 1.000.000/4.000=250)
              nhưng không hiểu sao nếu dùng 250 thì tần số tạo ra chỉ là 2.000, nên đành phải 250/2 để x2 tần số
              */
              
          ET0=1;
              
          TR0=1;
              
          EA=1;
              while(
          1)
              {
                  
          PCON=IDL_;
              }
          }

          void ISR_timer0(void)interrupt TF0_VECTOR
          {
              
          // Đặt đỉnh dương tại các điểm 0, 7, 15, .......
              
          if(count>7)// >=8 do chia tần cho 4 nên khoảng cách giữa mỗi đỉnh con sẽ là 8 khoảng con
              
          {
                  
          pulse=1;
                  
          count=0;
              }
              
          // Kiểm tra xem có bao nhiêu đỉnh dương được để lại để tạo duty
              
          if(pulse && (count>=num))// Nếu đang ở đỉnh dương thì tiến hành san đỉnh tạo hiệu ứng PWM
                  
          pulse=0;
              
          count+=1;
              
          //*/

          với đoạn code này thì hình ảnh minh họa sẽ như sau "xung 2,5Khz"
          Click image for larger version

Name:	25%duty.jpg
Views:	1
Size:	85.4 KB
ID:	1388371
          Nhiệm vụ của bạn khi lập trình giờ chỉ là thây đổi biến num thành các giá trị hợp lý nhất có thể (0, 1, 2, ... 7) để tạo các duty cần thiết
          Với num=2 -> duty=50%
          Click image for larger version

Name:	50%duty.jpg
Views:	1
Size:	84.8 KB
ID:	1388374
          Với num=3 -> duty=75%
          Click image for larger version

Name:	75%duty.jpg
Views:	1
Size:	87.4 KB
ID:	1388375
          Do không post quá 5 ảnh cho 1 bài viết nên mình sẽ post tiếp ở bài dưới đây

          Comment


          • #35
            Còn đây là duty 175% với num=7
            Click image for larger version

Name:	175%duty.jpg
Views:	1
Size:	86.3 KB
ID:	1388376
            Còn đây là ảnh đoạn code ban đầu bạn post lên "vẫn là mô phỏng"
            Click image for larger version

Name:	Phuong phap cu.JPG
Views:	1
Size:	174.9 KB
ID:	1388377
            Còn đây là toàn bộ project mình thực hiện.
            "Phuong phap tu duy.xls" chính là những hình ảnh mình tưởng tượng ra để thực hiện bài này.
            "phương pháp cũ.c" là cái mà chủ thớt đã up lên ở phần đầu có thể dịch lại để kiểm chứng.

            Mong là chủ thớt code có style thêm chút chỉ là thò thụt dòng thôi chứ chẳng có gì to tát cả nhưng nó ảnh hưởng đến người đọc lắm đó.

            Comment


            • #36
              Vậy phải chèn code SWICH vào như thế nào bạn?
              Ví dụ:
              Void (main)
              If(P2.0==1)
              number =1;//duty=25%
              If(P2.1==1)
              number =2;//duty=50%
              If(P2.2==1)
              number =3;//duty=75%

              như vậy có được không bạn?

              Comment


              • #37
                bạn có thế cho mình cái code để mình xem được không
                Nguyên văn bởi tmtm Xem bài viết
                Đã sửa xong, cảm ơn các bác nhiều. Hoá ra cũng đơn giản thôi.
                Biết thì nói là biết, không biết thì nói là không biết. Giúp được người thì giúp, không giúp được thì để cho người ta yên.
                ==> Tự túc là hạnh phúc vì xã hội bây giờ có nhiều người làm nghề "chém gió" quá.
                P/S: MOD đi ngang thì close giúp em nhé!

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X