Thông báo

Collapse
No announcement yet.

Quét phím + PWM

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

  • Quét phím + PWM

    Em đang ôn thi tốt nghiệp, bộ đề có một bài yêu cầu điều chế xung PWM tần số 10kHz trên chân P0.1. Có 3 phím bấm SW1 - SW3 nối tới 3 chân bất kỳ, khi SW1 được nhấn thì độ rộng xung là 25%, khi SW2 được nhấn thì độ rộng xung là 50% và khi SW3 được nhấn thì động rộng xung là 75%. Đề bắt viết bằng KeilC. Em loay hoay mãi mà code không chạy.
    Phiền các bác bớt chút thời gian giúp em chút!
    Em học cao đẳng nghề nên kiến thức có hạn mong các bác giúp đỡ. Thanks!

  • #2
    Không có ai có thể bớt chút thời gian giúp em sao?

    Comment


    • #3
      Phải nói là thầy giáo bạn ra cái yêu cầu quả là khó, nếu dùng 89xx thì gần như là không thể thực hiện, nếu thử đặt 1 số phép tính lên giấy thì sẽ rõ ngay thôi. Giả sử bạn dùng thạch anh 24Mhz thì bạn có 2M(2.000.000) chu kỳ máy hiệu dụng, tần số cần tạo ra là 10.000 Hz lấy 2.000.000/10.000 =200 như vậy nếu trong điều kiện tiêu chuẩn thì bạn sẽ có khoảng ~=200 lệnh đơn (mỗi lệnh hết 1 chu kỳ máy chưa kể có những lệnh 2 chu kỳ máy "3 hoặc 4 thì không biết có không nữa")mà trong khoảng gần 200 lệnh (điều kiện tiêu chuẩn chứ thực tế thì không bao giờ có) bạn phải thực hiện đủ thứ nào là quét phím, so sánh để điều chế độ rộng xung thì gần như là bất khả thi, mình đã thử điều chế xung bằng timer với cái yêu cầu này thì thấy có thể điều chế độ rộng xung với tần số đó nhưng còn quét phím nữa thì thực sự là quá mệt mỏi.

      Comment


      • #4
        Nếu bạn điều chế xung bằng phuơng pháp thông thường thì không nói làm gì, nếu bạn điều chế bằng timer thì đối với trường hợp này tần số tràn của timer phải gấp 4 lần so với tần số cần điều chế, nên lại càng khó thực hiện hơn, bạn thử hỏi thầy giáo xem liệu có thể điều chế xung =1/2 hoặc 1/4 yêu cầu không chứ nếu cứ để vậy thì điều chế thôi đã đủ bở hơi tai VDK rồi chứ đừng có nói là quét phím.

        Comment


        • #5
          bác chủ học về timer interrupt chưa?

          Comment


          • #6
            Nguyên văn bởi myth-coder Xem bài viết
            Phải nói là thầy giáo bạn ra cái yêu cầu quả là khó, nếu dùng 89xx thì gần như là không thể thực hiện, nếu thử đặt 1 số phép tính lên giấy thì sẽ rõ ngay thôi. Giả sử bạn dùng thạch anh 24Mhz thì bạn có 2M(2.000.000) chu kỳ máy hiệu dụng, tần số cần tạo ra là 10.000 Hz lấy 2.000.000/10.000 =200 như vậy nếu trong điều kiện tiêu chuẩn thì bạn sẽ có khoảng ~=200 lệnh đơn (mỗi lệnh hết 1 chu kỳ máy chưa kể có những lệnh 2 chu kỳ máy "3 hoặc 4 thì không biết có không nữa")mà trong khoảng gần 200 lệnh (điều kiện tiêu chuẩn chứ thực tế thì không bao giờ có) bạn phải thực hiện đủ thứ nào là quét phím, so sánh để điều chế độ rộng xung thì gần như là bất khả thi, mình đã thử điều chế xung bằng timer với cái yêu cầu này thì thấy có thể điều chế độ rộng xung với tần số đó nhưng còn quét phím nữa thì thực sự là quá mệt mỏi.
            24.000.000hz/12 = 2.000.000hz. tần số yêu cầu là 10.000hz. 2M/10k = 200. có j là ko đc? chỉ là để chuẩn 10k 100% thì nó khó thôi
            Website chính thức đổi địa chỉ website thành
            Mời các bạn ghé thăm !!!

            Comment


            • #7
              Nguyên văn bởi mast090 Xem bài viết
              24.000.000hz/12 = 2.000.000hz. tần số yêu cầu là 10.000hz. 2M/10k = 200. có j là ko đc? chỉ là để chuẩn 10k 100% thì nó khó thôi
              U cứ thử xem vì không phải mỗi độ rộng xung không thôi mà còn quét bàn phím nữa cơ, Nếu dùng timer bảo không chính xác được 100% thì cũng đến >90% được mình không rõ là chính xác đựoc đến cỡ nào, nhưng với 200 thì có vẻ như là mệt lắm đấy sẽ quét bàn phím ra sao? Mình thì hay dùng chính timer để quét nhưng với khoảng 200 thì không đủ để quét và kiểm tra nhả phím. Và như trước đó mình nói nó chỉ là ~=200 chứ còn lâu mới được 200. Lại chưa kể đến mình lại chơi cái trò x4 lần tần số xung cần tạo thì lại càng bất khả thi. Nếu x4 lần xung lên mà vẫn thoải mái lệnh thì độ chính xác sẽ vô địch, vì khi x4 thì ứng đúng với tỉ lệ phần tư (1 -> 25%, 2->50%, 3->75%, 4->100%).

              Comment


              • #8
                cái chương trình con con này mà con 8051 nó ko làm được thì ném nó đi từ lâu rồi, mới có quét mỗi mấy cái phím và tạo cái tần số 10khz thôi bạn đã kêu như vậy rồi thì ... có khi ko cãi nhau nữa kẻo chém nhau sứt đầu mẻ chán
                timer nó làm công việc của timer, tách biệt hoàn toàn so với main, nó chỉ gây ngắt quãng khi tràn và nhảy vào hàm ngắt còn bình thường nó rảnh. cái chương trình này mới chỉ là 1 chương trình cực kỳ bé chưa có j mà to tát mà kêu mệt cả. tôi làm quét phím ma trận kết hợp quét led 7 thanh, tạo pwm thêm cả uart vào nó hãn còn chạy rầm rầm. mà cái đó cũng mới chỉ coi là project nhỏ chưa khai thác hết khả năng của chip. cái này là làm thật nhé chứ ko phải ngồi chém gió là mô phỏng đâu <mô phỏng xung 10khz ngon lành luôn>
                Website chính thức đổi địa chỉ website thành
                Mời các bạn ghé thăm !!!

                Comment


                • #9
                  Hay quá nhỉ, đã vậy làm 1 hiệp đấu coi của ai chính xác hơn. Cái này tuy là ứng dụng nhỏ nhưng lại đánh đúng vào điểm yếu của họ 89xx vì xung của họ này quá thấp, nó giống như kiểu jindo đá bóng rất giỏi nhưng nếu cứ đem chiều cao ra mà so thì lại chẳng bằng ai cả. Nhưng nếu làm mạch thực tế cứ cho là mình có đủ linh kiện để làm thì cũng chỉ cho nó chạy được chứ không có máy hiển thị sóng để biết được dạng hình nó ra sao còn đếm xung thì cứ coi như đúng như tính toán hoặc có thể làm bằng 1 con 89xx kết hợp với 4 led 7 đoạn.

                  Comment


                  • #10
                    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.
                    Last edited by tmtm; 12-11-2013, 21:54.

                    Comment


                    • #11
                      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.
                      Hình như bạn này viết ngược, bạn bảo là "Em loay hoay mãi mà code không chạy" vậy bạn làm được nhũng gì rồi đưa lên mọi người sửa cho có phải tốt hơn không, lấy code của người khác liệu bạn có hiểu được phuơng pháp thực hiện không? Và nếu mình có code thì mình sẽ code đúng như ở phía trên mình đã viết mà thôi chẳng có gì khác cả, nếu đọc phân tích gần gũi thân thiện thế mà bạn không hiểu được thì dám khẳng định bạn có nhận được code của mình cũng chỉ có nước học thuộc vẹt chứ chắc chắn không hiểu được.

                      Comment


                      • #12
                        Có ai sẵn lòng bớt 10 phút giúp em không?

                        Comment


                        • #13
                          Nguyên văn bởi tmtm Xem bài viết
                          Có ai sẵn lòng bớt 10 phút giúp em không?
                          10' đơn giản thôi, nhưng nếu không up những gì bạn làm được lên thì chẳng ai biết đâu mà lần. 10' nếu giúp được 1 người trở nên có ích hơn thì sẵn lòng thôi chỉ có điều nếu là đối phó thì đợi đó, 1' cũng phí hoài. Quan trọng bạn đi hướng nào, bạn làm được những gì rồi.

                          Comment


                          • #14
                            #include<reg51.h>

                            // PWM_Pin
                            sbit PWM_Pin = P1^0; // Pin P1.0 is named as PWM_Pin

                            // Function declarations
                            void cct_init(void);
                            void InitTimer0(void);
                            void InitPWM(void);

                            // Global variables
                            unsigned char PWM = 0; // It can have a value from 0 (0% duty cycle) to 255 (100% duty cycle)
                            unsigned int temp = 0; // Used inside Timer0 ISR


                            * When PWM_Freq_Num is equal to 1, then it means highest PWM frequency
                            * which is approximately 1000000/(1*255) = 3.9kHz

                            *
                            * So, in general you can calculate PWM frequency by using the formula
                            * PWM Frequency = 1000000/(PWM_Freq_Num*255)
                            */
                            #define PWM_Freq_Num 1 // Highest possible PWM Frequency


                            // Main Function
                            int main(void)
                            {
                            cct_init(); // Make all ports zero
                            InitPWM(); // Start PWM

                            PWM = 127; // Make 50% duty cycle of PWM

                            while(1) // Rest is done in Timer0 interrupt
                            {}
                            }

                            // Init CCT function
                            void cct_init(void)
                            {
                            P0 = 0x00;
                            P1 = 0x00;
                            P2 = 0x00;
                            P3 = 0x00;
                            }

                            // Timer0 initialize
                            void InitTimer0(void)
                            {
                            TMOD &= 0xF0; // Clear 4bit field for timer0
                            TMOD |= 0x01; // Set timer0 in mode 1 = 16bit mode

                            TH0 = 0x00; // First time value
                            TL0 = 0x00; // Set arbitrarily zero

                            ET0 = 1; // Enable Timer0 interrupts
                            EA = 1; // Global interrupt enable

                            TR0 = 1; // Start Timer 0
                            }

                            // PWM initialize
                            void InitPWM(void)
                            {
                            PWM = 0; // Initialize with 0% duty cycle
                            InitTimer0(); // Initialize timer0 to start generating interrupts
                            // PWM generation code is written inside the Timer0 ISR
                            }

                            // Timer0 ISR
                            void Timer0_ISR (void) interrupt 1
                            {
                            TR0 = 0; // Stop Timer 0

                            if(PWM_Pin) // if PWM_Pin is high
                            {
                            PWM_Pin = 0;
                            temp = (255-PWM)*PWM_Freq_Num;
                            TH0 = 0xFF - (temp>>8)&0xFF;
                            TL0 = 0xFF - temp&0xFF;
                            }
                            else // if PWM_Pin is low
                            {
                            PWM_Pin = 1;
                            temp = PWM*PWM_Freq_Num;
                            TH0 = 0xFF - (temp>>8)&0xFF;
                            TL0 = 0xFF - temp&0xFF;
                            }

                            TF0 = 0; // Clear the interrupt flag
                            TR0 = 1; // Start Timer 0
                            }
                            Đây là đoạn code thiếu đoạn code về Swich và tạo tần 10KHz

                            Comment


                            • #15
                              Nguyên văn bởi tmtm Xem bài viết
                              Đây là đoạn code thiếu đoạn code về Swich và tạo tần 10KHz
                              Bạn có hiểu cách này họ tạo PWM như thế nào không? còn mình thì chưa hiểu, vì cách của mình khác hoàn toàn với cách ở trên. Bạn có thể tưởng tượng như sau: *4 tần số cần tạo xung lên vậy là với mỗi xung ta có thể chia nhỏ thành 4 phần hình nó như thế này
                              Click image for larger version

Name:	abc.png
Views:	1
Size:	876 Bytes
ID:	1388349
                              Nếu bạn chọn tích cực duơng thì khi 25% xung thì nó sẽ như thế này
                              Click image for larger version

Name:	25.png
Views:	1
Size:	719 Bytes
ID:	1388350
                              Và khi 50% nó thế này
                              Click image for larger version

Name:	50.png
Views:	1
Size:	854 Bytes
ID:	1388351
                              75% thì thành thế này
                              Click image for larger version

Name:	75.png
Views:	1
Size:	733 Bytes
ID:	1388352
                              Về mặt tư duy thì mình sẽ làm đúng theo cách như thế này, còn về code thì có lẽ bạn nên tự thực hiện, nó không quá khó nếu bạn tiếp xúc vấn đề theo cách này.

                              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