motngayno10
26-04-2009, 02:57 PM
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
#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,LUIREPHAI 1,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);
}
}
}
các bác xem giúp e chút.
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
#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,LUIREPHAI 1,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);
}
}
}
các bác xem giúp e chút.