RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Vấn đề PWM của PIC 18F4331

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #16
    Nguyên văn bởi gong05sk View Post
    Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.
    Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

    Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

    Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
    Code:
    #include <p18cxxx.h>
    
    #pragma config OSC = HS
    #pragma config FCMEN = OFF
    #pragma config IESO = OFF
    #pragma config PWRTEN = ON
    #pragma config BOREN = ON
    #pragma config BORV = 27
    #pragma config WDTEN = OFF
    #pragma config WINEN = OFF
    #pragma config WDPS = 32768
    #pragma config T1OSCMX = OFF
    #pragma config HPOL = HIGH
    #pragma config LPOL = HIGH
    #pragma config PWMPIN = ON
    #pragma config MCLRE = ON
    #pragma config EXCLKMX = RD0
    #pragma config PWM4MX = RD5
    #pragma config SSPMX = RD1
    #pragma config FLTAMX = RD4
    #pragma config STVREN = ON
    #pragma config LVP = OFF
    #pragma config DEBUG = OFF
    #pragma config CP0 = OFF
    #pragma config CP1 = OFF
    #pragma config CP2 = OFF
    #pragma config CP3 = OFF
    #pragma config CPB = OFF
    #pragma config CPD = OFF
    #pragma config WRT0 = OFF
    #pragma config WRT1 = OFF
    #pragma config WRT2 = OFF
    #pragma config WRT3 = OFF
    #pragma config WRTB = OFF
    #pragma config WRTC = OFF
    #pragma config WRTD = OFF
    #pragma config EBTR0 = OFF
    #pragma config EBTR1 = OFF
    #pragma config EBTR2 = OFF
    #pragma config EBTR3 = OFF
    #pragma config EBTRB = OFF
    
    void Init_PCPWM(void);
    
    void main() {
    	Init_PCPWM();
    	while (1) Nop();
    }
    
    void Init_PCPWM() {
    	PTCON0 = 0x04;		//postscale 1:1, prescale 1:4, free running
    	PTPERL = 0x9B;		//8 kHz @ 20 MHz
    	PTPERH = 0x00;
    	PWMCON0 = 0x40;		//PWM0..5 are enabled for PWM output
    	PWMCON1 = 0x01;		//postscale 1:1, output override are synchronized
    				//to the PWM time base
    	DTCON = 0x05;		//0.5 us dead time @ 20 MHz
    	OVDCOND = 0xFF;		//output on PWM I/O pin is controlled by duty cycle
    				//and time base
    	OVDCONS = 0x00;		//PWM I/O is INACTIVE when POUT is cleared
    	FLTCONFIG = 0x00;	//disable all fault pins
    	SEVTCMPL = 0;
    	SEVTCMPH = 0;
    	PDC0H = 0;
    	PDC1H = 0;
    	PDC2H = 0;
    	PDC3H = 0;
    	PDC0L = 0x80;		//Duty cycle of 20.5% at PWM1
    	PDC1L = 0xA0;		//Duty cycle of 25.6% at PWM3
    	PDC2L = 0xC0;		//Duty cycle of 30.8% at PWM3
    	PDC3L = 0xE0;		//Duty cycle of 35.9% at PWM7
    	PTCON1bits.PTEN = 1;
    }
    Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

    Thân,
    Biển học mênh mông, sức người có hạn.

    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
    http://www.picvietnam.com/forum/showthread.php?t=1263

    Comment

    • ttai
      Đệ tử 1 túi
      • Dec 2005
      • 12

      #17
      Nguyên văn bởi Macintosh View Post
      to anh Nam,
      em nghĩ thế mạnh của một trình dịch thể hiện ở chỗ nó có hỗ trợ cho người dùng nhiều hay không.CCS hỗ trợ rất nhiều,em không phủ nhận là phải hiểu gốc gác vấn đề,datasheet tất nhiên phải đọc.Nhưng em thiết nghĩ ,cái gì đã hỗ trợ sao lại không dùng,thời gian để nghiên cứu thứ khác .
      chẳng hạn,trong thiết lập PWM,nếu phải set các bit trong các thanh ghi Config PWM,eo ui,sẽ thật khó hiểu,cho bản thân,và cả cho người khác khi đọc chương trình,trong khi trong Help của CCS có hẳn các Built in Funtion, các lệnh C thật dễ hiểu để thiết lập,dễ chỉnh sửa chương trình sau này.
      Bạn nói cũng có phần đúng, cái gì đã hỗ trợ tốt thì mình cũng nên dùng. Nhưng ...
      *thứ nhất CCSC không hỗ trợ tốt cho người dùng. Bạn hãy để ý từ phiên bản đầu tiên đến bản mới nhất, phần Help của CCSC luôn rất khó sử dụng, phần ví dụ trong Help cũng khó tiếp cận. Tôi từng viết ASM cho PIC rất kỹ và hiện đang dùng CCSC nhưng lúc làm luận văn, viết PWM cho con PIC18F4431, dùng hàm của CCSC thì tôi cực kỳ vất vả. Đến lúc tức điên người lên không thèm dùng hàm built in nữa, tôi chuyển sang tự set thanh ghi cho PIC luôn, chạy tốt!
      * thứ hai, như tôi đã nói, ít ra cũng phải hiểu cấu trúc PIC, hiểu cách hoạt động của các thanh ghi (và viết ASM chính là để hiểu rõ điều này) thì mới viết C tốt. Khi đó nếu gặp vấn đề gì với C, ta có thể troubleshooting rất nhanh, không được nữa thì quay lại ASM. Vì C thật ra cũng là ASM mà ra.

      Tôi nghĩ nếu bạn chỉ là cần code để cho luận văn hay đề tài gì đó không dài hạn, hoặc bạn chỉ "ghé thăm" PIC trong một thời gian ngắn thì bạn cứ dùng C thoải mái mà không cần hiểu thanh ghi. Nhưng nếu đã quyết định sử dụng PIC cho công việc (dài hạn) thì nên tìm hiểu tường tận. Datasheet tuy khó hiểu nhưng hứa với bạn là chỉ trong thời gian đầu, lần thứ 2,3,4... bạn sẽ thấy dễ dần. Có gì khó hiểu bạn cứ post lên đây là ok thôi.
      Bye, good luck with PIC!

      Comment

      • Macintosh
        Đệ tử 3 túi
        • Nov 2007
        • 48

        #18
        Nguyên văn bởi ttai View Post
        Bạn nói cũng có phần đúng, cái gì đã hỗ trợ tốt thì mình cũng nên dùng. Nhưng ...
        *thứ nhất CCSC không hỗ trợ tốt cho người dùng. Bạn hãy để ý từ phiên bản đầu tiên đến bản mới nhất, phần Help của CCSC luôn rất khó sử dụng, phần ví dụ trong Help cũng khó tiếp cận. Tôi từng viết ASM cho PIC rất kỹ và hiện đang dùng CCSC nhưng lúc làm luận văn, viết PWM cho con PIC18F4431, dùng hàm của CCSC thì tôi cực kỳ vất vả. Đến lúc tức điên người lên không thèm dùng hàm built in nữa, tôi chuyển sang tự set thanh ghi cho PIC luôn, chạy tốt!
        * thứ hai, như tôi đã nói, ít ra cũng phải hiểu cấu trúc PIC, hiểu cách hoạt động của các thanh ghi (và viết ASM chính là để hiểu rõ điều này) thì mới viết C tốt. Khi đó nếu gặp vấn đề gì với C, ta có thể troubleshooting rất nhanh, không được nữa thì quay lại ASM. Vì C thật ra cũng là ASM mà ra.

        Tôi nghĩ nếu bạn chỉ là cần code để cho luận văn hay đề tài gì đó không dài hạn, hoặc bạn chỉ "ghé thăm" PIC trong một thời gian ngắn thì bạn cứ dùng C thoải mái mà không cần hiểu thanh ghi. Nhưng nếu đã quyết định sử dụng PIC cho công việc (dài hạn) thì nên tìm hiểu tường tận. Datasheet tuy khó hiểu nhưng hứa với bạn là chỉ trong thời gian đầu, lần thứ 2,3,4... bạn sẽ thấy dễ dần. Có gì khó hiểu bạn cứ post lên đây là ok thôi.
        Bye, good luck with PIC!
        đã là kỹ thuật thì sao lại ghé thăm hả bạn? còn có những thứ có thể bạn nói khó,tôi lại nói dễ,và ngược lại nữa,đúng ko bạn.còn cấu trúc tất nhiên là phải biết rùi,datasheet cũng phải đọc rùi.đúng là có nhiều tính năng PIC mà CCS ko có hỗ trợ thật.
        tôi cũng từng code ASM cho 8051,rùi mới xài PIC.Và tôi nghĩ đa số sv chúng ta cũng thường theo con đường đó nên cũng ko khó khi tìm hiểu cấu trúc PIC.còn C or ASM cũng chỉ là vấn đề về ngôn ngữ thui mà.

        Comment

        • gong05sk
          Nhập môn đệ tử
          • Jun 2007
          • 8

          #19
          Vẫn lại là những lời văn vẻ. Thôi tới đây em bức xô em chịu không nổi nữa. cái cảm giác chờ một người biết cách dạy cho mình học thật khó chịu. thôi thì tự tìm hiểu lấy vậy. dù biết rằng như thế sẽ mất đến vài tháng thậm chí cả năm. còn nếu có người chỉ thì chỉ mất vài ngày. Các bác làm em thất vọng quá. Các bác giỏi thì giỏi thật nhưng không biết cách dạy người khác. để khi nào em nắm bắt đc vấn đề em sẽ về và trình bày lại chủ đề này. há miệng chờ sung đúng là không phải cách.
          My home --> http://spktclup.com

          Comment

          • Macintosh
            Đệ tử 3 túi
            • Nov 2007
            • 48

            #20
            Nguyên văn bởi gong05sk View Post
            Hic mấy bác nghĩ rằng em đang ở mức nào mà không thèm chỉ vầy trời. Hướng dẫn cho người chưa biết gì khác với nói chuyện với người đã biết chứ. làm ơn viết dùm em một bài tập nhỏ như em đã ví dụ bên trên để em hình dung ra quá trình xử lý công việc cần làm là như thế nào. mấy bác gợi ý, mấy bác hướng dẫn em có thể nắm đc. nhưng cái quan trọng nhất là viết như thế nào thì em lại không biết. vậy nên mới tha thiết yêu cầu các bác viết ví dụ cụ thể từ A->Z hộ với. nếu là ASM thì làm ơn viết hết nguyên một chương trình. Quả thật là cấu trúc bộ nhớ pic em cũng còn chưa nắm đc. Nếu viết bằng C thì bác sử dụng thư viện nào, viết thêm hàm nào thì làm ơn viết hết ra dùm cái. Thiết nghĩ với một Ví dụ đơn giản như trên thì chương trình có là bao đâu sao các bác cứ khó dễ mãi thế.
            Vận động đi chứ!chờ ng khác dọn cỗ sẵn luôn ah.
            Vấn đề của u chính là ko chịu đọc những cái người khác đã làm,gì chứ ví dụ thì có một đống! Bạn ông bảo học PIC thì chắc chắn hắn đã copy cho ông cả đống tài liệu rùi,đúng ko.
            PWM,tôi đã post thiết lập của tôi đó.tôi đã dùng pic8f4331 để PWM cho 6 động cơ ,chạy rùi,robot cũng đã cất rùi,nên ko cần phải băn khoăn j cả.ông ko chịu làm đó thui!

            Comment

            • Macintosh
              Đệ tử 3 túi
              • Nov 2007
              • 48

              #21
              Nguyên văn bởi gong05sk View Post
              Vẫn lại là những lời văn vẻ. Thôi tới đây em bức xô em chịu không nổi nữa. cái cảm giác chờ một người biết cách dạy cho mình học thật khó chịu. thôi thì tự tìm hiểu lấy vậy. dù biết rằng như thế sẽ mất đến vài tháng thậm chí cả năm. còn nếu có người chỉ thì chỉ mất vài ngày. Các bác làm em thất vọng quá. Các bác giỏi thì giỏi thật nhưng không biết cách dạy người khác. để khi nào em nắm bắt đc vấn đề em sẽ về và trình bày lại chủ đề này. há miệng chờ sung đúng là không phải cách.
              Thứ nhất,ông quá nôn nóng.
              thứ nhì,ông ko chịu vận động.
              Đúng là khi tôi tiếp cận với PIC,con đầu tiên là 4331,mất hơn 2 tháng để đk PWM cái motor đầu tiên.tui biết hoàn cảnh của ông bây giờ.chẳng ai thích dạy đời ông cả và Đừng nói về những người đang muốn giúp ông như vậy.

              Comment

              • gong05sk
                Nhập môn đệ tử
                • Jun 2007
                • 8

                #22
                Bác nói thế là oan cho em đấy. Mấy ngày nay em đọc đi đọc ại muốn nát cả cái datasheet. xem tới xem lui không biết bao nhiêu ví dụ trong diễn đàn. và cuối cùng là em nhận ra mình chưa biết gì hết , nên em quay về với bài tập xuất led cơ bản đây. và cũng từ giã con 4331 này mà quay về con 16f877a cho nó bền, đơn giản vì nó có mô phỏng trên proteus. Cứ tưởng có thể học đc kinh nghiệm đi trước từ mấy bác cho rút ngắn bớt thời gian nhưng giờ thấy đó là sai lầm. Có thể em không kịp nắm con pic 4331 trước thời gian làm robot sắp tới. nhưng kệ cùng lắm thì quay về con P98v51 của philip đỡ vậy. còn con này cứ nghiên cứu sau. chứ tình trạng vầy chẳng biết đi về đâu.
                My home --> http://spktclup.com

                Comment

                • const_nos
                  Đệ tử 2 túi
                  • Jul 2008
                  • 33

                  #23
                  thắc mắc

                  mình đang làm với con 18f4331. tìm hiếu về PWM,nhưng vẫn chưa rõ lắm. Ban đâu mình định tạo xung ra không đổi của cặp PWM0 và PWM1.Mình làm như sau:

                  #include <18f4331.h>
                  #fuses NOWDT,PUT,HS,NOPROTECT
                  #use delay(clock=40000000)

                  void main()
                  {
                  setup_power_pwm_pins(PWM_COMPLEMENTARY,PWM_OFF,PWM _OFF,PWM_OFF);
                  setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,4 00,0,1,0);
                  set_power_pwm0_duty(100);
                  }

                  mình dùng oscilloscope nhưng thấy chan ra chẳng có gì . Còn có hiện tượng thông báo : Processor is in reset.Ai biết giúp mình với.Thank nhiều

                  Comment

                  • wonderkids
                    Nhập môn đệ tử
                    • Nov 2007
                    • 3

                    #24
                    Đoạn code của bạn có xung nhưng chỉ 1 xung mà thôi,bạn phải dùng lệnh while(1) để tạo vòng lặp,bạn tham khảo thêm nha,^_^

                    Comment

                    • Macintosh
                      Đệ tử 3 túi
                      • Nov 2007
                      • 48

                      #25
                      Nguyên văn bởi const_nos View Post
                      mình dùng oscilloscope nhưng thấy chan ra chẳng có gì . Còn có hiện tượng thông báo : Processor is in reset.Ai biết giúp mình với.Thank nhiều
                      hì, ốt-xì-lô đã báo vậy thì cũng kiểm tra một phát thử có đúng như vậy ko đi bạn. có thể chân MCLR bị nối mass đó.

                      Comment

                      • Macintosh
                        Đệ tử 3 túi
                        • Nov 2007
                        • 48

                        #26
                        Nguyên văn bởi wonderkids View Post
                        Đoạn code của bạn có xung nhưng chỉ 1 xung mà thôi,bạn phải dùng lệnh while(1) để tạo vòng lặp,bạn tham khảo thêm nha,^_^
                        ko phải vậy đâu bạn.

                        Comment

                        • truongqt
                          Đệ tử 2 túi
                          • Apr 2007
                          • 43

                          #27
                          Pwm pic

                          Nguyên văn bởi Macintosh View Post

                          - cái cần wan tâm chính là SETUP_POWER_PWM_PINS( ) ;SETUP_POWER_PWM( );SET_POWER_PWMX_DUTY( ) để làm việc với Power PWM.

                          Có vẻ gần được rùi đấy,mày mò xí nữa!!! bác phải làm rùi tớ mới hd tiếp được!
                          Bạn cho mình hỏi cách tạo bảng since theo ý muốn, dùng matlab ấy. Mình đang tìm cách tạo bảng sin dùng matlab mà ko biết làm thế nào đây.
                          Có ai biết ko vậy, giúp tớ với.
                          À, với lại 1 vấn đề nữa, đó là cách chọn tụ cho mạch lái cầu IGBT, sử dụng IR2101. Tụ này nằm ở phía các khóa cao (high). Bạn nào đã từng làm chưa vậy.
                          Trường.
                          http://vn.myblog.yahoo.com/nguyenvantruongqt

                          Comment

                          • vagabondtt1503
                            Đệ tử 2 túi
                            • Dec 2008
                            • 32

                            #28
                            Nguyên văn bởi namqn View Post
                            Trong các ví dụ của tôi, tôi không dùng hàm thư viện nào cả, chỉ thiết lập các thanh ghi như trong datasheet. Tôi viết bằng cú pháp của MPLAB C18, còn bạn dùng CCS C. Do đó, bạn phải tự thân vận động một chút.

                            Luồng này bạn hỏi về PWM chứ không hỏi về cách viết chương trình C ra sao, do đó tôi giả thiết là bạn biết cách đặt đoạn chương trình C mẫu vào chương trình của bạn. Nếu bạn chưa biết cách viết chương trình C, đề nghị bạn tìm một tài liệu hướng dẫn về ngôn ngữ C để đọc, sau đó đọc tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng. Sau đó, làm vài bài tập cơ bản để nắm được cách viết chương trình C trong trình biên dịch của bạn.

                            Dưới đây là toàn bộ chương trình tôi dùng để test PIC18F4431, viết cho MPLAB C18. Đừng yêu cầu tôi port code sang CCS C.
                            Code:
                            #include <p18cxxx.h>
                            
                            #pragma config OSC = HS
                            #pragma config FCMEN = OFF
                            #pragma config IESO = OFF
                            #pragma config PWRTEN = ON
                            #pragma config BOREN = ON
                            #pragma config BORV = 27
                            #pragma config WDTEN = OFF
                            #pragma config WINEN = OFF
                            #pragma config WDPS = 32768
                            #pragma config T1OSCMX = OFF
                            #pragma config HPOL = HIGH
                            #pragma config LPOL = HIGH
                            #pragma config PWMPIN = ON
                            #pragma config MCLRE = ON
                            #pragma config EXCLKMX = RD0
                            #pragma config PWM4MX = RD5
                            #pragma config SSPMX = RD1
                            #pragma config FLTAMX = RD4
                            #pragma config STVREN = ON
                            #pragma config LVP = OFF
                            #pragma config DEBUG = OFF
                            #pragma config CP0 = OFF
                            #pragma config CP1 = OFF
                            #pragma config CP2 = OFF
                            #pragma config CP3 = OFF
                            #pragma config CPB = OFF
                            #pragma config CPD = OFF
                            #pragma config WRT0 = OFF
                            #pragma config WRT1 = OFF
                            #pragma config WRT2 = OFF
                            #pragma config WRT3 = OFF
                            #pragma config WRTB = OFF
                            #pragma config WRTC = OFF
                            #pragma config WRTD = OFF
                            #pragma config EBTR0 = OFF
                            #pragma config EBTR1 = OFF
                            #pragma config EBTR2 = OFF
                            #pragma config EBTR3 = OFF
                            #pragma config EBTRB = OFF
                            
                            void Init_PCPWM(void);
                            
                            void main() {
                            	Init_PCPWM();
                            	while (1) Nop();
                            }
                            
                            void Init_PCPWM() {
                            	PTCON0 = 0x04;		//postscale 1:1, prescale 1:4, free running
                            	PTPERL = 0x9B;		//8 kHz @ 20 MHz
                            	PTPERH = 0x00;
                            	PWMCON0 = 0x40;		//PWM0..5 are enabled for PWM output
                            	PWMCON1 = 0x01;		//postscale 1:1, output override are synchronized
                            				//to the PWM time base
                            	DTCON = 0x05;		//0.5 us dead time @ 20 MHz
                            	OVDCOND = 0xFF;		//output on PWM I/O pin is controlled by duty cycle
                            				//and time base
                            	OVDCONS = 0x00;		//PWM I/O is INACTIVE when POUT is cleared
                            	FLTCONFIG = 0x00;	//disable all fault pins
                            	SEVTCMPL = 0;
                            	SEVTCMPH = 0;
                            	PDC0H = 0;
                            	PDC1H = 0;
                            	PDC2H = 0;
                            	PDC3H = 0;
                            	PDC0L = 0x80;		//Duty cycle of 20.5% at PWM1
                            	PDC1L = 0xA0;		//Duty cycle of 25.6% at PWM3
                            	PDC2L = 0xC0;		//Duty cycle of 30.8% at PWM3
                            	PDC3L = 0xE0;		//Duty cycle of 35.9% at PWM7
                            	PTCON1bits.PTEN = 1;
                            }
                            Nếu bạn nghĩ rằng tôi làm khó dễ bạn, lần sau tôi sẽ không trả lời câu hỏi của bạn nữa, để bạn khỏi bị làm khó dễ.

                            Thân,
                            Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

                            Cảm ơn anh

                            Comment

                            • namqn
                              Trưởng lão PIC bang
                              • Feb 2006
                              • 3020

                              #29
                              Nguyên văn bởi vagabondtt1503 View Post
                              Theo như code của anh thì PDCx = 4 x PTPER thì chu kỳ nhiệm vụ mới đạt 100%,cho em hỏi đây có phải là đặc tính của 18f4431 hay không?Vì trong tutorial 5 của anh viết cho DsPIC thì PDCx = 2 x PTPER ,chu kỳ nhiệm vụ đạt 100%

                              Cảm ơn anh
                              Module MCPWM của dsPIC hoạt động khác với module PCPWM của PIC18. Với PIC18 thì PDCx = 4 x PTPER sẽ tương ứng với duty cycle = 100 %.

                              Thân,
                              Biển học mênh mông, sức người có hạn.

                              Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                              http://www.picvietnam.com/forum/showthread.php?t=1263

                              Comment

                              • hoangtanduong13
                                Nhập môn đệ tử
                                • Nov 2008
                                • 2

                                #30
                                pwm cua pic 16f877a

                                ban nao ranh` ve pwm thi giup minh voi.minh vua tim dc cai code viet ve pwm,nhung ma compile no bao loi!de minh gui len cho cac ban!
                                Code:
                                #include <16F877A.h>
                                #include <DEFS_16F877A.h>
                                #fuses     NOWDT,PUT,HS,NOPROTECT,NOLVP
                                #use  delay(clock=10000000)
                                #use  fast_io(b)
                                
                                
                                #define  tocdo0   0     //toc do bang 0
                                #define  td_macdinh  80 //toc do mac dinh
                                #define  tocdo1   124   //1/5 toc do cuc dai
                                #define  tocdo2   248   //2/5 toc do cuc dai
                                #define  tocdo3   372   //3/5 toc do cuc dai
                                #define  tocdo4   496   //4/5 toc do cuc dai
                                #define  tocdo5   620   //toc do cuc dai
                                
                                int16 duty1=0;
                                int16 duty2=0;
                                int8  bientocdo=0;
                                int1  bienthuan=0;
                                int1  biennghich=0;
                                
                                   void main()                //bo PMW1 dk dco quay thuan
                                   {                          //bo PMW2 dk dco quay nghich
                                      set_tris_b(0x0ff);      //khoi tao port B la port nhap
                                      setup_ccp1(CCP_PWM);    //khoi tao bo PWM1
                                      setup_ccp2(CCP_PWM);    //khoi tao bo PWM2
                                
                                      setup_timer_2(T2_div_by_16,154,1);  //tao chu ky xung 1ms
                                                              //(1/clock)*4*t2div*(period+1)
                                                              //(1/10e6)*4*16*(154+1)=1e-3=1ms
                                
                                      set_pwm1_duty(duty1);   //gia tri duty cua PWM duoc tinh
                                      set_pwm2_duty(duty2);   //theo cong thuc duty1*t2div/clock
                                                              //khoi tao duty=0 ->tat dong co
                                
                                     while(true)
                                      {
                                      
                                
                                      if (!bit_test(portb,1))    //neu nhan phim FO : chay thuan
                                         {
                                            duty1=tocdo0;
                                            duty2=tocdo0;
                                            set_pwm1_duty(duty1);   //cho duty cua 2 bo PMW=0 de
                                            set_pwm2_duty(duty2);   //tat dong co
                                            delay_ms(1000);         //delay 1s de giam quan tinh dc
                                            bienthuan=1;
                                            biennghich=0;
                                            goto next;
                                         }
                                       
                                
                                       if (!bit_test(portb,2))    //neu nhan phim RE : chay nghich
                                         {
                                            duty1=tocdo0;
                                            duty2=tocdo0;
                                            set_pwm1_duty(duty1);   //cho duty cua 2 bo PMW=0 de
                                            set_pwm2_duty(duty2);   //tat dong co
                                            delay_ms(1000);         //delay 1s de giam quan tinh dc
                                            bienthuan=0;
                                            biennghich=1;
                                            goto next;
                                         }
                                       
                                
                                       if (!bit_test(portb,3))   //nhan phim toc do 1
                                          {
                                            bientocdo=1;
                                            goto next;
                                          }
                                
                                       if (!bit_test(portb,4))    //nhan phim toc do 2
                                          {
                                            bientocdo=2;
                                            goto next;
                                          }
                                
                                       if (!bit_test(portb,5))    //nhan phim toc do 3
                                          {
                                            bientocdo=3;
                                            goto next;
                                          }
                                
                                       if (!bit_test(portb,6))    //nhan phim toc do 4
                                          {
                                            bientocdo=4;
                                            goto next;
                                          }
                                
                                       if (!bit_test(portb,7))    //nhan phim toc do 5
                                            bientocdo=5;
                                
                                     next:
                                      if (!bit_test(portb,0))    //neu nhan phim OFF
                                         {
                                            duty1=tocdo0;
                                            duty2=tocdo0;
                                            set_pwm1_duty(duty1);   //cho duty cua 2 bo PMW=0 de
                                            set_pwm2_duty(duty2);   //tat dong co
                                            bienthuan=0;
                                            biennghich=0;
                                            bientocdo=0;            //xoa bien toc do
                                         }
                                
                                       if (bienthuan)
                                          {
                                            duty2 = tocdo0;
                                            switch (bientocdo)
                                               {
                                                  case  1: duty1= tocdo1;
                                                        break;
                                                  case  2: duty1= tocdo2;
                                                        break;
                                                  case  3: duty1= tocdo3;
                                                        break;
                                                  case  4: duty1= tocdo4;
                                                        break;
                                                  case  5: duty1= tocdo5;
                                                        break;
                                                  default  : duty1 = td_macdinh;
                                                        break;
                                               }
                                            set_pwm1_duty(duty1);   //cho dco chay thuan
                                            set_pwm2_duty(duty2);
                                          }
                                
                                        if (biennghich)
                                          {
                                            duty1 = tocdo0;
                                            switch (bientocdo)
                                               {
                                                  case  1: duty2= tocdo1;
                                                        break;
                                                  case  2: duty2= tocdo2;
                                                        break;
                                                  case  3: duty2= tocdo3;
                                                        break;
                                                  case  4: duty2= tocdo4;
                                                        break;
                                                  case  5: duty2= tocdo5;
                                                        break;
                                                  default  : duty2 = td_macdinh;
                                                        break;
                                               }
                                            set_pwm1_duty(duty1);   //cho dco chay nghich
                                            set_pwm2_duty(duty2);
                                          }
                                      }
                                   }
                                no bao toi 9 loi lan!nhug ma chu yeu la undefined indentifier portb
                                mog cac pac giup do!thank nhieu!
                                Last edited by namqn; 07-07-2009, 11:23 AM.

                                Comment

                                Working...