|
28-06-2007, 04:36 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
Sử dụng PWM1,3 của PIC18F4431 như thế nào?
mình chỉ có thể out pwm ra trên 2 chân PWM1 và PWM3,còn 2 chân 0,2 thì không biết out ra như thế nào? lệnh thì lại như thế này
set_power_pwm2_duty(4000); set_power_pwm0_duty(4000); đáng lẽ nó phải out pwm ra trên 2 chân PWM0 và PWM2.Thật khó hiểu mình đọc HELP trongCCS thấy có đoạn sau: Syntax: set_power_pwmX_duty(duty) Parameters: X is 0, 2, 4, or 6 Duty is an integer between 0 and 16383. như vậy nếu muốn out PWM ra các chân còn lại thì làm thế nào? Các huynh đệ giúp mình với thay đổi nội dung bởi: che, 29-06-2007 lúc 12:07 PM. |
28-06-2007, 08:54 PM | #2 |
Trưởng lão PIC bang
|
PIC18F4431 có 4 bộ tạo power PWM độc lập, mỗi bộ dùng để lái 1 cặp chân tương ứng, chẳng hạn PWM0 và PWM1. Do vậy CCS C chỉ cung cấp 4 lệnh set_power_pwmx_duty() cho x = 0, 2, 4, và 6. Tuy nhiên, chân nào được kích hoạt theo PWM còn tùy thuộc vào sự thiết lập mode làm việc của cặp chân đó là Independent hay Complimentary. Với Independent mode, bạn có 3 khả năng khác nhau là cả hai chân đều off, chỉ có chân lẻ on, hay cả hai chân đều on. Các mode làm việc của các cặp chân PWM được thiết lập bằng hàm setup_power_pwm_pins(). Hãy đọc thêm tài liệu của CCS C.
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 |
29-06-2007, 08:41 AM | #3 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
em cảm ơm anh namqn,em cũng đã đọc kỹ các hướng dẫn trong CCS và cũng đẫ thay đổi các option trong setup_power_pwm_pins(),mà vẫn không được anh ạ. anh xem đoạn code em viết có sai không nhé
Code:
#include <18F4431.h> #include <DEF_18F4431.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK) int16 counter=0; int16 soxung=0; int16 period; int1 BLINK=1; int16 ch=16383; #int_EXT EXT_isr() { output_bit(PIN_D7, BLINK); //đo xung trên chân D7 xem đã vào ngắt chưa counter++; BLINK = !BLINK; output_bit(PIN_D7, BLINK); } #INT_TIMER1 void ngat_timer() { int i; set_timer1(0xEC78); // sets timer to interrupt in 1ms soxung=counter; counter = 0; // reset counter } void main() { setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // setup interrupts enable_interrupts(INT_TIMER1); enable_interrupts(global); enable_interrupts(int_ext); ext_int_edge(H_to_L); enable_interrupts(GLOBAL); period = 4095; //Frequency = Fosc / (4 * (period+1) * postscale) setup_power_pwm_pins (PWM_ODD_ON, PWM_ODD_ON, PWM_OFF, PWM_OFF); setup_power_pwm (PWM_CLOCK_DIV_4|PWM_FREE_RUN, 1, 0, period, 0, 1, 0); //add dead time while (true) { ch = getc(); set_power_pwm0_duty(ch); set_power_pwm2_duty(ch); putc(ch); } } thay đổi nội dung bởi: falleaf, 29-06-2007 lúc 03:19 PM. |
29-06-2007, 08:54 AM | #4 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
Syntax:
setup_power_pwm_pins(module0,module1,module2,modul e3) Parameters: For each module (two pins) specify: PWM_OFF, PWM_ODD_ON, PWM_BOTH_ON, PWM_COMPLEMENTARY em đã thử hết các chế độ trên mà không được anh ạ |
29-06-2007, 04:20 PM | #5 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
anh namqn ơi,khi em test truyền thông bằng một chương trình đơn giản là PIC nhận được một số truyền xuống rồi lại đẩy số đó ngược lên máy tính ,thì đúng. VD em truyền xuống 3000 thì cũng nhận về được 3000.Nhưng nếu em out giá trị này ra PWM0 thì PWM0 out ra xung ,nhưng không phải là của số 3000,vì khi em thay đổi thì nó vẫn out ra xung y như thế anh ạ, em không hiểu pic nhận được gì khi em truyền số 3000 xuống,và tại sao khi out lên máy tính thì đúng,mà khi out ra PWM thì lại ko đúng.Anh giúp em với nhé
|
29-06-2007, 04:28 PM | #6 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
đây là sơ đồ mạch và giao diện dùng để test của em anh ạ,anh xem giúp em nhé
|
29-06-2007, 08:01 PM | #7 |
Trưởng lão PIC bang
|
Tôi không dùng CCS C, chỉ đọc tài liệu hướng dẫn của nó và so sánh với code của bạn để nhận xét. Nếu tôi có dùng một C compiler nào đó, tôi vẫn không dùng các hàm của compiler khi không hiểu nó sẽ làm gì trong các hàm đó. Tôi sẽ tự thiết lập các thanh ghi cần thiết cho các module, và thử nghiệm các khả năng khác nhau.
Bạn nói rằng khi đặt 3000 cho PWM0 thì nó ra giá trị không phải của 3000, vậy theo bạn nếu đặt 3000 vào PWM0 thì bạn phải có duty cycle là bao nhiêu %, và duty cycle bạn hiện có được là bao nhiêu? 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 |
29-06-2007, 10:00 PM | #8 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
đấy là khi em truyền 3000 từ máy tính xuống thì PWM0 ko out ra được duty cycle =3000/16383 % anh ạ
|
29-06-2007, 11:20 PM | #9 |
Trưởng lão PIC bang
|
Lý do nào khiến bạn cho rằng chu kỳ của xung PWM là 16383?
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 |
30-06-2007, 04:30 AM | #10 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
em đọc trong help của CCS thấy có đoạn viết như thế này nên em hiểu thế ko biết có đúng ko?
Syntax: set_power_pwmX_duty(duty) Parameters: X is 0, 2, 4, or 6 Duty is an integer between 0 and 16383. |
30-06-2007, 08:39 PM | #11 | |
Trưởng lão PIC bang
|
Trích:
Duty cycle của tín hiệu PWM là thời gian tín hiệu ở mức tích cực so với thời gian của toàn bộ chu kỳ. Ở đây, hàm chỉ đặt giá trị vào các thanh ghi PDCL và PDCH của module Power Control PWM trong PIC18Fxx31. Bạn cần phải xác định thời gian của toàn bộ chu kỳ nữa, nó được thiết lập thông qua các thanh ghi PTCON và PTPER (thiết lập prescale, postscale và chế độ chạy của timer dành riêng dùng làm time base cho module, và giá trị ngưỡng trong thanh ghi PTPER để quyết định thời gian của 1 chu kỳ). Thư viện của CCS C cung cấp cho bạn các hàm để thuận tiện hơn trong việc viết code, nhưng bạn vẫn phải nắm rõ module mình đang dùng để có những thiết lập thích hợp. Trình biên dịch không thể thay bạn quyết định những tham số đó. Tôi đề nghị bạn đọc lại phần hướng dẫn của hàm setup_power_pwm, đảm bảo là bạn nắm rõ ý nghĩa của từng tham số trong hàm. Tôi cũng đề nghị bạn đọc lại phần 17 trong datasheet của PIC18F4431, nói về module Power Control PWM (tôi biết là nó dài, nhưng bạn đọc nó sẽ tốt hơn). Sau đó thử xác định xem với những gì bạn đã viết thì thời gian của 1 chu kỳ là bao nhiêu, và duty cycle tương ứng là bao nhiêu, nó có đúng như bạn đã thấy trong thực tế hay không. 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 |
|
30-06-2007, 06:59 AM | #12 | |
PIC Bang chủ
|
Trích:
Còn cái mà bạn định dùng, theo F nghĩ nó là hàm này: set_pwmX_duty(value) trong đó Bạn thử lại chương trình xem sao nhé. Chúc vui
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
30-06-2007, 08:43 PM | #13 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
01-07-2007, 06:11 PM | #14 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 9
: |
em đọc và cũng không hiểu rõ được các tham số của nó ,tuy nhiên em đã có thể điều chỉnh được tần số của bộ PWM theo ý mình,và có thể điều khiển được độc lập các chân của 4 modul PWM
với một setup như sau em có được tần số băm xung là 1,53KHz setup_power_pwm(PWM_CLOCK_DIV_128 | PWM_FREE_RUN | PWM_DEAD_CLOCK_DIV_16,1,10000,50,0,1,0); set_power_pwm0_duty(pwm); pwm từ 0 đến 200; khi muốn điều khiển độc lập từng chân PWM của Modul 0 và 1 em cấu hình như sau setup_power_pwm_pins (PWM_BOTH_ON, PWM_BOTH_ON, PWM_OFF, PWM_OFF); nó sẽ out PWM ra trên cả 2 chân 0 và 1 của modul0,bây giờ muốn cấm chân nào em dùng hàm set_power_pwm_override(1, true, 1);// cấm xung ra trên chân 1 ,đưa nó lên 5V |
27-01-2008, 12:38 PM | #15 |
Đệ tử 3 túi
Tham gia ngày: Nov 2007
Bài gửi: 48
: |
to Che
mình cũng vừa gặp vấn đề của bạn đó.nhưng vấn đề có vẻ ổn rùi,đọc kĩ datasheet bạn ạ.xin chia sẻ với bạn nhé píc8f4x31 được giói thiệu là 8 channels.nhưng chỉ có 4 modules đúng ko.như vậy ta chỉ có thể dk dc độc lập 4 motor thui.còn cái 8 channel là để dk cầu H(chi tiết trong datasheet) các mode của power_pwm ,ví dụ cho module 0 nhé: PWM_BOTH_ON : nghĩa là cả chân pwm0,pwm1 đều xuất ra pwm ,và như nhau pwm_complementary : pwm0,pwm1 đều xuất,và bù nhau (để cho câu H đó) pwm_odd _on: chỉ có kênh lẻ xuất pwm.cái này mình dùng đó.nghĩa là với 4 modules,thì ta dùng các chân pwm 1,3,5,7 để dk 4 motor,độc lập với nhau. mình ko dùng đến: set_power_pwm_override bạn thử xem nhé! |
|
|