PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   Sử dụng PWM1,3 của PIC18F4431 như thế nào? (http://www.picvietnam.com/forum/showthread.php?t=1228)

che 28-06-2007 04:36 PM

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

namqn 28-06-2007 08:54 PM

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,

che 29-06-2007 08:41 AM

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é

che 29-06-2007 08:54 AM

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 29-06-2007 04:20 PM

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 29-06-2007 04:28 PM

2 Attachment(s)
đây là sơ đồ mạch và giao diện dùng để test của em anh ạ,anh xem giúp em nhé

namqn 29-06-2007 08:01 PM

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,

che 29-06-2007 10:00 PM

đấ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 ạ

namqn 29-06-2007 11:20 PM

Lý do nào khiến bạn cho rằng chu kỳ của xung PWM là 16383?

Thân,

che 30-06-2007 04:30 AM

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.

falleaf 30-06-2007 06:59 AM

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

namqn 30-06-2007 08:39 PM

Trích:

Nguyên văn bởi che (Post 9701)
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,

namqn 30-06-2007 08:43 PM

Trích:

Nguyên văn bởi falleaf (Post 9705)
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,

che 01-07-2007 06:11 PM

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

Macintosh 27-01-2008 12:38 PM

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é!


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam