Chương 5
CARD THU THẬP TÍN HIỆU VÀ
ĐIỀU KHIỂN
5.1 CARD PCL-818L ADVANTECH
PCL-818L là card ISA có nhiều chức năng dùng để đo lường
và điều khiển. Do tính năng ưu việt của card, việc tìm hiểu hoạt
động của nó rất cần thiết để tiếp cận kỹ thuật thu thập số liệu
bằng máy tính DAS (Data Acquisition System).
Sau đây là các chức năng chính của card:
- Chuyển đổi A/D 16 kênh 12 bit tốc độ lấy mẫu 40000/s
- Chuyển đổi D/A 1 kênh 12 bit
- 16 ngõ vào digital TTL
- 16 ngõ ra digital TTL
- 1 Bộ đếm/ đònh thời 16 bit cho người dùng
Hình 5.1: Vò trí các cầu nối, biến trở và đầu nối của card PCL-818L Hình 5.2: Sô ñoà khoái Card PCL-818L
Tác giả: TS Nguyễn Đức Thành Trang 115
Thành phố Hồ Chí Minh, tháng 4 năm 2006 Hình 5.3: Sơ đồ chân các đầu nối của card PCL-818L
Chú thích
A/DS: vào Analog (đơn) DI: vào Digital
A/DH: vào Analog cao (vi sai) DGND: mass Digital và nguồn
A/DL: vào Analog thấp (vi sai) CLK: Clock Counter 0 của 8254
AGND: mass Analog GATE: Gate Counter 0 của 8254
Khi đọc thanh ghi
BASE+0 (đọc) - Chứa Byte thấp A/D và số kênh
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value AD3 AD2 AD1 AD0 C3 C2 C1 C0
BASE+1 (đọc) - Byte cao A/D
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4
trong đó: AD11 ÷ AD0 là dữ liệu Analog đổi sang Digital
C3 ÷ C0 là số của ngõ vào analog tương ứng
Khi ghi vào thanh ghi BASE+0 : kích mềm bộ A/D, khởi động
ADC. Có thể kích bộ A/D bằng phần mềm, hoặc bằng xung clock
trên board (pacer), hoặc bằng xung ngoài. Các bit 0 và 1 trong
BASE+9 sẽ chọn nguồn kích. Nếu chọn kích mềm thì ta chỉ việc
Tác giả: TS Nguyễn Đức Thành Trang 117
Thành phố Hồ Chí Minh, tháng 4 năm 2006
ghi vào BASE+0 bất cứ một giá trò nào cho mỗi lần kích. Nếu là
kích ngoài thì cầu nối JP3 chọn nguồn kích là DI0 (CN2) hay
TRIG0 (CN3).
Điều khiển tầm A/D (BASE+1):
Mỗi kênh A/D đều có một tầm điện áp ngõ vào riêng cho nó,
được điều khiển bởi mã lưu trữ trong RAM của PCL-818L và được
đặt bởi cầu nối JP7. Nếu chúng ta muốn thay đổi tầm cho một
kênh, chọn kênh như là kênh Start ở thanh ghi BASE+2, quét
kiểu MUX, rồi ghi mã vào bit 0 và bit 1 của thanh ghi BASE+1.
BASE+1 (Ghi) - Điều khiển tầm A/D
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value N/A N/A N/A N/A N/A N/A G1 G0
Bảng 5.2 Mã tầm và JP7
Tầm điện áp ngõ vào
ghi BASE+1 là cho kênh N.
5.2.3 Các thanh ghi xuất/nhập số (BASE + 3/11)
PCL-818L có 16 ngõ vào số và 16 ngõ ra số riêng biệt. Các
kênh I/O này dùng chung port có đòa chỉ BASE+3 và BASE+11.
Khi đọc
BASE+3 (đọc port) - Byte thấp Digital Input
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value D17 D16 D15 D14 D13 D12 D11 D10
BASE+11 (đọc port) - Byte cao Digital Input
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value DI15 DI14 DI13 DI12 DI11 DI10 DI9 DI8
Khi ghi
BASE+3 (viết port) - Byte thấp Digital Input
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value DO7 DO6 DO5 DO4 DO3 DO2 DO1 DO0
BASE+11 (viết port) - Byte cao Digital Input
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value DO15 DO14 DO13 DO12 DO11 DO10 DO9 DO8
5.2.4 Thanh ghi xuất Analog D/A (BASE + 4/5)
Khi ghi
BASE+4 - Byte thấp ngõ ra D/A
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value DA3 DA2 DA1 DA0 x x x x
Tác giả: TS Nguyễn Đức Thành Trang 119
Thành phố Hồ Chí Minh, tháng 4 năm 2006
BASE+5 – Byte cao ngõ ra D/A
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value DA11 DA10 DA9 DA8 DA7 DA6 DA5 DA4
hiệu ngắt sẽ gởi đến PC qua ngõ IRQn (IRQn được chọn bởi các
bit I2 ÷ I0 trong BASE+9). Dù thanh ghi trạng thái A/D là chỉ
đọc, nhưng khi ghi vào nó một giá trò bất kỳ sẽ xóa bit INT, còn
các bit khác không đổi.
• CN3÷CN0: khi EOC = 0 thì các bit này chứa số kênh kế
tiếp sẽ được biến đổi.
Lưu ý: Nếu kích bộ A/D bằng xung clock trên board (‘pacer’)
hoặc xung ngoài thì phần mềm của bạn phải kiểm tra bit INT
trước khi đọc dữ liệu (không phải bit EOC). EOC có thể bằng 0
trong hai trường hợp:
Biến đổi đã hoàn tất
Không có một biến đổi nào đã được bắt đầu.
Do đó phần mềm của bạn phải đợi tín hiệu INT = 1 trước khi
đọc số liệu chuyển đổi. Rồi cần phải xóa bit INT bằng cách ghi
bất kỳ giá trò nào vào thanh ghi trạng thái BASE+8.
5.2.6 Thanh ghi điều khiển (BASE+9)
Đọc/ghi thanh ghi BASE+9 để nhận/cung cấp thông tin về
chế độ hoạt động của PCL-818L.
BASE+9 - Điều khiển chế độ hoạt động
Bit D7 D6 D5 D4 D3 D2 D1 D0
Value INTE I2 I1 I0 x DMAE ST1 ST0
• INTE : cấm/cho phép ngắt.
INTE = 0: cấm ngắt
INTE = 1: cho phép ngắt.
• Nếu DMAE = 0: PCL-818L sẽ phát một tín hiệu ngắt khi
5.2.7 Thanh ghi cho phép đếm/ đònh thời (BASE+10)
Card PCL-818L có vi mạch 8254 gồm ba bộ đếm 0, 1, 2 và sử
dụng hai bộ đếm 1, 2, còn bộ đếm 0 cho người dùng. Xung nhòp
cho bộ đếm 1 có thể chọn là 10MHz hay 1MHz nhờ cầu nối JP2,
ngõ ra bộ đếm 1 đưa vào ngõ nhòp của bộ đếm 2, ngõ ra của bộ
đếm 2 đưa vào kích A/D (kích pacer), vậy tần số kích phụ thuộc
tần số xung nhòp và số ghi vào hai bộ đếm 1, 2.
Tần số của pacer là
∗
clk
FDivDiv/( )12 với
=
clk
F 1 MHz hay
10MHz, Div1 và Div2 là số đặt trong bộ đếm 1 và bộ đếm 2.
Bộ đếm 0 có ngõ vào Clk là 100 KHz hay xung nhòp ngoài ở
chân 17 CN3 chọn nhờ BASE+ 10, chân Gate là DI2 (chân 3
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 122 CN2) hay GATE0 (chân 36 CN3) chọn nhờ cầu nối JP3.
Ghi vào BASE+10 để cho phép hoặc cấm bộ đếm/ đònh thời
của PCL-818L tạo xung.
BASE+10 - Cho phép pacer
Bit D7 D6 D5 D4 D3 D2 D1 D0
Valuexxxxx xTC1TC0• TC0: cấm/ cho phép pacer
bằng pacer on board. Bit 1 và 0 của thanh ghi BASE+9 sẽ chọn
nguồn trigger tương ứng.
Khi chọn kích pacer tần số kích từ 2,5 MHz đến 71 phút một
xung. Khi chọn kích ngoài, nguồn kích đònh bởi cầu nối JP3 chọn
tín hiệu kích là TRIGO (chân 35 CN3) hay DI0 (chân 1 CN2).
Việc truyền kết quả A/D cho máy tính có thể thực hiện bằng
chương trình điều khiển, bằng ngắt hay DMA.
Các bước hình thành để chuyển đổi A/D với trigger bằng
phần mềm và truyền kết quả A/D bằng chương trình điều khiển:
- Đặt tầm vào cho mỗi kênh A/D.
- Đặt kênh vào bằng cách chỉ rõ tầm quét kênh.
- Kích đổi A/D bằng cách ghi vào BASE+0 một số bất kỳ nào đó.
- Kiểm tra chuyển đổi đã kết thúc chưa bằng cách đọc bit
EOC của thanh ghi trạng thái.
- Đọc kết quả chuyển đổi ở thanh ghi BASE+ 0 và BASE+ 1.
CHƯƠNG 5: CARD THU THẬP TÍN HIỆU VÀ ĐIỀU KHIỂN TRANG 124 - Chuyển dữ liệu từ số nhò phân thành số nguyên.
2- Chuyển đổi D/A
Ghi vào thanh ghi BASE+ 4 và BASE+ 5. Khi ghi dữ liệu cho
kênh D/A phải ghi byte thấp trước. Byte thấp này được giữ tạm
thời trong một thanh ghi và không được xuất ra. Sau khi ghi xong
byte cao thì khi đó byte cao và byte thấp được kết hợp lại để
chuyển thành D/A.
3- Digital input và output (DI&DO)
Ta đọc DI từ thanh ghi BASE+3 (byte thấp) và thanh ghi
BASE+11 (byte cao). Sau khi đọc dữ liệu sẽ không được chốt,
đường vào sẽ ở trạng thái thứ ba. Ta có thể xuất ra DO cũng
bằng cách dùng hai thanh ghi BASE+3 và BASE+11 này. Thanh
}
đia chi nen cho I/O
reg0= base + 0;
reg1= base + 1;
reg2= base + 2;
reg3= base + 3;
reg4= base + 4;
reg5= base + 5;
reg6= base + 6;
reg7= base + 7;
reg8= base + 8;
reg9= base + 9;
reg10= base + 10;
reg11= base + 11;
reg12= base + 12;
reg13= base + 13;
reg14= base + 14;
reg15= base + 15;
{
}
1 Function Read_AD (var channel: byte): word
{
}
2 Procedure Trig_AD;
{
}
3
Procedure Set_rangeAD (range: byte);
{
{
}
13 Function IRQ: byte;
{
}
14
Function DMAE: byte;
{
}
15 Function Trigsource: byte;
{
}
16
Procedure Set_INTE (sint: byte);
{
}
17 Procedure Set_IRQ (irq: byte);
{
}
18 Procedure Set_DMAE (dmae: byte);
{
}
19
Procedure Set_trigsource (trs: byte);
{
}
20 Procedure Clear_INT;
{
}
21 Procedure Counter_enb (tc: byte);
end;
inport:= data;
end;
Procedure outport (address: word; data: word);
{
}
ham xuat ra Port
begin
asm
mov dx, address
mov ax, data
out dx, ax
end;
end;
{
}
1 Function Read_AD (var channel: byte): word;
{
}
doc du lieu bo A/D
Tác giả: TS Nguyễn Đức Thành Trang 127
Thành phố Hồ Chí Minh, tháng 4 năm 2006
var dlow, dhigh: byte;
begin
dlo:= inport (reg0);
dhigh:=inport(regl);
channel:= dlow and $0F;
{
}
end;
{
}
5 Function Dig_in: word;
begin
dig_in:=inport (reg3) + 256* inport (reg11);
end;
{
}
6 Procedure Dig_out (data: word);
begin
outport (reg3, data and $00FF);
outport (reg11, (data and $FF00) shr 8);
end;
{
}
7
Procedure Analog_out (data: word);
begin
outport (reg4, (data and $000F) shl 4);
outport (reg5, (data and $0FF0) shr 4);
end;
CHệễNG 5: CARD THU THAP TN HIEU VAỉ ẹIEU KHIEN TRANG 128 {
}
8 Function EOC: byte;
begin
EOC:= (inport (reg8) and $80) shr 7;
IRQ:= (inport (reg9) and $70) shr 4;
end;
{
}
14
Function DMAE: byte;
begin
DMAE:= (inport (reg9) and $04) shr 4;
end;
{
}
15 Function Trigsource: byte;
begin
Trigsource:= inport (reg9) and $03;
end;
{
}
16 Procedure Set_INTE (sint: byte); {dat xoa INTE}
var i: byte;
begin
i:= inport (reg9) and $7F;
outport (reg9), (sint shl 7) or i);
Tác giả: TS Nguyễn Đức Thành Trang 129
Thành phố Hồ Chí Minh, tháng 4 năm 2006
end;
{
}
17 Procedure Set_IRQ (irq: byte); {chon ngo ngat}
var i: byte;
begin
outport (reg10, tc and $03);
end;
{
}
22 Procedure Set_counter (cnt, mode, dl, dh: byte);
begin
outport (reg15, $30) + (cnt shl 6) + (mode shl 1);
outport (reg12 + cnt, dl);
outport (reg12 + cnt, dh)
end;
{
}
23 Procedure Select_nextchannel (setchan: byte)
var i: byte;
begin
i:= (inport (reg8) and $F0) or setchan;
outport (reg8, i)
CHệễNG 5: CARD THU THAP TN HIEU VAỉ ẹIEU KHIEN TRANG 130 end;
{
}
24 Function Read_counter (cnt: byte): word; {doc LSB truoc, MSB sau}
var dl, dh, cnt0: byte;
begin
cnt0:= cnt +1;
if cnt0 = 3 then cnt0:=4
outport (reg15, $D0 + (cnt0 shl 1));
end;
end;
{
}
26 Procedure Xuat (add: word; data: byte);
begin
outport (add, data);
end;
{
}
27 Function Nhap (add: word): byte;
begin
nhap:=inport (add);
Tác giả: TS Nguyễn Đức Thành Trang 131
Thành phố Hồ Chí Minh, tháng 4 năm 2006
end;
end.
5.4.2 Chương trình C đổi tương đồng ra số dùng kích mềm
#include <stdio.h>
#include <dos.h>
#include <process.h>
#include <conio.h>
char *gain_str[4]={"5V","2.5V","1.25V","0.625V"};
void main()
{
int status, s_end, start, stop;
int dtl, dth, adl, adt, c_reg, s_ch_val, r_ch;
int chv, ch_gain[16];
int port, val, i, j;
{
printf("Enter start channel number <0-7>: ");
scanf("%d",&start);
printf("Enter stop channel number <0-7>: ");
scanf("%d",&stop);
}
if ((s_end== 0) & (stop>7))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}
if ((s_end==1) & (stop>15))
{
printf("Entered channel failed! Re-do!\n");
goto redo;
}
if (start > stop)
{
printf("Entered channel failed!\n");
Tác giả: TS Nguyễn Đức Thành Trang 133
Thành phố Hồ Chí Minh, tháng 4 năm 2006
goto redo;
}
/*********** STEP 3: SET A/D RANGE CODE *****************/
for(i=start; i<=stop; i++)
{
printf("Enter range code <0 3> for channel %d :",i);
re_enter_gain:
scanf("%d",&ch_gain[i]);
delay(1);
dtl = inportb(port);
dth = inportb(port+1);
adl = dtl/16;
adt = dth*16+ adl;
chv = dtl- adl*16;
printf(" A/D data = %d\n",adt);
printf(" Current channel = %d A/D range = %-7s\n",chv, gain_str[ch_gain[chv]]);
printf(" Next scan channel = %d\n",(status & 0x0f));
printf(" Start scan channel= %d\n",start);
printf(" Stop scan channel = %d\n",stop);
printf(" Type 'ESC' to exit or other key for another conversion.\n\n");
} while(getche()!=27);
}
5.4.3 Chửụng trỡnh Qbasic
230 SCREEN 0,0,0:WIDTH 80:CLS:KEY OFF
240 PORT%=&H300 'SET I/O PORT BASE ADDRESS
310 DIM GAIN%(16)
320 '******** STEP 1: INITIALIZE & SELECT SOFTWARE TRIGGER ***************
330 'PORT%+9 CONTROL REGISTER
340 OUT PORT%+9,&H70 'SELECT SOFTWARE TRIGGER
350 C.REG%=INP(PORT%+9)
360 IF C.REG% <> &H70 THEN PRINT"PCL-818L VERIFICATION FAILED!":STOP
370 OUT PORT%+8,1 'CLEAR INTERRUPT REQUEST
380 PRINT "***** PLEASE SET PCL-818L'S JUMPER 7 (A/D IN) TO 5V *****"
Tác giả: TS Nguyễn Đức Thành Trang 135
Thành phố Hồ Chí Minh, tháng 4 năm 2006
400 '******** STEP 2: READ A/D STATUS REGISTER ****************************
420 S.END=0
720 PRINT"START SCAN CHANNEL = ";START%
730 PRINT"STOP SCAN CHANNEL = ";STP%
740 PRINT
750 PRINT"PRESS 'SPACE' KEY TO CONTINUE"
760 A$=INKEY$ :IF A$ ="" GOTO 760
770 IF A$=" " GOTO 620
780 END
5.4.4 Thư viện adsapi32.dll
File adsapi32.dll do hãng cung cấp được cài vào thư mục hệ
thống, trong chương trình ứng dụng phải khai sử dụng driver
khai báo các hàm trong dll. Sử dụng các hàm trong thư viện giúp
chương trình mang tính chuyên nghiệp hơn, có thể lập trình
ngắt, DMA trong hệ điều hành Win988, Win2000XP. Vì file
driver (.pas, .h, .bas) khá lớn nên chỉ trình bày một phần nhỏ ở
đây (xem website www.advantech.com
).
Đầu tiên phải cài đặt driver vào máy tính thư mục
Advantech\Adsapi\include sẽ chứa các file driver (.pas, .bas,.h)
khai báo các hàm của adsapì.dll (chứa trong windows\system).
Sau khi đã gắn card vào máy tính chạy chương trình Device
installation để cài đặt thông số card vào máy , card sẽ được gắn
một số là DeviceNum. Có thể có nhiều card sử dụng cùng lúc với
các số khác nhau. Khi lập trình cần phải khai báo sử dụng driver,
các hàm được gọi đến kèm theo thông số do driver qui đònh. Cụ
thể tùy theo ngông ngữ lập trình sử dụng. Phần sau mô tả một số
hàm của driver và ví dụ áp dụng
Device Functions Analog Input Analog Output
DRV_DeviceOpen
DRV_DeviceClose
DRV_DioGetCurrentDOByte
DRV_DioGetCurrentDOBit
DRV_WritePortByte
DRV_WritePortWord
DRV_ReadPortByte
DRV_ReadPortWord
DRV_outp
DRV_outpw
DRV_intp
DRV_intpw
Các hàm có dạng chung
status = FUNCTION_Name(parameter 1, parameter 2 parameter n)
status là biến 4 byte, nếu hàm thực hiện tốt thì biến status trả về bằng 0, nếu không tốt thì
status<>0
Mở card để dùng
status = DRV_DeviceOpen(DeviceNum,DriverHandle)
Tên Hướng Loại Miêu tả
DeviceNum Input unsigned long Số của card do chương trình cài đặt của
advantech quiđònh
DriverHandle output unsigned long Con trỏ đến cấu hình card
Đóng card khi không dùng, giải phóng bộ nhớ
status = DRV_DeviceClose(DriverHandle)