PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Các ngôn ngữ lập trình khác (CCS C, HT PIC,...)

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 28-06-2007, 04:36 PM   #1
che
Nhập môn đệ tử
 
che's Avatar
 
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.
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-06-2007, 08:54 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 08:41 AM   #3
che
Nhập môn đệ tử
 
che's Avatar
 
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);
	   
   }
}
khi em chưa truyền tham số xuống cho bộ PWM từ máy tính ,mà động cơ đã chạy luôn rồi anh ạ .khi em truyền các tham số khác nhau thì chip chỉ out ra một giá trị PWM duy nhất,em chưa biết lỗi của nó anh ạ. Em dùng bộ PWM0 và PWM1 để điều khiển 2 động cơ ,chương trình em viết vẫn còn thiếu nhiều và em chưa sử dụng bộ QEI của nó,em sẽ viết tiếp và anh kiểm tra hộ em nhé

thay đổi nội dung bởi: falleaf, 29-06-2007 lúc 03:19 PM.
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 08:54 AM   #4
che
Nhập môn đệ tử
 
che's Avatar
 
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 ạ
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 04:20 PM   #5
che
Nhập môn đệ tử
 
che's Avatar
 
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é
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 04:28 PM   #6
che
Nhập môn đệ tử
 
che's Avatar
 
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é
File Kèm Theo
File Type: rar dcmotorcontrol.rar (19.0 KB, 203 lần tải)
File Type: rar Project DK dong co.rar (7.3 KB, 171 lần tải)
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 08:01 PM   #7
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 10:00 PM   #8
che
Nhập môn đệ tử
 
che's Avatar
 
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 ạ
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-06-2007, 11:20 PM   #9
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2007, 04:30 AM   #10
che
Nhập môn đệ tử
 
che's Avatar
 
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.
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2007, 08:39 PM   #11
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi che View Post
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.
Bạn hiểu sai rồi. 0 đến 16383 là phạm vi giá trị cho phép đối với giá trị của tham số duty trong cú pháp trên.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2007, 06:59 AM   #12
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Trích:
Stores the value of duty into the appropriate PDCXL/H register. This duty value is the amount of time that the PWM output is in the active state.
Bạn dịch thử chính xác cái câu này ra xem, nó là nội dung của hàm mà bạn đang dùng đó.

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
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-06-2007, 08:43 PM   #13
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi falleaf View Post
Bạn dịch thử chính xác cái câu này ra xem, nó là nội dung của hàm mà bạn đang dùng đó.

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
Bạn này đang định dùng module Power Control PWM của PIC18F4431, còn lệnh mà em nói là cho chế độ PWM của module CCP (có mặt trong mọi con PIC18, trừ PIC18F1x30).

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 01-07-2007, 06:11 PM   #14
che
Nhập môn đệ tử
 
che's Avatar
 
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
che vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-01-2008, 12:38 PM   #15
Macintosh
Đệ 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é!
Macintosh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 12:26 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam