CHƯƠNG V : THUẬT TOÁN ĐIỀU KHIỂN
5.1.Ý tưởng :
Dùng máy tính thi
ết kế giao diện truyền thông số vị trí xuống vi điều khiển, sau đó
vi điiều khiển sẽ nhận v
à xử lí tín hiệu đó rồi cho động cơ chạy đến vị trí định
trước.
5.2. Thực hiện
5.2.1.Thiết kế giao diện và lập trình dùng Visual Basic 6.0
Giao di
ện giúp người dùng truyền 2 byte chứa vị trí cần đi của vít-me và các thông
s
ố về chiều quay.
a.Giao diện
Hình 5.1 Giao diện VB
b.VB code
Private Sub cmd1_Click()
If cmd1.Caption = "Vitri" Then
vitri = Val(txt1.Text) * 199
malenh(0) = 251
bytetosend(0) = vitri And 255
bytetosend(1) = vitri \ 256 And 255
MSComm1.Output = bytetosend()
MSComm1.Output = malenh()
Else
cmd1.Caption = "Vitri"
cmd5.Enabled = True
vitri = Val(txt1.Text) * 197
malenh(0) = 251
bytetosend(0) = vitri And 255
bytetosend(1) = vitri \ 256 And 255
MSComm1.Output = bytetosend()
MSComm1.Output = malenh()
End If
End Sub
Private Sub cmd2_Click()
malenh(0) = 253
MSComm1.Output = malenh()
End Sub
Private Sub cmd3_Click()
malenh(0) = 254
MSComm1.Output = malenh()
End Sub
Private Sub cmd4_Click()
malenh(0) = 252
MSComm1.Output = malenh()
End Sub
Private Sub cmd5_Click()
cmd5.Enabled = False
cmd1.Caption = "Ready"
malenh(0) = 254
MSComm1.Output = malenh()
End Sub
Private Sub Form_Load()
With MSComm1
.CommPort = 1 'chose COM1
.Settings = "9600,N,8,1" 'baud 9600bps, none parity, 8 bit data, 1 bit stop
.InBufferSize = 1024
.InputLen = 0
.RThreshold = 1
.SThreshold = 0
.OutBufferSize = 512
.InputMode = comInputModeBinary
'.InputMode = comInputModeText
.PortOpen = True
End With
cmd2.Enabled = False
cmd3.Enabled = False
End Sub
Private Sub test_Click()
If test.Caption = "Test" Then
txt1.Enabled = False
cmd5.Enabled = False
cmd1.Enabled = False
cmd2.Enabled = True
cmd3.Enabled = True
test.Caption = "Untest"
Else
txt1.Enabled = True
cmd2.Enabled = False
cmd3.Enabled = False
test.Caption = "Test"
cmd5.Enabled = True
cmd1.Enabled = True
End If
End Sub
5.2.1.Lập trình điều khiển dùng Atmega8
Sau khi nh
ận vị trí do máy tính gửi xuống lúc này VĐK sẽ cho trục vít-me quay
đến đúng vị trí thì dừng.
Code :
#include <mega8.h>
#include <delay.h>
#define thuan PORTC.5
#define nghich PORTC.4
int flag;
unsigned int xung,xung1;
unsigned int vitri;
char m;
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
xung=xung+1;
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
nghich=0;
thuan=0;
OCR1A=0 ;
}
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if (data == 253)
{
flag = 1;
thuan=1 ;nghich=0;OCR1A=80 ;
}
else if (data == 254)
{
flag =2 ;
thuan=0 ;nghich=1;OCR1A=80 ;
}
else if (data==252)
{
flag=3;
nghich=0;thuan=0 ;OCR1A=0 ;
}
else if (data==251)
{
xung1=xung+(unsigned int)vitri;
flag=4;
thuan=1;nghich=0;OCR1A=80;
}
else
{
m++;
switch (m) {