|
26-04-2009, 02:57 PM | #1 |
Nhập môn đệ tử
Tham gia ngày: Jul 2008
Bài gửi: 4
: |
hỏi về pwm trong ccs
các bác ơi cho em hỏi e dùng pwm cho 2 động cơ với thiết lập như sau
SETUP_CCP1(CCP_PWM); //THIEP LAP CHE DO PWM SETUP_CCP2(CCP_PWM); //THIEP LAP CHE DO PWM SETUP_TIMER_2(T2_DIV_BY_4,255,1);//THIET LAP TIMER2 DUNG CHO PWM nhưng khi cài đặt SET_PWM2_DUTY(0); SET_PWM1_DUTY(0); thì động cơ lại quay nhanh hết mức .thế là sai phải không.tại sao thế nhỉ đây là đoạn ct của e Code:
#include <16f877.h> #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NODEBUG #DEVICE *=16,ADC=8 #USE DELAY(CLOCK=4000000) #USE FAST_IO(B) INT8 TIEN,LUI,AD0,AD1,AD2,AD3,QUAYTRAI,THEM, QUAYPHAI,RETRAI1,RETRAI2,REPHAI1,REPHAI2,LUIREPHAI1,LUIREPHAI2,LUIRETRAI1,LUIRETRAI2; INT8 TANG; VOID DUNG() { SETUP_CCP1(CCP_OFF); //TAT CHE DO PWM SETUP_CCP2(CCP_OFF); //TAT CHE DO PWM OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); } VOID MAIN() { TANG=0; THEM=0; SET_TRIS_B(11111111); //THIET LAP CAC CHAN RB0,1,2 LA CAC NGO VAO OUTPUT_HIGH(PIN_C1); //TAT 2 DONG CO OUTPUT_HIGH(PIN_C2); SETUP_ADC(ADC_CLOCK_INTERNAL); //THIET LAP CHE DO ADC VOI THOI GIAN LAY MAU BANG XUNG IC SETUP_ADC_PORTS(AN0_AN1_AN3); //THET LAP 3 NGO VAO ADC SETUP_CCP1(CCP_PWM); //THIEP LAP CHE DO PWM SETUP_CCP2(CCP_PWM); //THIEP LAP CHE DO PWM SETUP_TIMER_2(T2_DIV_BY_4,255,1);//THIET LAP TIMER2 DUNG CHO PWM WHILE (1) { IF (INPUT(PIN_B1)) DELAY_MS(50); //CO HAI NUT NHAN TANG GIAM MODE TOC DO ,5 DEN CHO 5 MODE ELSE { // DUNG(); //NEU NUT TANG DUOC NHAN DELAY_MS(100); IF (TANG<5) { TANG++; SWITCH(TANG) { CASE 1 : {OUTPUT_HIGH(PIN_D6); //CAC DEN CHON MODE SANG } BREAK; CASE 2 : {OUTPUT_HIGH(PIN_A5); } BREAK; CASE 3 : {OUTPUT_HIGH(PIN_E0); } BREAK; CASE 4 : {OUTPUT_HIGH(PIN_E1); } BREAK; CASE 5 : {OUTPUT_HIGH(PIN_E2); } BREAK; } } } IF (INPUT(PIN_B0)) DELAY_MS(50); //NEU NUT GIAM DUOC NHAN ELSE { DELAY_MS(100); IF (TANG>0) { SWITCH(TANG) { CASE 1 : {OUTPUT_LOW(PIN_D6); //CAC DEN MODE TAT } BREAK; CASE 2 : {OUTPUT_LOW(PIN_A5); } BREAK; CASE 3 : {OUTPUT_LOW(PIN_E0); }//DEN MODE SANG BREAK; CASE 4 : {OUTPUT_LOW(PIN_E1); // DUNG(); }//DEN MODE SANG BREAK; CASE 5 : {OUTPUT_LOW(PIN_E2); } BREAK; } TANG--; } } //CO 1 CAI JOYSITCK DIEU KHIEN XE,VOI 2 BIEN TRO,CO 2 DONG CO CHO HAI BANH SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC TU BIEN TRO 1 CUA JOYSTICK DELAY_US(10); AD0=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD1=READ_ADC(); IF ((AD0>=0)&&(AD0<=100)&&(AD1>100)&&(AD1<=145) ) // CHAY TOI { TIEN=(ABS(AD0-127)); //GIA TRI ADC KHI KEO JOYSTICK DE XE CHAY TOI OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE DOI CHIEU DONG CO OUTPUT_HIGH(PIN_D5); SET_PWM2_DUTY(TIEN); SET_PWM1_DUTY(TIEN); DELAY_MS(50); } IF ((AD0>100)&&(AD0<=145)&&(AD1>100)&&(AD1<=145)) //DUNG LAI { SET_PWM2_DUTY(0); SET_PWM1_DUTY(0); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); } IF ((AD0>145)&&(AD1>100)&&(AD1<=145)) //CHAY LUI { LUI=ABS(127-AD0); OUTPUT_LOW(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_LOW(PIN_D5); SET_PWM2_DUTY(LUI); SET_PWM1_DUTY(LUI); DELAY_MS(50); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD0>AD2)&&((AD2-127)<30)&&(ABS(AD3-AD1)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI CHAY LUI SAU DO DUNG LAI { SET_PWM2_DUTY(0); SET_PWM1_DUTY(0); DELAY_MS(2000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); } } IF ((AD0>100)&&(AD0<=145)&&(AD1>0)&&(AD1<=100)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //QUAY PHAI { QUAYPHAI=(ABS(AD1-127)); OUTPUT_LOW(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); SET_PWM2_DUTY(QUAYPHAI); SET_PWM1_DUTY(QUAYPHAI); DELAY_MS(50); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD3>AD1)&&(ABS(AD2-AD0)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI QUAY PHAI { SET_PWM2_DUTY(0); SET_PWM1_DUTY(0); DELAY_MS(1000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); } } IF ((AD0>100)&&(AD0<=145)&&(AD1>145)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //QUAY TRAI { QUAYTRAI=(ABS(127-AD1)); OUTPUT_HIGH(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_LOW(PIN_D5); SET_PWM2_DUTY(QUAYTRAI); SET_PWM1_DUTY(QUAYTRAI); DELAY_MS(50); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD3<AD1)&&(ABS(AD2-AD0)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI QUAY TRAI { SET_PWM2_DUTY(0); SET_PWM1_DUTY(0); DELAY_MS(1000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D5); } } IF ((100>AD0)&&(AD1<100)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHAY TOI RE PHAI { REPHAI1=(ABS(AD0-127)+ABS(AD1-127)); REPHAI2=ABS(ABS(AD0-127)-ABS(AD1-127)); SET_PWM2_DUTY(REPHAI1); SET_PWM1_DUTY(REPHAI2); } IF ((AD0<100)&&(AD1>145)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHAY TOI RE TRAI { RETRAI1=ABS(AD0-127)+AD1-127; RETRAI2=ABS(ABS(AD0-127)-(AD1-127)); SET_PWM2_DUTY(RETRAI1); SET_PWM1_DUTY(RETRAI2); } IF ((AD0>145)&&(AD1<100)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHAY LUI RE PHAI { LUIREPHAI1=(AD0-127+ABS(AD1-127)); LUIREPHAI2=ABS(AD0-127-ABS(AD3-117)); SET_PWM2_DUTY(LUIREPHAI1); SET_PWM1_DUTY(LUIREPHAI2); } IF ((AD0>145)&&(AD1>145)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHAY LUI RE TRAI { LUIRETRAI2=(AD0-127+AD3-127); LUIRETRAI1=ABS(AD0-127-(AD3-127)); SET_PWM2_DUTY(LUIRETRAI2); SET_PWM1_DUTY(LUIRETRAI1); } } } thay đổi nội dung bởi: namqn, 26-04-2009 lúc 03:59 PM. Lý do: định dạng code |
26-04-2009, 04:01 PM | #2 |
Trưởng lão PIC bang
|
Bạn nên cho biết sơ đồ mạch thử nghiệm, code chỉ có ý nghĩa khi đi kèm với một mạch phần cứng cụ thể. Bạn cũng không nên dùng toàn chữ hoa trong chương trình, sẽ rất khó đọ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 |
27-04-2009, 04:21 AM | #3 |
Đệ tử 1 túi
Tham gia ngày: Dec 2005
Bài gửi: 20
: |
sai o hai dong nay nay
Code:
VOID MAIN() { TANG=0; THEM=0; SET_TRIS_B(11111111); OUTPUT_HIGH(PIN_C1); //=========== sai o day OUTPUT_HIGH(PIN_C2); SETUP_ADC(ADC_CLOCK_INTERNAL); SETUP_ADC_PORTS(AN0_AN1_AN3); SETUP_CCP2(CCP_PWM); SETUP_TIMER_2(T2_DIV_BY_4,255,1; } nen viet lai la >>>> cung luu y luon co de ban dinh viet cho xe di theo vach ,cac chan lien quan toi thang dieu khien dong co phai set ca ve muc khong ======0 .VA CO DE CUA BAN KHONG KHA THI ,VD bien tang giam cua ban khong tac dung ji ngoai bat may cai led , toc do toi da ban dat duoc cung chi nam o khoang 25% 'ly do thi tu tim hieu. Code:
output_low(pin_c1); output_low(pin_c2); >>>>>> xin loi vi khong co uni dd khong go duoc vn .>>> minh se chuyen lai vn thay đổi nội dung bởi: vietanh, 27-04-2009 lúc 04:31 AM. |
11-05-2009, 07:41 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: Jul 2008
Bài gửi: 4
: |
cam on cac bac nhat la bac namqn .day la cai mach cua e.nho bac xem giup voi.cam on nhieu
|
11-05-2009, 07:48 PM | #5 |
Nhập môn đệ tử
Tham gia ngày: Jul 2008
Bài gửi: 4
: |
a quen.e up lai doan code cho phu hop voi cai mach
#include <16f877.h> #fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NODEBUG #DEVICE *=16,ADC=8 #USE DELAY(CLOCK=4000000) #USE FAST_IO(B) #use fast_io(c) INT8 TIEN,LUI,AD0,AD1,AD2,AD3,QUAYTRAI,them, QUAYPHAI,RETRAI1,RETRAI2,REPHAI1,REPHAI2,LUIREPHAI 1,LUIREPHAI2,LUIRETRAI1,LUIRETRAI2; INT8 TANG; VOID MAIN() { TANG=0; them=255; SET_TRIS_B(11111111); //THIET LAP CAC CHAN RB0,1,2 LA CAC NGO VAO set_tris_c(00101001); //thiet lap cac chan rc0,3,5 la cac ngo vao OUTPUT_HIGH(PIN_C1); //TAT 2 DONG CO OUTPUT_HIGH(PIN_C2); SETUP_ADC(ADC_CLOCK_INTERNAL); //THIET LAP CHE DO ADC VOI THOI GIAN LAY MAU BANG XUNG IC SETUP_ADC_PORTS(AN0_AN1_AN3); //THET LAP 3 NGO VAO ADC SETUP_CCP1(CCP_PWM); //THIEP LAP CHE DO PWM SETUP_CCP2(CCP_PWM); //THIEP LAP CHE DO PWM sETUP_TIMER_2(T2_DIV_BY_4,255,1);//THIET LAP TIMER2 DUNG CHO PWM output_high(pin_c6); WHILE (1) { IF (!INPUT(PIN_B1)) //CO HAI NUT NHAN TANG GIAM MODE TOC DO ,5 DEN CHO 5 MODE { //NEU NUT TANG DUOC NHAN DELAY_MS(250); IF (TANG<5) { TANG++; SWITCH(TANG) { CASE 1 : {OUTPUT_HIGH(PIN_D6);them=180; //CAC DEN CHON MODE SANG } BREAK; CASE 2 : {OUTPUT_HIGH(PIN_A5);them=150; } BREAK; CASE 3 : {OUTPUT_HIGH(PIN_E0);them=100; } BREAK; CASE 4 : {OUTPUT_HIGH(PIN_E1);them=50; } BREAK; CASE 5 : {OUTPUT_HIGH(PIN_E2);them=0; } BREAK; } } } IF (!INPUT(PIN_B0)) //NEU NUT GIAM DUOC NHAN { DELAY_MS(250); IF (TANG>0) { SWITCH(TANG) { CASE 1 : {OUTPUT_LOW(PIN_D6);them=255; //CAC DEN MODE TAT } BREAK; CASE 2 : {OUTPUT_LOW(PIN_A5);them=180; } BREAK; CASE 3 : {OUTPUT_LOW(PIN_E0);them=150; } BREAK; CASE 4 : {OUTPUT_LOW(PIN_E1);them=100; } BREAK; CASE 5 : {OUTPUT_LOW(PIN_E2);them=50; } BREAK; } TANG--; } } //CO 1 CAI JOYSITCK DIEU KHIEN XE,VOI 2 BIEN TRO,CO 2 DONG CO CHO HAI BANH SET_ADC_CHANNEL(0); //CHON KENH AN1 DE DOC GIA TRI ADC TU BIEN TRO 1 CUA JOYSTICK DELAY_US(10); AD0=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(1); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD1=READ_ADC(); IF ((AD0>=0)&&(AD0<=100)&&(AD1>100)&&(AD1<=145) ) // CHAY lui { TIEN=(ABS(AD0-127)); //GIA TRI ADC KHI KEO JOYSTICK DE XE CHAY TOI OUTPUT_low(pin_D3); //TAT CHAN ROLE DOI CHIEU DONG CO OUTPUT_low(PIN_D7); if ((them<=100)&&(tien<90)) { SET_PWM2_DUTY(180); SET_PWM1_DUTY(180); } if ((them<=100)&&(tien>=90)) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } if (them>100) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } DELAY_MS(50); } IF ((AD0>100)&&(AD0<=145)&&(AD1>100)&&(AD1<=145)) //DUNG LAI { SET_PWM2_DUTY(255); SET_PWM1_DUTY(255); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D7); } IF ((AD0>145)&&(AD1>100)&&(AD1<=145)) //CHAY toi { LUI=ABS(127-AD0); OUTPUT_high(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_high(PIN_D7); if ((them<=100)&&(lui<90)) { SET_PWM2_DUTY(180); SET_PWM1_DUTY(180); } if ((them<=100)&&(lui>=90)) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } if (them>100) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } DELAY_MS(200); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD0>AD2)&&((AD2-127)<30)&&(ABS(AD3-AD1)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI CHAY LUI SAU DO DUNG LAI { SET_PWM2_DUTY(255); SET_PWM1_DUTY(255); DELAY_MS(2000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D7); } } IF ((AD0>100)&&(AD0<=145)&&(AD1>0)&&(AD1<=100)&&INPUT (PIN_B1)&&INPUT(PIN_B0)) //QUAY PHAI { QUAYPHAI=(ABS(AD1-127)); OUTPUT_LOW(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D7); if ((them<=100)&&(tien<90)) { SET_PWM2_DUTY(200); SET_PWM1_DUTY(200); } if ((them<=100)&&(tien>=90)) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } if (them>100) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } DELAY_MS(200); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD3>AD1)&&(ABS(AD2-AD0)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI QUAY PHAI { SET_PWM2_DUTY(255); SET_PWM1_DUTY(255); DELAY_MS(1000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D7); } } IF ((AD0>100)&&(AD0<=145)&&(AD1>145)&&INPUT(PIN_B1)&& INPUT(PIN_B0)) //QUAY TRAI { QUAYTRAI=(ABS(127-AD1)); OUTPUT_HIGH(PIN_D3); //SET CHAN ROLE CHIEU DONG CO OUTPUT_LOW(PIN_D7); if ((them<=100)&&(quaytrai<90)) { SET_PWM2_DUTY(200); SET_PWM1_DUTY(200); } if ((them<=100)&&(quaytrai>=90)) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } if (them>100) {SET_PWM2_DUTY(them); SET_PWM1_DUTY(them); } DELAY_MS(200); SET_ADC_CHANNEL(1); //CHON KENH AN1 DE DOC GIA TRI ADC DELAY_US(10); AD2=READ_ADC(); //DOC GIA TRI ADC SET_ADC_CHANNEL(0); //CHON KENH AN0 DE DOC GIA TRI ADC DELAY_US(10); AD3=READ_ADC(); IF ((AD3<AD1)&&(ABS(AD2-AD0)<50)&&INPUT(PIN_B1)&&INPUT(PIN_B0)) //CHONG BI GIAT KHI QUAY TRAI { SET_PWM2_DUTY(255); SET_PWM1_DUTY(255); DELAY_MS(1000); OUTPUT_HIGH(PIN_D3); //TAT CHAN ROLE CHIEU DONG CO OUTPUT_HIGH(PIN_D7); } } IF ((100>AD0)&&(AD1<100)&&INPUT(PIN_B1)&&INPUT(PIN_B0 )) //CHAY lui RE PHAI { REPHAI1=(them+ABS(AD1-127)); REPHAI2=ABS(them-ABS(AD1-127)); SET_PWM2_DUTY(REPHAI1); SET_PWM1_DUTY(REPHAI2); } IF ((AD0<100)&&(AD1>145)&&INPUT(PIN_B1)&&INPUT(PIN_B0 )) //CHAY lui RE TRAI { RETRAI1=them+AD1-127; RETRAI2=ABS(them-(AD1-127)); SET_PWM2_DUTY(RETRAI1); SET_PWM1_DUTY(RETRAI2); } IF ((AD0>145)&&(AD1<100)&&INPUT(PIN_B1)&&INPUT(PIN_B0 )) //CHAY toi RE PHAI { LUIREPHAI1=(them+ABS(AD1-127)); LUIREPHAI2=ABS(them-ABS(AD1-117)); SET_PWM2_DUTY(LUIREPHAI1); SET_PWM1_DUTY(LUIREPHAI2); } IF ((AD0>145)&&(AD1>145)&&INPUT(PIN_B1)&&INPUT(PIN_B0 )) //CHAY LUI RE TRAI { LUIRETRAI2=(them+AD1-127); LUIRETRAI1=ABS(them-(AD1-127)); SET_PWM2_DUTY(LUIRETRAI2); SET_PWM1_DUTY(LUIRETRAI1); } } } thay đổi nội dung bởi: motngayno10, 11-05-2009 lúc 07:57 PM. |
|
|