|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
|
23-12-2010, 03:25 PM | #1 |
Đệ tử 4 túi
Tham gia ngày: Jun 2010
Bài gửi: 79
: |
Giúp pwm chan rc1 và rc2
E VIẾT CHƯƠNG TRÌNH NHƯ SAU:
NHƯNG KHÔNG BIẾT SA CHỔ NÀO MÀ 2 CHÂN CCP1 CCP2 LUON LUON CÓ XUNG. DONG CƠ LUÔN CHAY KHI CẤP NGUỒN, MONG MỌI NGƯỜI GIÚP ĐỠ #INCLUDE <18F4331.h> #INCLUDE <def_4331.h> #FUSES HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NOPUT #FUSES NOCPD,NODEBUG,NOFCMEN,NOCPB,STVREN,PWMPIN,HPOL_LOW #use delay(clock=20MHZ) #use fast_io(a) #use fast_io(d) #use fast_io(c) #use fast_io(e) #INCLUDE <SCANF.C> void main() { // DC7 - DC6(CCP1) - DC5(CCP1) - DC4(PWM7) -DC3(PWM1) - DC2(PWM3) - DC1(PWM5) // ///////////////////KICH ROLE CHIEU DC/////////////// trisc0=0; // role1 trisa1=0; // role2 trisa2=0; // role3 trisa3=0; // role4 trisa4=0; // role5 trisa5=0; // role6 trisb5=0; // role7 RC0=RA1=RA2=RA3=RA4=RA5=RB5=1; ////////////////// CHAN PWM DC/////////////////////////// TRISB4=0; // DC1 // PWM5 TRISB3=0; // DC2 // PWM3 TRISB1=0; // DC3 // PWM1 TRISD7=0; // DC4 // PWM7 TRISC1=0; // DC5 // CCP2 TRISC2=0; // DC6 // CCP1 TRISB2=0; // DC7 // BTHUONG_PWM2 ///////////////// // NUT AN DA KHAI BAO ROI/////////////////////////////////// TRISE0=0; TRISE1=0; TRISE2=0; TRISD0=1; // GIAI MA 1 TRISD1=1; // GIAI MA 2 /////////////////////////////////////////////////////////// //pwm power 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,4 99,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); // ccp setup_timer_2(T2_DIV_BY_4,124,1); SETUP_CCP1(CCP_PWM); SETUP_CCP2(CCP_PWM); SET_PWM2_DUTY(125); SET_PWM1_DUTY(125); WHILE(1) { scan(); if(!nut1) { SET_POWER_PWM0_DUTY(400); delay_ms(100); set_power_pwm0_duty(0); } else if(!nut2) { SET_POWER_PWM2_DUTY(400); delay_ms(100); set_power_pwm2_duty(0); } else if(!nut3) { SET_POWER_PWM4_DUTY(500); delay_ms(100); set_power_pwm4_duty(0); } else if(!nut5) { SET_POWER_PWM6_DUTY(300); delay_ms(100); set_power_pwm6_duty(0); } else if(!nut6) { SET_PWM1_DUTY(0); set_pwm2_duty(125); delay_ms(100); set_pwm1_duty(125); } else if(!nut11) { SET_PWM2_DUTY(60); set_pwm1_duty(125); delay_ms(100); set_pwm2_duty(125); } else if(!nut12) { rb2=0; delay_ms(100); rb2=1; } } } |
26-12-2010, 02:52 PM | #2 |
Đệ tử 4 túi
|
Không có cao thủ nào hết ah!Mình cũng đang bị như vậy!
__________________
My blog: http://autumnneverreturn.blogspot.com/ Đối thủ khó chiến thắng nhất là bản thân !!! |
26-12-2010, 03:37 PM | #3 |
Đệ tử 5 túi
Tham gia ngày: Jan 2009
Bài gửi: 100
: |
Chân CCP1 và CCP2 luôn có xung là đúng với tính chất PWM rồi còn gì ?
Có 3 trường hợp xảy ra khi điều xung : 1. Duty = 0 : mức logic luôn ở mức thấp 2. 0 < duty < 100% : Có xung vuông 3. duty > 100% : Mức logic luôn ở mức cao Có lẽ ý bạn là trường hợp thứ 3 ? Trường hợp này có thể do 1 trong những nguyên nhân sau (giả sử PIC hoạt động tốt) : 1. Module PWM không chạy ? 2. Tính toán giá trị duty không phù hợp ? Trường hợp của bạn có lẽ do nguyên nhân thứ 2 nhiều hơn, bạn xem lại cách tính duty cho phù hợp, đọc kĩ datasheet + help của CCS. Hoặc có thể kiểm tra nguyên nhân thứ 2 bằng cách gán giá trị duty với giá trị đọc về của ADC, như vậy trong dải ADC từ 0-> max, kiểu gì cũng có xung nếu module PWM hoạt động tốt. Thân ái ! |
04-01-2011, 11:43 AM | #4 |
Đệ tử 4 túi
Tham gia ngày: Jun 2010
Bài gửi: 79
: |
cái này tính toán xung sai thì không đúng rồi, vì mình viết đơn giản set_pwm2_duty(125) hoặc set_pwm2_duty(0) thì ok. nhưng mình đưa vào chương trình con rồi gọi nó ra thì có vấn đề.
VOID MOTO( INT16 TD_BT,INT16 TD_BP) { SET_PWM2_DUTY(125-TD_BT); SET_PWM1_DUTY(125-TD_BP); } mình dùng 2 chân này để điều khiển động cơ. sau khi có chương trình con mình gọi ra thì không ok. VOID RE_TRAI() { MOTO(0,100); } VOID RE_PHAI() { MOTO(125,0); } chỉ cần 1 chân có xung là 2 chân điều có xung. mình đang đau đầu đây. nhưng mình tìm ra cách này giải quyết thì lại ok VOID RE_TRAI() { //MOTO(0,100); SET_PWM2_DUTY(0); SET_PWM1_DUTY(100); } VOID RE_PHAI() { //MOTO(125,0); SET_PWM2_DUTY(125); SET_PWM1_DUTY(0); } mọi người vào giúp đở vấn đề này với |
21-03-2011, 12:54 PM | #5 |
Đệ tử 1 túi
Tham gia ngày: Mar 2011
Bài gửi: 21
: |
BẠN THỬ CODE NÀY NHA,
#include <16F877A.h> #FUSES HS #use delay(clock=8000000) INT16 J ; void main() { setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); setup_timer_2(T2_DIV_BY_16, 255,1) ; OUTPUT_C(0) ; WHILE(TRUE) { FOR(J = 0 ; J < 1024 ; J ++ ) { set_pwm1_duty(J); set_pwm2_duty(J); DELAY_MS(8) ; } } } |
|
|