Thông báo

Collapse
No announcement yet.

Thảo luận về ARM LPC 2138/2148

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

  • #61
    Muốn có key của bản KeilARM, bạn mail cho tôi theo địa chỉ nqdinhx, yahoo.com.

    Hiện tại chúng tôi có viết một số luồng thảo luận bên arm.vn. Chỉ mới bắt đầu thôi, bằng một số công cụ mô phỏng. Bạn nào quan tâm thì qua đó xem thử.

    Chúc vui vẻ.
    Still waters run deep.

    Comment


    • #62
      Em đang mắc một vấn đề với việc điều chế xung. Mặc dù trong chương trình em đã viết giá trị cho PWMLER nhưng khi debug simulator thì giá trị này ko hề được nạp vào. Bác nào giải quyết được thì giúp em với đây là code:
      #include <LPC214X.H>
      int main (void)
      {
      PINSEL0 = 0x8A;
      // P0.0: PWM1, P0.1: PWM3, P0.3: MAT0.0
      T0EMR = 0x30;
      T0MCR = 2;
      T0MR0 = 14999;
      // dao gia tri tren chan MAT0.0
      PWMPCR = (1 << 3) | (1 << 9) | (1 << 11);
      // PWM1: single edge, PWM3: double edge, enable PWM1 & PWM3
      PWMMCR = 2;
      PWMMR0 = 29999;
      PWMMR1 = 14999;
      PWMMR2 = 9;
      PWMMR3 = 99;
      T0TCR = 1;
      // enable timer 0
      PWMTCR = 9;
      // enable counter va PWM
      PWMLER = 0x4;
      while (1){
      if(PWMTC == 10)
      PWMMR3 = PWMMR3 + 10;
      }
      }
      Đây là ảnh simulator:
      http://i47.photobucket.com/albums/f1...n_ptit/pwm.jpg
      |

      Comment


      • #63
        Bạn viết sai 1 chỗ rồi:
        Code:
        PWMLER = 0x4;
        while (1){
        if(PWMTC == 10)
        PWMMR3 = PWMMR3 + 10;
        }
        Nếu bạn muốn thay đổi duty cycle của xung PWM3 bằng cách thay đổi giá trị của PWMMR3 thì phải sửa đoạn trên thành như vậy:
        Code:
        while (1)
        {
        	if(PWMTC == 10)
        	{
        		PWMMR3 = PWMMR3 + 10;
        		PWMLER = 0x08;
        	}
        }
        Khi bạn muốn thay đổi giá trị của 1 thanh ghi PWMMR0-6 thì bạn phải set các bit tương ứng trong thanh ghi PWMLER lên 1 (bit tương ứng của PWMMR3 là bit số 3, nếu muốn thay đổi PWMMR3 phải set PWMLER là 0x08 chứ ko phải là 0x04), ở xung kế tiếp giá trị mới được sử dụng và các bit trong PWMLER được xoá 1 cách tự động, có nghĩa là mỗi lần thay đổi các thanh ghi PWMMR0-6 thì lại phải set lại giá trị của PWMLER. Bạn có thể dùng cái Logic Analyzer có trong debug của Keil để kiểm tra kết quả

        Comment


        • #64
          Cảm ơn bác tuansoiBk nhiều nhiều. Tối qua ngồi đọc lại em cũng đã tìm ra chỗ sai của mình và viết lại được. À tiện thể cho em hỏi luôn. Bây giờ em muốn nó cứ phát 1 xung xong thì dừng một thời gian do mình chọn trước. Sau đó mới phát xung tiếp theo với độ rộng xung thay đổi nhưng cycle ko thay đổi thì theo bác phải làm thế nào.
          |

          Comment


          • #65
            À hôm trước em lỡ xin ***** nhầm chỗ. bị phạt thẻ đỏ mà tại sao em muốn xóa bài đó đi mà ko được. Phạt thế có bị làm sao ko nhỉ .:d
            |

            Comment


            • #66
              Mình nghĩ ra 1 cách này: bây giờ PWM3 (double edge, dùng PWMMR0, PWMMR2, PWMMR3), set cho timer của PWM reset, dừng lại và gây ra ngắt mỗi khi Match 0, trong hàm ngắt của PWM thì disable bộ PWM đi, lại khởi động Timer0 theo cái thời gian mà mình muốn dừng phát xung. Set cho Timer0 cũng reset, dừng lại và gây ra ngắt luôn. Trong hàm ngắt của Timer0 thì mình lại disable Timer0 đi, khởi động lại PWM theo các giá trị mới...Tức là PWM sẽ phát xung, còn thời gian ko phát xung thì điều khiển bằng Timer0. Mình nghĩ vậy thôi, bạn làm thử xem sao nhé, không biết có được ko đây

              Comment


              • #67
                nghe cũng có vẻ có lí, để em thử làm xem nào.
                |

                Comment


                • #68
                  Cho mình hỏi: Mình có 1 RC Servo chạy với f=50hz và 1 DC f=20Khz, vậy PWM của ARM7 LPC2148 có thể đồng thời điều khiển tốc độ chúng được ko? Mong diễn đàn tư vấn giúp!!!

                  Comment


                  • #69
                    Theo mình nghĩ thì không bởi lẽ PWM chỉ thực hiện điều chế độ rộng xung thôi. còn tần số của 6 ngõ ra LPC2148 đều được xác định bởi PWMMR0. Do đó có lẽ là ko thể đưa ra được 2 tần số đồng thời đâu. Mình nghĩ vậy nếu sai thì mọi người góp ý nha.
                    |

                    Comment


                    • #70
                      Mình thấy PWM con LPC2148 chỉ có 1 Timer/Counter phục vụ. Như vậy nó chỉ có thể đồng thời điều xung trên nhiều chân với cùng tần số. Với lại mình cũng chưa biết mục đích nào khác của việc phân chia chế độ Single Edge và Double Edge, ngoài việc 2 chế độ này cho ra những xung lệch pha nhau. Mình cũng mới tìm hiểu, mong mọi người góp ý. Phải chăng do
                      là mình chưa hiểu rõ, hay PWM của LPC2148 có hạn chế!?

                      Comment


                      • #71
                        cho em hỏi chip ARM có gì mạnh hơn mấy con AVR hay PIC hay 8051 mà mình phải xài nó. Sao không xài 8051 hay PIC cho nhanh.

                        Comment


                        • #72
                          Cho mình hỏi thế này là sao ,có cách gì khắc phục không ,theo mình nghĩ phải có licence mới khắc phục được thì phải ?

                          RS232.axf: error: L6047U: The code in this image is 16716 bytes - this version of the linker will not create images that large

                          Comment


                          • #73
                            Có thể nguyên nhân là do bạn đã dùng bản keil Eluvation nó sẽ giới hạn size code less than 16K nên nó không thể debug được code lớn hơn 16K bạn có thể dùng bản mới 3.22a nó cho phép debug tới 32K hoặc là xin ...... mà nhập vào
                            |

                            Comment


                            • #74
                              Mình thiết lập đoạn code sau đây để dùng UART0 với Baud=2400 , sao khi truyền lên máy tính xem thì bị lỗi font vậy ,trước đây mình dùng các dòng khác như 89 hay PIC thì vẫn truyền lên OK mà ! Các bác giúp xem thiết lập tốc độ baud như vậy đã đúng là 2400 chưa ,cảm ơn!

                              PINSEL0 &= 0xFFFFFFF0; // Reset P0.0,P0.1 Pin Config
                              PINSEL0 |= 0x00000001; // Select P0.0 = TxD(UART0)
                              PINSEL0 |= 0x00000004; // Select P0.1 = RxD(UART0)

                              U0LCR &= 0xFC; // Reset Word Select(1:0)
                              U0LCR |= 0x03; // Data Bit = 8 Bit
                              U0LCR &= 0xFB; // Stop Bit = 1 Bit
                              U0LCR &= 0xF7; // Parity = Disable
                              U0LCR &= 0xBF; // Disable Break Control
                              U0LCR |= 0x80; // Enable Programming of Divisor Latches

                              // U0DLM:U0DLL = 15.00 MHz / [16 x Baud]
                              // = 15.00 MHz / [16 x 2400]
                              // = 390.6 = 391 = 0187H
                              U0DLM = 0x01; // Program Divisor Latch(391) for 2400 Baud
                              U0DLL = 0x87;

                              U0LCR &= 0x7F; // Disable Programming of Divisor Latches

                              U0FCR |= 0x01; // FIF0 Enable
                              U0FCR |= 0x02; // RX FIFO Reset
                              U0FCR |= 0x04; // TX FIFO Reset
                              U0FCR &= 0x3F;

                              Comment


                              • #75
                                hic , pac oi;thach anh trong mach pac dung bao nhieu vay!sao de tinh toan trong code vay 15MHZ vay

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X