PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Giúp pwm chan rc1 và rc2 (http://www.picvietnam.com/forum/showthread.php?t=7593)

robotpic 23-12-2010 03:25 PM

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;
}

}



}

hcmut.khoamaisi 26-12-2010 02:52 PM

Không có cao thủ nào hết ah!Mình cũng đang bị như vậy!

pk178 26-12-2010 03:37 PM

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 !

robotpic 04-01-2011 11:43 AM

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

mini_2440 21-03-2011 12:54 PM

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) ;
}
}
}


Múi giờ GMT. Hiện tại là 02:02 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