You are on page 1of 32

code mu cho 8051 - o nhit , hin th LCD, truyn d liu qua RS232

c ng bi NetVNTh by, ngy 25 thng hai nm 20120 nhn xt


Chng trnh thc hin kt hp o nhit , hin th ln LCD, v truyn d liu
ln my tnh qua giao tip RS232.
M phng trn ISIS - Proteus:

m phng trn ISIS - Proteus


M ngun C:

#include<at89x51.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
//========================= #DEFINE LCD
#define RS P3_5
#define RW P3_6//RW=0 => ghi
#define EN P3_7//RW=1 => doc
//RS=0 => code
//RS=1 => data
#define LCD_PORT P1
//========================= #DEFINE ADC
#define INTR P3_2
#define RD P3_3
#define WR P3_4
//========================================================
====== DELAY
void delay_ms(int n)
{
int k,j;
for(k=0;k<n;k++)
{
for(j=0;j<500;j++);

}
}
//==========================
void delay_5ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<4;j++){}
}
//===========================
void delay_15ms()
{
int i,j;
for(i=0;i<250;i++)
for(j=0;j<100;j++){}
}
//========================================================
====== LCD
//============================== GUI LENH CHO LCD
void LCD_CODE(unsigned char c)
{
RS=0;//code
RW=0;//ghi
LCD_PORT=c;
EN=1;
EN=0;
delay_5ms();
}
//=============================== KHOI TAO LCD
void LCD_INIT()
{
delay_15ms();
LCD_CODE(0x38); //che do 8bit,2 hang,kieu ky tu 5x8 diem anh.
LCD_CODE(0x0C); //hien thi man hinh,c con tro, con tro nhp' nhy.
LCD_CODE(0x01); // Xoa man hinh LCD
}
//============================== IN KY TU
void LCD_DATA(unsigned char c)
{
RS=1;//data
RW=0;//ghi
LCD_PORT=c;

EN=1;
EN=0;
delay_5ms();
}
//=============================== IN CHUOI KY TU
void LCD_STRING(unsigned char *s)
{
while(*s) //den NULL thi thoi
{
LCD_DATA(*s);
s++;
}
}
//========================================================
====== KHOI TAO RS232
void SetupSerial()
{
TMOD=0x20; /* timer 1 che do 2: 8-Bit tu dong nap lai.
*/
TH1=0xFD; /* toc do 9600 baud
*/
TL1=0xFD;
SCON=0x52; /* Che do 1: 8-bit UART, cho phep truyen */
TR1=1;
/* timer 1 run
*/
TI=0;
/* co ngat nha^n.=0*/
RI=0;
/* co ngat' truye^n =0*/
ES=1;
/* cho phep ngat noi tiep */
}
//========================================================
====== HIEN THI GIA TRI ADC LEN LCD
void HIENTHI_ADC(unsigned char t)
{
unsigned char v;
if(t<10)
LCD_DATA(t+48);
else
if(t<100)
{
LCD_DATA(t/10+48);
LCD_DATA(t%10+48);
}
else
{
v=t/10;
LCD_DATA(v/10+48);

LCD_DATA(v%10+48);
LCD_DATA(t%10+48);
}
}
//========================================================
====== HAM GUI SO LIEU LEN VB
void send(unsigned char a)
{
if(a<10)
{
SBUF=a+48;
while(TI==0){}
TI=0;
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
SBUF=c+48;
while(TI==0){}
TI=0;
SBUF=d+48;
while(TI==0){}
TI=0;
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
SBUF=t+48;
while(TI==0){}
TI=0;
SBUF=c+48;
while(TI==0){}
TI=0;
SBUF=d+48;
while(TI==0){}
TI=0;
}
}
//========================================================
====== NGAT NOI TIEP

void RS232(void) interrupt 4


{
unsigned char *c,count=0;
while(RI==0){}
RI=0;
*c=SBUF;
if(count==1&&*c=='1') *c='3';
if(count==1&&*c=='2') *c='4';
switch(*c)
{
case '0': //xoa man hinh LCD
{
LCD_CODE(0x01);
}
break;
//o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)
case '-': //lui con tro hien thi LCD 1 don vi.
{
LCD_CODE(0x10);
}
break;
case '1': //truyen len may tinh: gia tri do duoc.
{
send(P2);
}
break;
case '2': //truyen len may tinh: gia tri do duoc.
{
send(P2);
}
break;
case '9': //thoat khoi ham ngat, cho ADC lm viec.
{
TI=0; //cho phep thoat khoi ham ngat.
count=0; //ket thuc viec truyen ky tu len LCD
}
break;
default : //truyen ky tu xuong LCD ^^.

{
if(TI==0)
LCD_CODE(0x01);
LCD_DATA(*c);
TI=1; //de cho chuong trinh ko thoat khoi ham ngat,phuc vu viec
truyen ky tu len LCD.
count=1; //danh dau bat dau viec truyen ky tu len LCD
}
}
}
//========================================================
====== MAIN
void main()
{
SetupSerial(); //Khoi tao cac thong so cho truyen thong noi tiep
LCD_INIT();
//LCD_CODE(0x80);//hien thi 2 hang : dia chi hien thi + 80
EA = 1;
//Cho phep ngat nhung chi? c ngat noi tiep duoc dung trong
code nay
while(1)
{
//if(P0_3==1)
{
P0_0=P0_1=P0_2=0;
WR=0;
//Bat dau chuyen doi gia tri tu ADC
delay_ms(10);
//Tao tre de cap nhat du lieu tu ADC
WR=1;
//Ket thuc chuyen doi
RD=0;
//Chot du lieu da duoc chuyen doi: P2
LCD_CODE(0x01);
LCD_putstr("Nhiet do:");
HIENTHI_ADC(P2);
LCD_STRING(" oC");
delay_ms(300);
}
}
}

Code mu cho PIC - Kt hp: ADC o nhit , in p, hin th LCD v


giao tip vi my tnh
c ng bi NetVNTh su, ngy 24 thng hai nm 20120 nhn xt
Chng trnh thc hin o nhit , in p, hin th kt qu ln mn hnh LCD
16x2,
v
truyn
gi
tr
ln
my
tnh.
M phng trn Proteus:

m phng trn Proteus


M ngun:
#include <16f877a.h>
#include <def_877a.h>
#device *=16 ADC=10
#use delay(clock=20000000)
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG,
NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <lcd_lib_4bit.c>
//========================================================
===============
void send(int8 a);
void HIENTHI_LCD(int8 t);
void HIENTHI_LCD_float(int8 t);
int8 count=0;
int8 i,value,vl[10];
//========================================================
===============
#INT_RDA //ngat khi nhan du lieu.
Receive_isr()
{
char c;

c=getc();
switch(c)
{
case '0': //xoa man hinh LCD
{
LCD_putcmd(0x01);
}
break;
//o day co the su dung ma thap phan! (ngoai tru cac ky tu dieu khien)
case '-': //lui con tro hien thi LCD 1 don vi.
{
LCD_putcmd(0x10);
}
break;
case '1': //truyen len may tinh: gia tri do duoc.
{
Set_ADC_channel(0); //kenh 0 chan so2
delay_us(10);
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/20.4
8;
send(value);
}
break;
case '2': //truyen len may tinh: gia tri do duoc.
{
Set_ADC_channel(1); //kenh 1 chan so3
delay_us(10);
if(read_adc()==0)
{
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/
10;
}
else

{
value=read_adc()+6;
for(i=0;i<10;i++)
{
vl[i]=read_adc()+6;
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/
10;
}
send(value);
}
break;
case '9': //thoat khoi ham ngat, cho ADC lm viec.
{
count=0; //ket thuc viec truyen ky tu len LCD
LCD_putcmd(0x01);
}
break;
default : //truyen ky tu xuong LCD ^^.
{
count++;
if(count==1) LCD_putcmd(0x01);
if(count==16) LCD_putcmd(0xC0);
if(count==32)
{
LCD_putcmd(0x01);
count=0;
}
LCD_putchar(c);
}
}
}
//========================================================
===============
void main()
{
//trisD=0x0C; //D0,D1 LA CONG VAO, D2-D7 LA CONG RA.
enable_interrupts(int_rda); //cho phep ngat noi tiep nhan.
enable_interrupts(GLOBAL);

LCD_init(); //Khoi tao LCD.


LCD_putcmd(0xC0);
Printf(LCD_putchar,"Khoi tao...");
delay_ms(250);
setup_adc_ports(AN0_AN1_AN3); //Khoi tao che do cho bo ADC.
setup_adc(ADC_CLOCK_INTERNAL);
delay_us(10);
while(1)
{
//do nhiet do
{
Set_ADC_channel(0); //kenh 0 chan so2
delay_us(10);
value=read_adc();
value=value/2.048;
LCD_putcmd(0x80);
LCD_putchar("Nhiet do: ");
LCD_putcmd(0x89);
HIENTHI_LCD(value);
LCD_putcmd(0x8C);
LCD_putchar("oC");
delay_ms(0.1);
}
//do diep ap
{
Set_ADC_channel(1); //kenh 1 chan so3
delay_us(10);
if(read_adc()==0)
{
for(i=0;i<10;i++)
{
vl[i]=read_adc();
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/
10;
}
else
{
value=read_adc()+6;

for(i=0;i<10;i++)
{
vl[i]=read_adc()+6;
delay_us(10);
}
value=(vl[0]+vl[1]+vl[2]+vl[3]+vl[4]+vl[5]+vl[6]+vl[7]+vl[8]+vl[9])/
10;
}
LCD_PutCmd(0xC0);
LCD_putchar("DIEN AP : ");
LCD_putcmd(0xC9);
//HIENTHI_LCD(value);
HIENTHI_LCD_float(value);
LCD_putcmd(0xCD);
LCD_putchar("V ");
}
}
}
//========================================================
===============
void HIENTHI_LCD(int8 t)
{
unsigned char v;
if(t<10)
LCD_putchar(t+48);
else
if(t<100)
{
LCD_putchar(t/10+48);
LCD_putchar(t%10+48);
}
else
{
v=t/10;
LCD_putchar(v/10+48);
LCD_putchar(v%10+48);
LCD_putchar(t%10+48);
}
}
void send(int8 a)
{
if(a<10)

{
putc(a+48);
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
putc(c+48);
putc(d+48);
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
putc(t+48);
putc(c+48);
putc(d+48);
}
}
void HIENTHI_LCD_float(int8 t)
{
int8 v;
if(t<10)
{
LCD_putchar(48);
LCD_putchar(46);
LCD_putchar(t+48);
LCD_putchar(32);
}
else
if(t<100)
{
LCD_putchar(t/10+48);
LCD_putchar(46);
LCD_putchar(t%10+48);
LCD_putchar(32);
}
else
{
v=t/10;
LCD_putchar(v/10+48);
LCD_putchar(v%10+48);

LCD_putchar(46);
LCD_putchar(t%10+48);
}
}
/*
void send_float(float a)
{
if(a<10)
{
putc(a+48);
}
if(a>9&&a<100)
{
unsigned char c=a/10;
unsigned char d=a%10;
putc(c+48);
putc(d+48);
}
if(a>99)
{
unsigned char t=a/100;
unsigned char c=a/10-10*t;
unsigned char d=a%10;
putc(t+48);
putc(c+48);
putc(d+48);
}
}*/
//========================================================
===============

Lp Trnh RoBot T ng n Gin Vi VK PIC16F877A


c ng bi NetVNTh hai, ngy 27 thng hai nm 20120 nhn xt
Tm tt
Ti liu hng dn lp trnh cho robot t ng d ng theo vch trng v iu
khin cc c cu (nng h, gp nh qu) mt cch c bn nht.Vi iu khin
c s dng trong ti liu l PIC16F877A ca Microchip.Lp trnh bng ngn
ng C vi trnh bin dch CCS.
1 TM TT V THIT K ROBOT T NG
Robot t ng trong cc cuc thi Robocon gm 3 thnh phn chnh: C
kh, Mch in t, Lp trnh.
1.1 C kh
Mt robot n gin gm 2 ng c truyn ng cho 2 bnh xe bn tri v
bn phi gip robot di chuyn. Pha trc c th l 1 hoc 2 bnh t do (bnh
t la, omni, mt tru,). thc hin c cc cng vic nh nng h
trc, gp nh y qu, robot c trang b thm cc ng c khc truyn
ng cho cc c cu ny.
Tt c cc b phn trn c b tr trn mt khung bng nhm, st,
Phn hng dn chi tit v thit k c kh s c trnh by trong mt ti liu
khc. Ti liu ny ch tp trung vo phn lp trnh.

M hnh robot d dng n gin


1.2 Mch in t

S hot ng ca robot t ng
1.2.1 Mch ng vo (cm bin, nt n, cng tc hnh trnh)
Vi robot n gin, ng vo thng l mc logic ly t cm bin quang (quang
tr, quang diode), nt n hoc cng tc hnh trnh. T mch vi iu khin x
l cc tn hiu ny xut ng ra (thng l ng c DC) choph hp.
Cm bin quang phi c che chn cn thn hn ch nh hng t
ccngun nh sng bn ngoi.

Mch cm bin, nt n v cng tc hnh trnh


1.2.2 Mch vi iu khin
Mch s dng vi iu khin PIC16F877A ca Microchip. Mch nhn tn hiu t
ng vo, x l v xut ng ra qua mt mch cch ly bng opto ra mch cng
sut.

Mch vi iu khin
1.2.3 Mch cng sut iu khin ng c DC
Mt s mch thng dng:

Mch cng sut s dng 1 FET v 1 relay

Mch cu H iu khin ng c vi Half Bridge Driver IR2184


1.3 Lp trnh
y l phn chnh ca ti liu ny. Ngn ng lp trnh c s dng l C,
vi trnh bin dch CCS cho vi iu khin PIC ca Microchip.
Kin thc ban u: Lp trnh C cn bn
Cc ti liu tham kho:
Ti liu CCS ting Vit.
y l cc ti liu cn c qua trc khi vo lp trnh cho PIC c th bit
cc hm nhn tn hiu ng vo, xut tn hiu ng ra, ngt, timer, counter,
PWM,
Cc hm quan trng s c nhc li phn 2.
2 LP TRNH CHO ROBOT T NG D NG N GIN
Chng trnh gip robot chy theo vch trng trn nn mu sm.
2.1 Phn cng
8 cm bin quang d ng
Mch cng sut iu khin 2 ng c
Mch vi iu khin:
o PORTD: ni vi tn hiu ra ca 8 cm bin
o ng c tri:
Chn C0: iu khin chiu (DIR_LEFT)
Chn C1: iu khin cho php chy (EN_LEFT)
o ng c phi:
Chn C3: iu khin chiu (DIR_RIGHT)
Chn C2: iu khin cho php chy (EN_RIGHT)
(Cc ng vo v ng ra c th ni vi bt c PORT v chn no ca vi iu
khin)
2.2 Nguyn tc iu khin
2.2.1 iu khin ng c

Tng t i vi cc ng c iu khin cc c cu.

2.2.2 Hng di chuyn ca robot

2.2.3 X l tn hiu cm bin (xem hnh v)


Mc ch ca vic d ng l hng cho robot i theo 1 vch thng mu
trng trn mt nn mu m (en, xanh,)
Cm bin c t gia robot.
o Khi cm bin s 3,4 nm trn vch trng (mc 1): robot chy thng
o Khi robot lch sang tri: quay phi iu chnh robot v ng vch
o Khi robot lch sang phi: quay tri iu chnh robot v ng vch

Cc mc lch ra khi vch trng ca robot


2.3 Chng trnh iu khin

#include <16f877A.h>
#include <def_877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
/* NH NGHA CC CHN V PORT */
#define DIR_LEFT RC0
#define EN_LEFT
RC1
#define DIR_RIGHT RC3
#define EN_RIGHT RC2
#define SENSOR PORTD
/* KHAI BO CC CHNG TRNH CON */
void motor_left_forward();
void motor_left_reverse();
void motor_left_stop();
void motor_right_forward();
void motor_right_reverse();
void motor_right_stop();
void forward();
void reverse();
void stop();
void turn_left();
void turn_right();
/* CC CHNG TRNH CON */
// ng c tri chy thun
void motor_left_forward()
{
DIR_LEFT=1; // chiu thun
EN_LEFT=1; // cho php chy
}
// ng c tri chy ngc
void motor_left_reverse()
{
DIR_LEFT=0; // chiu ngc
EN_LEFT=1; // cho php chy
}
// ng c tri dng
void motor_left_stop()
{
EN_LEFT=0; // khng cho php chy
}
// ng c phi chy thun

void motor_right_forward()
{
DIR_RIGHT=1;// chiu thun
EN_RIGHT=1; // cho php chy
}
// ng c phi chy ngc
void motor_right_reverse()
{
DIR_RIGHT=0;// chiu ngc
EN_RIGHT=1; // cho php chy
}
// ng c phi dng
void motor_right_stop()
{
EN_RIGHT=0; // khng cho php chy
}
// Chy thng
void forward()
{
motor_left_forward();
motor_right_forward();
}
// Chy li
void reverse()
{
motor_left_reverse();
motor_right_reverse();
}
// Dng
void stop()
{
motor_left_stop();
motor_right_stop();
}
// Quay tri
void turn_left()
{
motor_left_forward();
motor_right_reverse(); // hoc motor_right_stop();
}
// Quay phi
void turn_right()
{

motor_left_reverse(); // hoc motor_left_stop();


motor_right_forward();
}
/* CHNG TRNH CHNH */
void main ()
{
TRISC=0x00; // PORTC l ng ra ( ng c)
TRISD=0x00; // PORTD l ng vo (cm bin quang)
PORTC=0x00; // Khi to gi tr ban u 0x00 cho PORTC
while(1)
{
switch (SENSOR)
{
case 0b00011000: forward(); break;
case 0b00001100: turn_left(); break;
case 0b00000110: turn_left(); break;
case 0b00000011: turn_left(); break;
case 0b00000001: turn_left(); break;
case 0b00110000: turn_right(); break;
case 0b01100000: turn_right(); break;
case 0b11000000: turn_right(); break;
case 0b10000000: turn_right(); break;
}
}
}
3 CI TIN CHNG TRNH D NG
3.1 iu khin tc ng c vi cc trng thi lch khi vch trng
3.1.1 Nguyn l
i vi chng trnh d ng n gin, khi robot lch tri hoc lch
phi, robot s quay phi hoc quay tri iu chnh cho d lch t hay lch
nhiu. Nh vy, trong qu trnh di chuyn, robot s lc lin tc v phi quay tri,
quay phi lin tc. Do , vi cc mc lch ra khi vch trng khc nhau, ta
iu chnh tc 2 bnh tri, phi cho ph hp qu trnh di chuyn theo
vch ca robot c nhuyn v mt hn.
Bng gi tr tham kho tc ng c tri v ng c phi tng ng vi
cc trng thi lch khi vch trng ca robot:

3.1.2 iu khin tc ng c DC bng phng php PWM


i vi iu khin tc ng c DC trong robot, phng php c s
dng ph bin nht l iu ch rng xung (Pulse Width Modulation) hay
c gi tt l iu xung, bm xung hoc PWM.
Nguyn l ca phng php ny l bt tt nhanh ngun in cp vo ng
c to ra mt tn hiu xung. Khi vic bt tt tn s ln (thng s dng
t 1kHz n 20kHz), ng c s chy vi 1 tc n nh nh moment quay.
Thi gian cp ngun cho ng c l T-on, thi gian tt ngun ng c l Toff. Vic thay i thi gian T-on v T-off lm thay i in p hiu dng cp
cho ng c. i vi ng c DC, tc ng c tng i t l thun vi in
p cp cho ng c. V vy, bng cch thay i rng ca xung, ta thay
i c tc ca ng c DC.
i lng biu din mi quan h gia T-on v T-off c gi l duty cycle:
duty_cycle = Ton / ( Ton + Toff )
V d: Ta cp ngun ng c trong 0.8ms, sau tt 0.2ms.
Nh vy: T-on = 0.8ms; T-off = 1ms. Tn s PWM l:
f = 1 / ( Ton + Toff ) = 1 / ( 0.8ms + 0.2ms ) = 1/1ms = 1KHz
duty_cycle = Ton / ( Ton + Toff ) = 0.8 / ( 0.8 + 0.2 ) = 0.8 = 80%
V tc ng c DC t l vi duty cycle nn tc ng c t tng ng
80% tc ti a.

Tnh ton duty cycle iu khin tc ng c DC


3.1.3 iu xung PWM dng vi iu khin
iu xung PWM bng phn mm:

iu xung PWM mt cch n gin l a 1 chn no ca vi iu khin ln


mc 1, sau a xung mc 0. Cng vic ny c lp i lp li lin tc s
to ra xung, v tc ca ng c s tng ng vi duty cycle.
V d: iu xung trn chn A0 :
Code
RA0=1;
Delay_ms(Ton);
RA0=0;
Delay_ms(Toff);
Tuy nhin, nu thc hin bng cch ny th vi iu khin s lun dnh thi gian
cho vic iu xung PWM. Do , cc cng vic khc nh nhn tn hiu t cm
bin, iu khin cc c cu s b nh hng.
iu xung PWM bng phn cng
gii quyt vn vic iu xung PWM bng phn mm chim phn ln thi
gian hot ng ca vi iu khin, PIC16F877A c h tr 2 knh iu xung bng
phn cng 2 chn C1 (CCP2) v C2(CCP1) s dng TIMER2. Ngha l, khi
ta khai bo iu xung PWM mt tn s v duty cycle no th vi iu khin
s thc hin cng vic xut xung mt cch lin tc v t ng cho n khi ta
thay i cc gi tr khai bo. Khi , ta c th lm cc cng vic khc mt
cch d dng m khng phi mt thi gian cho vic duy tr xung PWM.
Cc hm h tr vic iu xung bng phn cng ca CCS:
Ghi ch: Ch cp n cc i s ca cc hm c phc v cho vic
iu xung PWM.
o setup_timer_2 (mode, period, postscale)
mode: T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
period: 0-255
postscale: 1
Tn s iu xung PWM:
f = fosc / [ 4*mode*(period+1) ]
o setup_ccp1(mode) v setup_ccp2(mode)
mode:
CCP_PWM: chn ch PWM.
CCP_OFF: tt ch PWM.
o set_pwm1_duty(value) v set_pwm2_duty(value)
Nu value l gi tr kiu int 8bit:
duty_cycle = value / ( period+1 )
Nu value l gi tr long int 16bit:
duty_cycle = value&1023 / [4*( period+1 )]

Nu khng cn iu xung qu mn th nn iu xung gi tr value 8bit cho


n gin.
V d: Ta mun iu xung PWM vi tn s 10kHz vi tn s thch
anh (fosc) s dng l 20MHz (value 8bit).
f=fosc/[4*mode*(period+1)] <=> 10000 =20000000/[ 4*mode*(period+1) ]
<=> mode(period+1) = 500
Vi mode = [1,4,16] v period = 0-255 ta c th chn:
o mode = 4; period = 124
o mode = 16; period = 32
cho vic iu xung c mn (chn c nhiu gi tr duty cycle) ta chn
mode = 4 v period = 124.
Nh vy, duty_cycle t 0% n 100% ta cho value t 0 n 125.
o value = 30 => duty_cycle = 30 / ( 124+1 ) = 0.32 = 32%
o value = 63 => duty_cycle = 63 / ( 124+1 ) = 0.504 = 50.4%
o value = 113 => duty_cycle = 113 / ( 124+1 ) = 0.904 = 90.4%
Code:
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(30);
S dng CCP1 v CCP2 cho ng c tri v ng c phi, ta c th iu khin
c tc ca 2 ng c ph hp trng thi lch khi vch trng ca robot.
Cc chng trnh con tham kho:
vic lp trnh c d dng, ta nn to cc chng trnh con x l tc .
Sau y l chng trnh tham kho ca hm speed.
o Speed (tc ng c tri, tc ng c phi)
Tc : -100 n 100 (chy ngc 100% n chy thun 100%)
V d: speed(80,60) => ng c tri chy 80%, phi 60%
// Cc hm h tr
void left_motor_forward(int value)
{
MOTOR_LEFT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1);
// Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_forward(int value)
{
MOTOR_RIGHT_DIR=0;
setup_timer_2(T2_DIV_BY_4,124,1);
// Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);

}
void left_motor_reverse(int value)
{
MOTOR_LEFT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1);
// Dieu xung 10kHz
setup_ccp2(CCP_PWM);
set_pwm2_duty(value);
}
void right_motor_reverse(int value)
{
MOTOR_RIGHT_DIR=1;
setup_timer_2(T2_DIV_BY_4,124,1);
// Dieu xung 10kHz
setup_ccp1(CCP_PWM);
set_pwm1_duty(value);
}
void left_motor_stop()
{
setup_ccp1(CCP_OFF);
}
void right_motor_stop()
{
setup_ccp1(CCP_OFF);
}
// Chng trnh x l tc 2 ng c
// 0:Stop,100:FORWARD 100%,-100:Reverse 100%
void speed (signed int left_motor_speed, signed int right_motor_speed)
{
int left_pwm_value=0,right_pwm_value=0;
/* Left motor */
if( left_motor_speed >= 0 )
{
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_forward(left_pwm_value);
}
else
{
left_motor_speed = -left_motor_speed;
left_pwm_value = 1.25*left_motor_speed; // (125*left_motor_speed/100)
left_motor_reverse(left_pwm_value);
}
/* Right motor */
if( right_motor_speed >= 0 )
{

right_pwm_value
=
1.25*right_motor_speed;
(125*left_motor_speed/100)
right_motor_forward(right_pwm_value);
}
else
{
right_motor_speed = -right_motor_speed;
right_pwm_value
=
1.25*right_motor_speed;
(125*left_motor_speed/100)
right_motor_reverse(right_pwm_value);
}
}

//

//

3.2 Nhn bit vch ngang


Trong qu trnh di chuyn ca robot, s c cc vch ngang mu trng. Nh
cc vch ngang ny, robot bit c mnh ang i n u v s thc hin
cng vic g tip theo (quay tri, quay phi, nng h trc, gp nh qu,)
Mt cch n gin, khi robot n vch trng, tt c 8 cm bin s ln mc
1 ng vi gi tr c c ca cm bin l 0b11111111 hay 0xFF. Ta dng mt
bin m bit th t ca vch ngang ang gp v thc hin cng vic mong
mun.
Code:
int n // t n l s vch ngang nhn
if (SENSOR==0xFF)
{
n++; // tng gi tr n ln 1 khi gp vch ngang
switch (n)
{
case 1: (cng vic 1) break;
case 2: (cng vic 2) break;
.
case n: (cng vic n) break;
}
}
else (chng trnh d ng)
Tuy nhin, v nhiu l do khc nhau (nhiu do nh sng bn ngoi, cc
cm bin c nhy khng u nhau hoc robot tip cn vi vch ngang
khng theo phng vung gc), mt vi cm bin khi tip xc vi mu
trng nhng khng nhn bit (vn gi trng thi mc 0 mu sm). iu ny
gy kh khn cho vic nhn bit vch ngang. V vy, khi 4/8 cm bin mc
1, ta nhn l mt vch ngang khc phc cc nh hng ny.

Code:
//KIEM TRA VACH NGANG: 1: co vach, 0:khong co vach
int check_cross_line()
{
int temp_sensor=0,led_in_line=0,i=0;
temp_sensor=SENSOR;
for (i=0;i<8;i++)
{
if ((temp_sensor&0x01)==0x01) led_in_line++;
if (led_in_line==4) break;
temp_sensor=temp_sensor>>1;
}
if (led_in_line==4)
return 1;
else
return 0;
}
Do chng trnh nhn vch ngang c gi lin tc kim tra c vch ngang
xut hin hay khng nn s dn n tnh trng khi robot n vch ngang, bin
m s vch tng thm 1. Sau , khi robot cha kp chy qua vch ngang m
hm kim tra c gi dn n vic bin m tng lin tc.
Vic ny khin cho robot thc hin sai cng vic.
Hng gii quyt tnh hung ny nh sau:
o Khi robot gp vch ngang: chy thng
o Khi ht vch ngang: bin m s vch tng thm 1
o Thc hin cng vic tng ng
Code:
while (check_cross_line() == 1) // gp vch ngang
{
speed(100,100); // chy thng
}
number_cross_line++; // tng bin m s vch ngang thm 1
3.3 X l khi robot lch hon ton khi vch
Trng hp robot lch ra khi vch (quay qu mnh hoc b va chm), gi
tr cm bin c c l 0x00, nh vy robot s b mt phng hng.
gii quyt trng hp ny, ta t mt bin trng thi l bin ton cc.
Gi bin ny l line_status:
o Line_status=0: gia vch;
o Line_status=1: lch tri;
o Line_status=2: lch phi;

Khi c gi tr cm bin d ng , ta gn lun gi tr cho bin ny. Nh vy


khi robot lch hn ra khi vch, ta vn bit c trng thi trc bit quay
tri hoc quay phi hng robot di chuyn v
pha line.
Code
switch (SENSOR)
{
case 0b00000000: // lch ra hn khi vch
{
if (line_status==1) // trng thi c l lch tri
turn_right(); break; // quay phi di chuyn v pha vch
if (line_status==2) // trng thi c l lch phi
turn_left(); break; // quay tri di chuyn v pha vch
}
// Trng thi lch thng thng
case 0b00011000: forward(); line_status=0; break;
case 0b00001100: turn_left(); line_status=1; break;
case 0b00000110: turn_left(); line_status=1; break;
case 0b00000011: turn_left(); line_status=1; break;
case 0b00000001: turn_left(); line_status=1; break;
case 0b00110000: turn_right(); line_status=2 ;break;
case 0b01100000: turn_right(); line_status=2 ;break;
case 0b11000000: turn_right(); line_status=2 ;break;
case 0b10000000: turn_right(); line_status=2 ;break;
}
3.4 ng dng encoder
3.4.1 Kin thc c bn v encoder
Trong Robot, ta thng s dng incremental encoder (encoder tng i) hay
cn gi l rotary encoder. Mc ch ca vic s dng encoder trong robot l
m s vng quay tnh s vng quay ca ng c (bnh xe), t suy ra
qung ng di chuyn v tc ca robot.

Encoder thng c s dng trong Robot


3.4.2 S dng PIC nhn v m xung t encoder

nhn xung t encoder, ta c th s dng ngt ngoi, ngt timer hoc


n gin l tham d mc logic ca cc chn vi iu khin mt cch lin
tc. Phn sau y gii thiu cch nhn v m xung ca PIC16F877A dng
ngt ngoi B0 (ni vi knh A ca encoder) v chn B1 (ni vi knh B
ca encoder). Ta c th lm tng t i vi cc cch nhn xung khc.
Khi to ngt ngoi theo cnh ln ti chn B0:
Code:
ext_int_edge(0,L_TO_H); // Ngt cnh ln ti RB0
enable_interrupts(INT_EXT); // Cho php ngt ngoi
enable_interrupts(GLOBAL); // Cho php ngt ton cc
Chng trnh con phc v ngt:
Code:
#int_EXT
void EXT_isr(void) //Chng trnh c gi khi c tc ng cnh ln ti chn
B0
{
if (RB1==1) pulse++; // Nu knh B mc cao th tng gi tr xung thm 1
else pulse--;
// Nu knh B mc cao th gim gi tr xung xung 1
}
T gi tr xung tnh c ti cc thi im ta c th tnh ra cc thng
s mong mun.

You might also like