Professional Documents
Culture Documents
1.2.1 Mạch ngõ vào (cảm biến, nút ấn, công tắc hành trình)
Với robot đơn giản, ngõ vào thường là mức logic lấy từ cảm biến quang
(quang trở, quang diode), nút ấn hoặc công tắc hành trình. Từ đó mạch vi
điều khiển xử lý các tín hiệu này để xuất ngõ ra (thường là động cơ DC) cho
phù hợp.
Cảm biến quang phải được che chắn cẩn thận để hạn chế ảnh hưởng từ các
nguồn ánh sáng bên ngoài.
5V
R4 100K
VCC
VCC
R R2
1
330 33K
3 + U1A R3
1 CAMBIEN 10K
2 - 1 CTHT
LM324
D2 D3
LED QUANG TRO
Vạch trắng: mức 1 C1 SW2
BIT0
104
Nền: mức 0
MCU MODULE
Hình 4: Mạch vi điều khiển
1.2.3 Mạch công suất điều khiển động cơ DC
Một số mạch thông dụng:
P-DIR2
LS2
12V D13
RELAY
D12 M2 8
1N5819 Q4 IRF540 1 MOTOR2
D468 5
D14 6 1N5819 1
P-PWM2 1N5819 24V 7 2
4 C2
Q5 R12 3 104
B562 330 2W 2 CON2
D1 D2
DIODE DIODE
U3
U4
5 8
VCC VB 5 8
C1 VCC VB
IN1 1 7 + C2
IN HO IN2 1 7 + C3 C4
4.7u 100n IN HO
2 6 4.7u 100n
C5 + SD VS 2 6
4.7u SD VS
C6 3 4
100n COM LO 3 4
COM LO
24V
IR 2184
IR2184
Q1
R4 4.7R R5 Q2
IRF540 IRF540
4.7R
J1
1
C14 2
104
C7 + C8 MOTOR
470n Q3 470u
R6 4.7R Q4
R7
IRF540 IRF540
4.7R
Hình 6: Mạch cầu H điều khiển động cơ với Half Bridge Driver IR2184
Phần hướng dẫn chi tiết về mạch điện tử sẽ được trình bày trong một tài
liệu khác. Tài liệu này chỉ tập trung vào phần lập trình.
#include <16f877A.h>
#include <def_877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
void motor_right_forward();
void motor_right_reverse();
void motor_right_stop();
void forward();
void reverse();
void stop();
void turn_left();
void turn_right();
{
motor_left_forward();
motor_right_forward();
}
// Chạy lùi
void reverse()
{
motor_left_reverse();
motor_right_reverse();
}
// Dừng
void stop()
{
motor_left_stop();
motor_right_stop();
}
// Quay trái
void turn_left()
{
motor_left_forward();
motor_right_reverse(); // hoặc motor_right_stop();
}
// Quay phải
void turn_right()
{
motor_left_reverse(); // hoặc motor_left_stop();
motor_right_forward();
}
Ton 0 .8
duty _ cycle 0.8 80%
Ton Toff 0.8 0.2
Vì tốc độ động cơ DC tỉ lệ với duty cycle nên tốc độ động cơ đạt tương
đương 80% tốc độ tối đa.
Các hàm hỗ trợ việc điều xung bằng phần cứng của CCS:
Ghi chú: Chỉ đề cập đến các đối số của các hàm được phục vụ cho việc điều
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
f osc
Tần số điều xung PWM: f
4.mode.(period 1)
o setup_ccp1(mode) và setup_ccp2(mode)
mode:
CCP_PWM: chọn chế độ PWM.
CCP_OFF: tắt chế độ PWM.
o set_pwm1_duty(value) và set_pwm2_duty(value)
Nếu value là giá trị kiểu int 8bit:
value
duty _ cycle
period 1
Nếu value là giá trị long int 16bit:
value & 1023
duty _ cycle
4 * ( period 1)
Nếu không cần điều xung quá “mịn” thì nên điều xung ở giá
trị value 8bit cho đơn giản.
Ví dụ: Ta muốn điều xung PWM với tần số 10kHz với tần số thạch anh
(fosc) sử dụng là 20MHz (value 8bit).
f osc 20000000
f 10000 mode(period 1) 500
4.mode.(period 1) 4.mode.(period 1)
Với mode = [1,4,16] và period = 0-255 ta có thể chọn
o mode = 4; period = 124
o mode = 16; period = 32
Để cho việc điều xung được “mịn” (chọn được nhiều giá trị duty cycle) ta
chọn mode = 4 và period = 124.
Như vậy, để duty_cycle từ 0% đến 100% ta cho value từ 0 đến 125.
30
o value = 30 duty _ cycle 0.32 32%
124 1
63
o value = 63 duty _ cycle 0.504 50,4%
124 1
113
o value = 113 duty _ cycle 0.904 90,4%
124 1
Code:
setup_timer_2(T2_DIV_BY_4,124,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(30);
Sử dụng CCP1 và CCP2 cho động cơ trái và động cơ phải, ta có thể điều
khiển được tốc độ của 2 động cơ phù hợp trạng thái lệch khỏi vạch trắng
của robot.
Các chương trình con tham khảo:
Để việc lập trình được dễ dàng, ta nên tạo các chương trình con xử lý tốc
độ. Sau đây là chương trình tham khảo của hàm speed.
o Speed (tốc độ động cơ trái, tốc độ động cơ phải)
Tốc độ: -100 đến 100 (chạy ngược 100% đến chạy thuận 100%)
Ví dụ: speed(80,60) động cơ trái chạy 80%, phải 60%
}
/* 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);
}
}
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 chương trình nhận vạch ngang được gọi liên tục để kiểm tra có vạch
ngang xuất hiện hay không nên sẽ dẫn đến tình trạng khi robot đến vạch
ngang, biến đếm số vạch tăng thêm 1. Sau đó, khi robot chưa kịp chạy qua
vạch ngang mà hàm kiểm tra được gọi dẫn đến việc biến đếm tăng liên tục.
Việc này khiến cho robot thực hiện sai công việc.
Hướng giải quyết tình huống này như sau:
o Khi robot gặp vạch ngang: chạy thẳng
o Khi hết vạch ngang: biến đếm số vạch tăng thêm 1
o Thực hiện công việc tương ứng
Code:
while (check_cross_line() == 1) // gặp vạch ngang
{
speed(100,100); // chạy thẳng
}
number_cross_line++; // tăng biến đếm số vạch ngang thêm 1