PDA

View Full Version : cần giúp đỡ về Power PWM pic8f4431


daythienha2007
17-11-2008, 11:04 PM
em có viết code điều khiển microstep cho dc Bưóc,nên xài các chân PWm1,3,5,7 đê điều khiển nhưng ko bít sao pwm ko chạy theo ý mún.Chương trình cảu em như sau:
#include <18f4431.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT,NOLVP
#use delay(clock=20000000)
//int8 duty_cycle;

void main()

{ while(true)
{
setup_power_pwm_pins(PWM_ODD_ON,PWM_ODD_ON,PWM_ODD _ON,PWM_ODD_ON);
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,8 0,0,1, 0);
set_power_pwm_override(1, false, 0);
set_power_pwm_override(3, false, 0);
set_power_pwm_override(5, false, 0);
set_power_pwm_override(7, false, 0);
set_power_pwm0_duty(200); //motor1
set_power_pwm2_duty(500); //motor2
set_power_pwm4_duty(0); //motor3
set_power_pwm6_duty(1000); //motor4

// setup_power_pwm_pins(PWM_odd_on,PWM_OFF,PWM_OFF,PW M_OFF);
// setup_power_pwm(PWM_CLOCK_DIV_16,1,0,1000,1,0);
// set_power_pwm1_override(1,false,0);
// set_power_pwm0_duty(1000);

}
}

nếu mắc động co thường vào chân PWM1 thì nó vẫn chạy,nhưng ko theo ý mình nghĩa là em set_power_pwm0_duty bằng bao nhiu thì động cơ vẫn chạy ở một vận tốc nhất định.lấy đồng hồ đo thì nó lên 0V.các chân PWm3.5,7 cũng vậy.
Em thử xoá đoạn code set_power_pwm_override(7, false, 0);
set_power_pwm0_duty(200); //motor1
set_power_pwm2_duty(500); //motor2
set_power_pwm4_duty(0); //motor3
set_power_pwm6_duty(1000); //motor4
nhưng nó cũng chạy như chưa từng xoá
chỉ khi em xoá setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,1,0,8 0,0,1, 0);
thì nó moi dừng
em xài thạch anh 20MHz.Xin Các anh chỉ bảo giúp em
em mò hoài mà ko dc

cong1810
17-11-2008, 11:17 PM
setup_power_pwm(prescale,modes, postscale, time_base, period, compare, compare_postscale, dead_time)
nếu dò theo như vậy thì có lẽ bạn ko sử dụng chế độ time base.vậy thì làm sao mà PWM tuân theo duty cycle của bạn nhỉ!! sửa lại hen!!
setup_power_pwm(PWM_CLOCK_DIV_4|PWM_FREE_RUN,0,1,0 ,80,0,1, 0);

daythienha2007
18-11-2008, 10:35 PM
Cám ơn bạn Cóng810 đã giúp đỡ trả lời dùm,nhưng mình đã đọc kĩ phần help của CCS 4.057 nó hướng dãn setup_power_PWM như sau:
setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time) khác với cái anh bạn hướng dẫn.Xin bạn xem kĩ lại dùm.Mình thử copy cái setup mà bạn đã sửa nhưng trình biên dịch CCS báo lỗi,vì không đúng theo cú pháp của nó.
Em cũng đâ thử cho time_base =1000,nhưng động cơ vẫn không chậy đúng duty mà mình đã set.
Mong nhận được sừ hướng dẫn giúp đỡ của các bạn

namqn
18-11-2008, 10:44 PM
Cám ơn bạn Cóng810 đã giúp đỡ trả lời dùm,nhưng mình đã đọc kĩ phần help của CCS 4.057 nó hướng dãn setup_power_PWM như sau:
setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time) khác với cái anh bạn hướng dẫn.Xin bạn xem kĩ lại dùm.Mình thử copy cái setup mà bạn đã sửa nhưng trình biên dịch CCS báo lỗi,vì không đúng theo cú pháp của nó.
Em cũng đâ thử cho time_base =1000,nhưng động cơ vẫn không chậy đúng duty mà mình đã set.
Mong nhận được sừ hướng dẫn giúp đỡ của các bạn
Vậy bạn cho rằng duty cycle nên bằng bao nhiêu với code của bạn?

Thân,

daythienha2007
19-11-2008, 12:25 AM
thật ra mình chưa muốn quan tâm đến duty cycle vội .Việc đầu tiên là cần giải quyết là tại sao mình thay đổi phần set_power_pwmX_duty(duty_cycle)nhưng lhông hiêu sao nó chẳng thấy thay đổi gì cả.không giống như chế độ PWM ở chân CCP1 mình thay đổi ở duty cycle trong set_pwm1_duty(duty_cycle).trong ccp1 nếu thay đổi dutycycle thì sẽ thấy kết quả khác nhau.nhưng trong các chân PWM power ko bit sao thay dổi ko dc.
Mong bạn nampn giải đáp dùm.thanks!..

namqn
19-11-2008, 01:27 AM
thật ra mình chưa muốn quan tâm đến duty cycle vội .Việc đầu tiên là cần giải quyết là tại sao mình thay đổi phần set_power_pwmX_duty(duty_cycle)nhưng lhông hiêu sao nó chẳng thấy thay đổi gì cả.không giống như chế độ PWM ở chân CCP1 mình thay đổi ở duty cycle trong set_pwm1_duty(duty_cycle).trong ccp1 nếu thay đổi dutycycle thì sẽ thấy kết quả khác nhau.nhưng trong các chân PWM power ko bit sao thay dổi ko dc.
Mong bạn nampn giải đáp dùm.thanks!..
Tôi không dùng CCS C nên không rõ phải thiết lập các hàm đó ra sao, ngoài việc đọc tài liệu để nắm cú pháp. Bạn có thể thử thiết lập các thanh ghi bằng tay, thay vì dùng các hàm thư viện của CCS C.

Tôi có thể giúp bạn kiểm tra code nếu bạn dùng cách thiết lập các thanh ghi bằng tay.

Thân,

LeDuc
19-11-2008, 12:24 PM
thật ra mình chưa muốn quan tâm đến duty cycle vội .Việc đầu tiên là cần giải quyết là tại sao mình thay đổi phần set_power_pwmX_duty(duty_cycle)nhưng lhông hiêu sao nó chẳng thấy thay đổi gì cả.không giống như chế độ PWM ở chân CCP1 mình thay đổi ở duty cycle trong set_pwm1_duty(duty_cycle).trong ccp1 nếu thay đổi dutycycle thì sẽ thấy kết quả khác nhau.nhưng trong các chân PWM power ko bit sao thay dổi ko dc.
Mong bạn nampn giải đáp dùm.thanks!..
C ái này là do bạn khai báo pwm ko đúng .
setup_power_pwm_pins(module0,module1,module2,modul e3)
PWM_ODD_ON : cái này chỉ cho phep các chân pwm lẽ xuất xung (pwm 1,3,5,7).Và các chân này bạn cũng cấm xuất xung nên khi đo cũng không có áp là đúng rôi ...(vì bạn đã khai báo trong chế độ OVERRIDE).
Vì vậy việc thay đổi duty của bạn kô ăn thua gì là phải rồi ...
Còn về vấn đề duty , thì trong data sheet có công thức tính đó , ứng với tần số thạch anh Fosc/4 , và tần số pwm Fpwm , bạn sẽ có độ phân giải của duty la bao nhiêu bit ...
Và tương ứng với giá trị mà bạn nạp vào PTMR+2 bit LSB nữa == giá trị duty max .
Bạn xem lại kỷ nhé .

cong1810
19-11-2008, 05:13 PM
Cám ơn bạn Cóng810 đã giúp đỡ trả lời dùm,nhưng mình đã đọc kĩ phần help của CCS 4.057 nó hướng dãn setup_power_PWM như sau:
setup_power_pwm(modes, postscale, time_base, period, compare, compare_postscale, dead_time) khác với cái anh bạn hướng dẫn.Xin bạn xem kĩ lại dùm.Mình thử copy cái setup mà bạn đã sửa nhưng trình biên dịch CCS báo lỗi,vì không đúng theo cú pháp của nó.
Em cũng đâ thử cho time_base =1000,nhưng động cơ vẫn không chậy đúng duty mà mình đã set.
Mong nhận được sừ hướng dẫn giúp đỡ của các bạn

thực ra 2 cái mà bạn và mình ghi là giống nhau đấy.thực ra phần prescale cũng nằm trong phần modes,mình ghi vậy để rõ hơn cho bạn thui!( các lệnh thiết lập trong phần mode được ngăn cách bằng dấu "|" mà luôn luôn phải khai báo prescale nên mình tách ra)! nhưng ko ngờ lại làm bạn khó nghĩ!! sorry nhé

còn cú pháp thì mình làm chạy bình thường mà!! với lại mình copy của bạn.chỉ đổi chỗ 2 số 0,1 thì làm sao mà code bạn chạy mà code mình báo lỗi!!!

daythienha2007
19-11-2008, 08:01 PM
C ái này là do bạn khai báo pwm ko đúng .
setup_power_pwm_pins(module0,module1,module2,modul e3)
PWM_ODD_ON : cái này chỉ cho phep các chân pwm lẽ xuất xung (pwm 1,3,5,7).Và các chân này bạn cũng cấm xuất xung nên khi đo cũng không có áp là đúng rôi ...(vì bạn đã khai báo trong chế độ OVERRIDE).
Vì vậy việc thay đổi duty của bạn kô ăn thua gì là phải rồi ...
Còn về vấn đề duty , thì trong data sheet có công thức tính đó , ứng với tần số thạch anh Fosc/4 , và tần số pwm Fpwm , bạn sẽ có độ phân giải của duty la bao nhiêu bit ...
Và tương ứng với giá trị mà bạn nạp vào PTMR+2 bit LSB nữa == giá trị duty max .
Bạn xem lại kỷ nhé .
Chào bạn LeDuc,rất vui khi nhận được sự quan tâm của bạn về vấn đề mình gặp phải. nhưng như mình đã nói từ trước ,mình chưa quan tâm đến tần số và duty_cycle vội.Vì mình mún bít là tại sao khi thay đổi duty_cycle trong set_power_dutyX(duty_cycle) lại chẳng có tác dụng gì cả.điện áp chân ra ở các chân PWM lé(1,3,5,7) cũng ko thấy thay đổi jì.Mình có thử bỏ các dòng: set_power_pwm_override và chỉnh set_power_pwm_override(X,true,1) .nhưng cả 2 sự thay đổi trên đều ko có tác dụng.Điều đó chứng tỏ mình chưa sử dụng chế độ điều rộng xung PWm được.
Có bạn nào có code ccs mẫu về power pwm đã test chạy rồi.Cho mình xin với,để mình lấy vè test thử và so sánh với cde của mình xem nó sai ở chỗ nào.

daythienha2007
19-11-2008, 08:03 PM
thực ra 2 cái mà bạn và mình ghi là giống nhau đấy.thực ra phần prescale cũng nằm trong phần modes,mình ghi vậy để rõ hơn cho bạn thui!( các lệnh thiết lập trong phần mode được ngăn cách bằng dấu "|" mà luôn luôn phải khai báo prescale nên mình tách ra)! nhưng ko ngờ lại làm bạn khó nghĩ!! sorry nhé

còn cú pháp thì mình làm chạy bình thường mà!! với lại mình copy của bạn.chỉ đổi chỗ 2 số 0,1 thì làm sao mà code bạn chạy mà code mình báo lỗi!!!
sau khi dọc xong bài bạn post mình đã sửa lại 2 giá trị 0,1 lại(nghĩa lại hoán đổi vị trí cho nhau)mặc dù ccs ko báo lỗi nhưng vẫn ko giải quyết được vấn đề của mình.

cong1810
19-11-2008, 08:28 PM
nếu vậy thì có lẽ là lỗi phần cứng rồi!! bạn thử kiểm tra lại xem sao!! thạch anh,2 tụ bên cạnh thạch anh...vv
mình vừa xem lại thì ko thấy code ban đầu của bạn sai chỗ nào hết!! cũng ko cần đổi vị trí như mình nói ( cái này do mình nhớ ko đúng, khai báo như bạn chạy vẫn tốt)!!
mình có đề nghị thế này:
1) bạn kiểm tra lại phần cứng trước đã
2) bạn thử set duty cycle <320 nếu vẫn giữ nguyên period là 80;
3) kết hợp với việc xuất led để biết chương trình của mình đang ở đâu.để có thể nắm rõ hơn đoạn nào ko thực hiện
mình định post đoạn code nhỏ mình dùng 4431 ok.nhưng khi xem lại thì thấy ko có gì khác của bạn.chỉ là khác chu kì và chế độ làm việc thôi!!
chúc may mắn!!

daythienha2007
20-11-2008, 09:43 PM
nếu vậy thì có lẽ là lỗi phần cứng rồi!! bạn thử kiểm tra lại xem sao!! thạch anh,2 tụ bên cạnh thạch anh...vv
mình vừa xem lại thì ko thấy code ban đầu của bạn sai chỗ nào hết!! cũng ko cần đổi vị trí như mình nói ( cái này do mình nhớ ko đúng, khai báo như bạn chạy vẫn tốt)!!
mình có đề nghị thế này:
1) bạn kiểm tra lại phần cứng trước đã
2) bạn thử set duty cycle <320 nếu vẫn giữ nguyên period là 80;
3) kết hợp với việc xuất led để biết chương trình của mình đang ở đâu.để có thể nắm rõ hơn đoạn nào ko thực hiện
mình định post đoạn code nhỏ mình dùng 4431 ok.nhưng khi xem lại thì thấy ko có gì khác của bạn.chỉ là khác chu kì và chế độ làm việc thôi!!
chúc may mắn!!
cám ơn bạn Cong 1810 nhắc nhở,mình đã kiểm tra lại.Và thay con tụ 15pF bằng con ỵu 33pF,thì thấy nó chạy ok.Mình thấy khó hiểu là tại tụ 15pF và 33pF khác nhau chỗ nào vậy.Trong dataheet vẫn khuyến dùng con 15pF với thạch anh 20MHz mà.khó hiểu thật,có ai bít chỉ giúp mình với.Mình còn 1 vấn đề cân các bạn giúp là: mình muốn hạn dòng trên động cơ (ví dụ khoong cho dòng vượt quá 3A),thì có cách nào nhỉ(dùng phương pháp phần cứng hoặc phân mềm đều được).Mong nhận được được sự hướng dẫn của bạn Cong810 và các bạn.

cong1810
20-11-2008, 10:30 PM
về phần tụ thì chắc phải nhờ anh NAM thui!! chỉ vì do lúc trước học với 89C51 mình vô tình lấy nhầm 1 tụ 33 thành 330. mắc 2 con tụ khác nhau. thế là cả ngày đi toi!! mò mẫm mãi nên nhớ luôn!! hì hì!
việc hạn dòng thì dùng điện trở Shunt!! Nhưng mà nếu ra chợ mà bảo bán điện trở Shunt thì toàn nhận được lắc đầu!! lúc trước mình mất thời gian cho nó!! sau này mới biết nó có thể tự làm hoặc bạn dùng 1 điện trở công suất hay điện trở có 5 gạch (sai số nhỏ 1% "điều này mình được 1 anh chỉ") nối nối tiếp với động cơ.sau đó dùng 1 opamp để đo điện áp rơi trên điện trở này!!giá trị điện trở sẽ phụ thuộc vào dòng của bạn!! tại opamp thì bạn cho so sánh với giá trị điện thế tương ứng!! làm như vậy thì sẽ nhận được tín hiệu khi quá dòng!!
(có gì sai sót các huynh chỉ dạy thêm nhé!!!)

Mr.Bi
22-11-2008, 11:24 AM
về phần tụ thì chắc phải nhờ anh NAM thui!! chỉ vì do lúc trước học với 89C51 mình vô tình lấy nhầm 1 tụ 33 thành 330. mắc 2 con tụ khác nhau. thế là cả ngày đi toi!! mò mẫm mãi nên nhớ luôn!! hì hì!
việc hạn dòng thì dùng điện trở Shunt!! Nhưng mà nếu ra chợ mà bảo bán điện trở Shunt thì toàn nhận được lắc đầu!! lúc trước mình mất thời gian cho nó!! sau này mới biết nó có thể tự làm hoặc bạn dùng 1 điện trở công suất hay điện trở có 5 gạch (sai số nhỏ 1% "điều này mình được 1 anh chỉ") nối nối tiếp với động cơ.sau đó dùng 1 opamp để đo điện áp rơi trên điện trở này!!giá trị điện trở sẽ phụ thuộc vào dòng của bạn!! tại opamp thì bạn cho so sánh với giá trị điện thế tương ứng!! làm như vậy thì sẽ nhận được tín hiệu khi quá dòng!!
(có gì sai sót các huynh chỉ dạy thêm nhé!!!)

điện trở năm vạch hầu hết có công suất 1-2W là cao nhất . Ko bit mạch u làm để cảm biến dòng , lúc đó giới hạn dòng của u là bao nhiêu ?

cong1810
22-11-2008, 02:38 PM
ô!! đó là 1 thiếu sót của đệ!! việc lựa chọn điện trở còn phụ thuộc vào công suất của mạch.các loại điện trở thường,công suất,điện trở sứ có nhiều công suất để có thể lựa chọn!!
trong diễn đàn mình cũng có 1 chủ đề về cảm biến!! và cũng nói vể cái này rồi!! ko nên lạc đề ở đấy!!
@huynh Mr.bi: có gì thiếu sót huynh cứ góp ý và trình bày luôn ! đệ nghĩ ko cần phải hỏi lại như trên!!