PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 23-12-2010, 03:25 PM   #1
robotpic
Đệ 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;
}

}



}
robotpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-12-2010, 02:52 PM   #2
hcmut.khoamaisi
Đệ tử 4 túi
 
hcmut.khoamaisi's Avatar
 
Tham gia ngày: Dec 2009
Nơi Cư Ngụ: TPHCM
Bài gửi: 79
:
Send a message via Yahoo to hcmut.khoamaisi
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 !!!
hcmut.khoamaisi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-12-2010, 03:37 PM   #3
pk178
Đệ 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 !
pk178 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-01-2011, 11:43 AM   #4
robotpic
Đệ 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
robotpic vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-03-2011, 12:54 PM   #5
mini_2440
Đệ 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) ;
}
}
}
mini_2440 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 06:09 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam