Bài giảng Đo lường và điều khiển bằng máy tính - Chương 5: Card thu thập tín hiệu và điều khiển

Chöông  
5
CARD THU THAÄP TÍN HIEÄU VAØ  
ÑIEÀU KHIEÅN  
5.1 CARD PCL-818L ADVANTECH  
PCL-818L laø card ISA coù nhieàu chöùc naêng duøng ñeå ño löôøng  
vaø ñieàu khieån. Do tính naêng öu vieät cuûa card, vieäc tìm hieåu hoaït  
ñoäng cuûa noù raát caàn thieát ñeå tieáp caän kyõ thuaät thu thaäp soá lieäu  
baèng maùy tính DAS (Data Acquisition System).  
Sau ñaây laø caùc chöùc naêng chính cuûa card:  
- Chuyeån ñoåi A/D 16 keânh 12 bit toác ñoä laáy maãu 40000/s  
- Chuyeån ñoåi D/A 1 keânh 12 bit  
- 16 ngoõ vaøo digital TTL  
- 16 ngoõ ra digital TTL  
- 1 Boä ñeám/ ñònh thôøi 16 bit cho ngöôøi duøng  
Hình 5.1: Vò trí caùc caàu noái, bieán trôû vaø ñaàu noái cuûa card PCL-818L  
Hình 5.2: Sô ñoà khoái Card PCL-818L  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 115  
Hình 5.3: Sô ñoà chaân caùc ñaàu noái cuûa card PCL-818L  
Chuù thích  
A/DS: vaøo Analog (ñôn)  
A/DH: vaøo Analog cao (vi sai)  
A/DL: vaøo Analog thaáp (vi sai)  
AGND: mass Analog  
D/A: ra Analog  
DI: vaøo Digital  
DGND: mass Digital vaø nguoàn  
CLK: Clock Counter 0 cuûa 8254  
GATE: Gate Counter 0 cuûa 8254  
OUT: tín hieäu ra cuûa 8254  
VREF: nguoàn chuaån trong  
VREF IN: nguoàn chuaån ngoaøi  
DO: ra Digital  
5.2 CAÙC THANH GHI CUÛA CARD  
PCL- 818L coù 16 thanh ghi, ñòa chæ goác coù theå choïn bôûi coâng  
taéc SW1, goàm 6 tieáp ñieåm, choïn caùc ñöôøng ñòa chæ SA4 ÷ SA9,  
thöôøng ñaët ñòa chæ goác BASE laø 300h.  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 116  
Baûng 5.1 Caùc thanh ghi  
Ñòa chæ  
Ñoïc  
Vieát  
BASE+0  
BASE+1  
BASE+2  
BASE+3  
BASE+4  
BASE+5  
BASE+6  
BASE+7  
BASE+8  
BASE+9  
BASE+10  
BASE+11  
BASE+12  
BASE+13  
BASE+14  
BASE+15  
Byte thaáp A/D vaø soá keânh Kích meàm A/D  
Byte cao A/D  
Queùt keânh MUX  
Byte thaáp Digital Input  
N/A  
Ñieàu khieån taàm A/D  
Queùt keânh MUX vaø chæ taàm ñieàu khieån  
Byte thaáp Digital Output  
Byte thaáp Analog Output  
Byte cao Digital Output  
N/A  
N/A  
N/A  
N/A  
N/A  
Traïng thaùi  
Ñieàu khieån  
N/A  
Xoùa yeâu caàu ngaét  
Ñieàu khieån  
Cho pheùp Counter  
Byte cao Digital Output  
Counter 0  
Byte cao Digital Output  
Counter 0  
Counter 1  
Counter 2  
N/A  
Counter 1  
Counter 2  
Ñieàu khieån counter  
5.2.1 Caùc thanh ghi cô sôû + 0 vaø cô sôû +1  
Khi ñoïc thanh ghi  
BASE+0 (ñoïc) - Chöùa Byte thaáp A/D vaø soá keânh  
Bit  
D7  
D6 D5 D4 D3 D2 D1 D0  
Value AD3 AD2 AD1 AD0 C3 C2 C1 C0  
BASE+1 (ñoïc) - Byte cao A/D  
Bit  
Value AD11 AD10 AD9 AD8 AD7 AD6 AD5 AD4  
trong ñoù: AD11 ÷ AD0 laø döõ lieäu Analog ñoåi sang Digital  
D7  
D6 D5 D4 D3 D2 D1 D0  
C3 ÷ C0 laø soá cuûa ngoõ vaøo analog töông öùng  
Khi ghi vaøo thanh ghi BASE+0 : kích meàm boä A/D, khôûi ñoäng  
ADC. Coù theå kích boä A/D baèng phaàn meàm, hoaëc baèng xung clock  
treân board (pacer), hoaëc baèng xung ngoaøi. Caùc bit 0 vaø 1 trong  
BASE+9 seõ choïn nguoàn kích. Neáu choïn kích meàm thì ta chæ vieäc  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 117  
ghi vaøo BASE+0 baát cöù moät giaù trò naøo cho moãi laàn kích. Neáu laø  
kích ngoaøi thì caàu noái JP3 choïn nguoàn kích laø DI0 (CN2) hay  
TRIG0 (CN3).  
Ñieàu khieån taàm A/D (BASE+1):  
Moãi keânh A/D ñeàu coù moät taàm ñieän aùp ngoõ vaøo rieâng cho noù,  
ñöôïc ñieàu khieån bôûi maõ löu tröõ trong RAM cuûa PCL-818L vaø ñöôïc  
ñaët bôûi caàu noái JP7. Neáu chuùng ta muoán thay ñoåi taàm cho moät  
keânh, choïn keânh nhö laø keânh Start ôû thanh ghi BASE+2, queùt  
kieåu MUX, roài ghi maõ vaøo bit 0 vaø bit 1 cuûa thanh ghi BASE+1.  
BASE+1 (Ghi) - Ñieàu khieån taà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  
Baûng 5.2 Maõ taàm vaø JP7  
Taàm ñieän aùp ngoõ vaøo  
Maõ taàm  
JP7 = 5  
±5V  
JP7 = 10  
±10V  
0
0
1
1
0
1
0
1
±2.5V  
±5V  
±1,25V  
±0,625V  
±2,5V  
±1,25V  
5.2.2 Thanh ghi queùt phaân keânh (BASE+2):  
- Ñoïc/ghi BASE+2 ñeå ñieàu khieån/ñoïc soá keânh A/D ñöôïc queùt.  
Nöûa byte cao chæ keânh Stop, nöûa byte thaáp chæ keânh Start. Vieäc  
queùt phaân keânh (MUX) ñöôïc khôûi ñoäng ñeán keânh Start khi chuùng  
ta ghi vaøo thanh ghi naøy. Moãi Trigger A/D seõ chuyeån ñeán keânh  
ño tieáp theo.  
- Khi kích chuyeån ñoåi lieân tuïc, MUX seõ queùt töø keânh Start  
ñeán keânh Stop roài laëp laïi töø ñaàu. Ví duï, neáu keânh Start laø 4 vaø  
Stop laø 7 thì queùt tuaàn töï: 4, 5, 6, 7, 4, 5, 6, 7. Neáu caøi ñaët ôû cheá  
ñoä 8 ñaàu vaøo vi sai thì caùc bit CH3 vaø CL3 phaûi laø 0.  
- Neáu chæ choïn moät keânh ñeå bieán ñoåi A/D thì caøi ñaët keânh  
Start vaø Stop cuøng moät trò soá laø soá cuûa keânh caàn thöïc hieän bieán  
ñoåi A/D.  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 118  
BASE+2 (Vieát) - Caùc keânh queùt ñaàu vaø cuoái  
Bit  
D7 D6 D5 D4 D3 D2 D1 D0  
Value CH3 CH2 CH1 CH0 CL3 CL2 CL1 CL0  
CH3 ÷ CH0 laø keânh Stop, CL3 ÷ CL0 laø keânh Start.  
Nöûa bit thaáp cuûa thanh ghi queùt phaân keânh CL3 ñeán CL0  
cuõng coù taùc duïng nhö 1 con troû khi chuùng ta laäp trình taàm ñieän  
aùp vaøo A/D. Khi ñaët keânh Start laø N, thì maõ taàm vieát vaøo thanh  
ghi BASE+1 laø cho keânh N.  
5.2.3 Caùc thanh ghi xuaát/nhaäp soá (BASE + 3/11)  
PCL-818L coù 16 ngoõ vaøo soá vaø 16 ngoõ ra soá rieâng bieät. Caùc  
keânh I/O naøy duøng chung port coù ñòa chæ BASE+3 vaø BASE+11.  
Khi ñoïc  
BASE+3 (ñoïc port) - Byte thaáp Digital Input  
Bit  
D7 D6 D5 D4 D3 D2 D1 D0  
Value D17 D16 D15 D14 D13 D12 D11 D10  
BASE+11 (ñoï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 (vieát port) - Byte thaáp Digital Input  
Bit  
D7  
D6  
D5  
D4  
D3  
D2 D1 D0  
Value DO7 DO6 DO5 DO4 DO3 DO2 DO1 DO0  
BASE+11 (vieá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 xuaát Analog D/A (BASE + 4/5)  
Khi ghi  
BASE+4 - Byte thaáp ngoõ ra D/A  
Bit  
D7  
D6 D5 D4 D3 D2 D1 D0  
Value DA3 DA2 DA1 DA0  
x
x
x
x
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 119  
BASE+5 – Byte cao ngoõ ra D/A  
D7 D6 D5 D4 D3 D2 D1 D0  
Bit  
Value DA11 DA10 DA9 DA8 DA7 DA6 DA5 DA4  
trong ñoù: DA11 ÷ DA0 laø döõ lieäu Digital sang Analog  
Taàm ñieän aùp ra ñöôïc choïn nhôø caàu noái JP4 vaø JP5. Neáu JP4  
ñaët ôû IN thì JP5 choïn nguoàn chuaån trong laø -5V hay -10V, aùp ra  
cuûa D/A seõ laø 0 ñeán +5V hay 0 ñeán +10V. Neáu JP4 ñaët vò trí EXT  
thì ñieän aùp ra D/A laø keát quaû nhaân soá digital trong hai thanh ghi  
vôùi ñieän aùp ñaët vaøo chaân 31 VREF IN ( -10V..+10V) cuûa ñaàu noái  
CN3 chia cho 4095.  
5.2.5 Thanh ghi traïng thaùi BASE+8  
- Ñoïc BASE+ 8 ñeå nhaän thoâng tin veà caáu hình vaø hoaït ñoäng  
A/D.  
- Ghi vaøo BASE+ 8 moät giaù trò baát kyø thì noù seõ xoùa bit INT  
cuûa BASE+ 8, coøn nhöõng bit döõ lieäu khaùc khoâng ñoåi.  
BASE+8 - Traïng thaùi A/D  
Bit  
D7 D6 D5 D4 D3 D2 D1 D0  
Value EOC N/A MUX INT CN3 CN2 CN1 CN0  
• EOC: End Of Conversion  
EOC= 0: ñaõ ñoåi xong, keát quaû ñoåi chöùa trong BASE+ 0 vaø  
BASE+ 1.  
EOC= 1: ñang chuyeån ñoåi A/D.  
• MUX: choïn 8 keânh vi sai hoaëc 16 keânh ñôn, phaûn aûnh vò trí caàu  
noái JP6.  
MUX= 0: 8 keânh vi sai  
MUX= 1: 16 keânh ñôn  
• INT: tín hieäu ngaét  
INT = 0: döõ lieäu khoâng coù giaù trò (khoâng coù moät bieán ñoåi naøo keå  
töø khi bit INT bò xoùa).  
INT = 1: A/D ñaõ bieán ñoåi xong, döõ lieäu coù giaù trò.  
Neáu bit INTE= 1 (BASE+ 9) thì khi ñoåi xong moät keânh, tín  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 120  
hieäu ngaét seõ gôûi ñeán PC qua ngoõ IRQn (IRQn ñöôïc choïn bôûi caùc  
bit I2 ÷ I0 trong BASE+9). Duø thanh ghi traïng thaùi A/D laø chæ  
ñoïc, nhöng khi ghi vaøo noù moät giaù trò baát kyø seõ xoùa bit INT, coøn  
caùc bit khaùc khoâng ñoåi.  
•
CN3÷CN0: khi EOC = 0 thì caùc bit naøy chöùa soá keânh keá  
tieáp seõ ñöôïc bieán ñoåi.  
Löu yù: Neáu kích boä A/D baèng xung clock treân board (‘pacer’)  
hoaëc xung ngoaøi thì phaàn meàm cuûa baïn phaûi kieåm tra bit INT  
tröôùc khi ñoïc döõ lieäu (khoâng phaûi bit EOC). EOC coù theå baèng 0  
trong hai tröôøng hôïp:  
Bieán ñoåi ñaõ hoaøn taát  
Khoâng coù moät bieán ñoåi naøo ñaõ ñöôïc baét ñaàu.  
Do ñoù phaàn meàm cuûa baïn phaûi ñôïi tín hieäu INT = 1 tröôùc khi  
ñoïc soá lieäu chuyeån ñoåi. Roài caàn phaûi xoùa bit INT baèng caùch ghi  
baát kyø giaù trò naøo vaøo thanh ghi traïng thaùi BASE+8.  
5.2.6 Thanh ghi ñieàu khieån (BASE+9)  
Ñoïc/ghi thanh ghi BASE+9 ñeå nhaän/cung caáp thoâng tin veà  
cheá ñoä hoaït ñoäng cuûa PCL-818L.  
BASE+9 - Ñieàu khieån cheá ñoä hoaït ñoäng  
Bit  
D7 D6 D5 D4 D3 D2 D1 D0  
Value INTE I2 I1 I0 x DMAE ST1 ST0  
• INTE : caám/cho pheùp ngaét.  
INTE = 0: caám ngaét  
INTE = 1: cho pheùp ngaét.  
•
Neáu DMAE = 0: PCL-818L seõ phaùt moät tín hieäu ngaét khi  
noù hoaøn taát moät chuyeån ñoåi A/D. Vaäy caáu hình INTE = 1.  
DMAE = 0 duøng ñeå baùo cho CPU bieát baèng ngaét laø ñaõ ñoåi  
A/D xong.  
•
Neáu DMAE = 1: PCL-818L seõ phaùt moät tín hieäu ngaét khi  
noù nhaän moät tín hieäu ñeám traøn T/C (Terminal count) töø boä  
ñieàu khieån DMA cuûa maùy tính ñeå chæ raèng chuyeån ñoåi  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 121  
truyeàn DMA ñaõ hoaøn taát. Truyeàn DMA bò döøng bôûi ngaét  
gaây ra bôûi tín hieäu T/C. Xem DMAE beân döôùi.  
•
I2÷ I0: choïn soá ngaét cho data interrupt hoaëc truyeàn data  
DMA (khoâng ñöôïc truøng vôùi soá ngaét cuûa thieát bò khaùc).ba  
bit naøy choïn soá ngaét töø 2 (010) ñeán 7 (111).  
• DMAE: caám/cho pheùp PCL-818L truyeàn DMA.  
DMAE = 0: caám truyeàn DMA.  
DMAE = 1: cho pheùp truyeàn DMA. Moãi bieán ñoåi A/D seõ khôûi  
ñoäng hai tín hieäu yeâu caàu ngaét lieân tieáp. Caùc tín hieäu naøy cho  
pheùp boä ñieàu khieån DMA 8237 truyeàn 2 byte döõ lieäu chuyeån ñoåi  
AD töø PCL-818L ñeán boä nhôù. Choïn keânh truyeàn DMA 1 hay 3  
nhôø caàu noái JP1.  
Löu yù: phaûi laäp trình boä ñieàu khieån DMA vaø thanh ghi trang  
DMA 8237 cuûa maùy tính tröôùc khi ñaët DMAE = 1.  
•
ST1 ÷ ST0: choïn nguoàn kích  
Baûng 5.3  
Nguoàn kích ST1 ST0  
Kích meàm  
Kích ngoaøi  
Kích Pacer  
0
1
1
X
0
1
5.2.7 Thanh ghi cho pheùp ñeám/ ñònh thôøi (BASE+10)  
Card PCL-818L coù vi maïch 8254 goàm ba boä ñeám 0, 1, 2 vaø söû  
duïng hai boä ñeám 1, 2, coøn boä ñeám 0 cho ngöôøi duøng. Xung nhòp  
cho boä ñeám 1 coù theå choïn laø 10MHz hay 1MHz nhôø caàu noái JP2,  
ngoõ ra boä ñeám 1 ñöa vaøo ngoõ nhòp cuûa boä ñeám 2, ngoõ ra cuûa boä  
ñeám 2 ñöa vaøo kích A/D (kích pacer), vaäy taàn soá kích phuï thuoäc  
taàn soá xung nhòp vaø soá ghi vaøo hai boä ñeám 1, 2.  
Taàn soá cuûa pacer laø Fclk /(Div1∗ Div2) vôùi F = 1MHz hay  
clk  
10MHz, Div1 vaø Div2 laø soá ñaët trong boä ñeám 1 vaø boä ñeám 2.  
Boä ñeám 0 coù ngoõ vaøo Clk laø 100 KHz hay xung nhòp ngoaøi ôû  
chaân 17 CN3 choïn nhôø BASE+ 10, chaân Gate laø DI2 (chaân 3  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 122  
CN2) hay GATE0 (chaân 36 CN3) choïn nhôø caàu noái JP3.  
Ghi vaøo BASE+10 ñeå cho pheùp hoaëc caám boä ñeám/ ñònh thôøi  
cuûa PCL-818L taïo xung.  
BASE+10 - Cho pheùp pacer  
Bit D7 D6 D5 D4 D3 D2 D1 D0  
Value  
x
x
x
x
x
x TC1 TC0  
• TC0: caám/ cho pheùp pacer  
TC0 = 0; cho pheùp pacer  
TC0 = 1; pacer ñöôïc ñieàu khieån bôûi TRIG0 (chaân 35 CN3). Tín  
hieäu naøy chaën xung trigger gôûi töø ‘pacer’ ñeán boä A/D khi noù baèng  
0.  
• TC1: choïn cheá ñoä nguoàn xung nhòp ngoõ vaøo Counter 0.  
TC1 = 0; counter 0 nhaän xung clock ngoaøi (chaân 17 CN3)  
TC1 = 1; counter 0 nhaän xung clock 100KHz ôû beân trong.  
5.2.8 Caùc thanh ghi ñieàu khieån vaø ñoïc/ghi boä ñeám  
Boä ñònh thì 8254 söû duïng boán thanh ghi BASE+12, BASE+13,  
BASE+14, BASE+15. Caùc chöùc naêng cuûa caùc thanh ghi naøy ñöôïc  
lieät keâ trong baûng 5.14.  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 123  
Baûng 5.4  
Thanh ghi  
Chöùc naêng  
Thanh ghi  
BASE+14  
BASE+15  
Chöùc naêng  
BASE+12  
BASE+13  
Counter 0 ñoïc/ghi  
Counter 1 ñoïc/ghi  
Counter 2 ñoïc/ghi  
Ñieàu khieån boä ñeám  
Do boä ñeám 8254 coù caáu truùc 16 bit, neân moãi döõ lieäu ñoïc/ ghi  
ñöôïc chia laøm 2 byte: byte thaáp (LSB), byte cao (MSB). Ñeå traùnh  
phaïm loãi ñoïc/ghi sai, caàn chuù yù thao taùc ñoïc ghi töøng ñoâi (töùc moãi  
laàn ñoïc/ghi hai byte) vaø theo ñuùng thöù töï byte. Chi tieát veà thanh  
ghi ñieàu khieån cuûa 8254 xem ôû Chöông 3.  
5.3 CHUYEÅN ÑOÅI A/D, D/A & DO  
5.3.1 Laäp trình tröïc tieáp  
Card PCL-818 coù theå laäp trình baèng kyõ thuaät ñaõ trình baøy ôû  
Chöông 4, nghóa laø truy caäp tröïc tieáp caùc thanh ghi cuûa card.  
1- Chuyeån ñoåi A/D  
Coù theå kích ñoåi A/D baèng phaàn meàm, baèng xung ngoaøi hay  
baèng pacer on board. Bit 1 vaø 0 cuûa thanh ghi BASE+9 seõ choïn  
nguoàn trigger töông öùng.  
Khi choïn kích pacer taàn soá kích töø 2,5 MHz ñeán 71 phuùt moät  
xung. Khi choïn kích ngoaøi, nguoàn kích ñònh bôûi caàu noái JP3 choïn  
tín hieäu kích laø TRIGO (chaân 35 CN3) hay DI0 (chaân 1 CN2).  
Vieäc truyeàn keát quaû A/D cho maùy tính coù theå thöïc hieän baèng  
chöông trình ñieàu khieån, baèng ngaét hay DMA.  
Caùc böôùc hình thaønh ñeå chuyeån ñoåi A/D vôùi trigger baèng  
phaàn meàm vaø truyeàn keát quaû A/D baèng chöông trình ñieàu khieån:  
- Ñaët taàm vaøo cho moãi keânh A/D.  
- Ñaët keânh vaøo baèng caùch chæ roõ taàm queùt keânh.  
- Kích ñoåi A/D baèng caùch ghi vaøo BASE+0 moät soá baát kyø naøo ñoù.  
- Kieåm tra chuyeån ñoåi ñaõ keát thuùc chöa baèng caùch ñoïc bit  
EOC cuûa thanh ghi traïng thaùi.  
- Ñoïc keát quaû chuyeån ñoåi ôû thanh ghi BASE+ 0 vaø BASE+ 1.  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 124  
- Chuyeån döõ lieäu töø soá nhò phaân thaønh soá nguyeân.  
2- Chuyeån ñoåi D/A  
Ghi vaøo thanh ghi BASE+ 4 vaø BASE+ 5. Khi ghi döõ lieäu cho  
keânh D/A phaûi ghi byte thaáp tröôùc. Byte thaáp naøy ñöôïc giöõ taïm  
thôøi trong moät thanh ghi vaø khoâng ñöôïc xuaát ra. Sau khi ghi xong  
byte cao thì khi ñoù byte cao vaø byte thaáp ñöôïc keát hôïp laïi ñeå  
chuyeån thaønh D/A.  
3- Digital input vaø output (DI&DO)  
Ta ñoïc DI töø thanh ghi BASE+3 (byte thaáp) vaø thanh ghi  
BASE+11 (byte cao). Sau khi ñoïc döõ lieäu seõ khoâng ñöôïc choát,  
ñöôøng vaøo seõ ôû traïng thaùi thöù ba. Ta coù theå xuaát ra DO cuõng  
baèng caùch duøng hai thanh ghi BASE+3 vaø BASE+11 naøy. Thanh  
ghi seõ choát giaù trò ñaõ ghi (coù theå ñoïc laïi). Ñeå an toaøn neân gheùp  
noái caùc ngoõ vaøo/ra digital thoâng qua gheùp quang.  
5.3.2 Laäp trình theo software driver cuûa nhaø saûn xuaát  
Moãi PC_LABCARD coù moät software driver Adsapi32.dll cho  
pheùp chuùng ta coù theå duøng caùc haøm vaø thuû tuïc vieát saün ñeå vieát  
chöông trình öùng duïng baèng ngoân ngöõ caáp cao nhö Delphi, Visual  
Basic, Visual C. Ñieàu naøy giuùp laäp trình moät caùch ñôn giaûn hôn laø  
vieát tröïc tieáp vaøo caùc thanh ghi vì moãi haøm seõ keùo taát caû caùc  
tham soá töø baûng tham soá. Chuùng ta khoâng caàn ñònh laïi baûng  
tham soá moãi khi ta goïi noù, tröø khi baûng tham soá coù söï thay ñoåi.  
Chöông trình caøi ñaët chöùa trong CDROM. Trong chöông trình öùng  
duïng caàn khai baùo söû duïng driver. Driver cuûa haõng Advantech  
vieát coù theå söû duïng chung cho nhieàu loaïi card cuûa haõng vaø vieäc  
ñoïc tìm hieåu caùc haøm ñaõ vieát saün töông ñoái maát nhieàu thôøi gian.  
Muïc 5.3.1 trình baøy moät unit goàm caùc haøm vieát saün cho Delphi.  
Muïc 5.3.4 trình baøy sô löôïc driver adsapi32.  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 125  
5.4 LAÄP TRÌNH CHO CARD PCL-818L  
5.4.1 Unit duøng cho card PCL-818L trong Delphi  
Unit PCL818L;  
Interface  
CONST  
base= $300;  
ñ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);  
Procedure Set_channel AD (start, stop: byte);  
Function Dig_in: word;  
{ }  
4
{ }  
5
{ }  
6
Procedure Dig_out (data: word);  
Procedure Analog_out (data: word);  
Function EOC: byte;  
{ }  
7
{ }  
8
{ }  
9
{ }  
Function MUX: byte;  
10 Function INT: byte;  
{
}
11 Function Next_channel: byte;  
{
}
12 Function INTE: byte;  
{
}
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
13 Function IRQ: byte;  
TRANG 126  
{
}
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);  
}
22 Procedure Set_counter (cnt, mode, dl, dh: byte);  
}
23 Procedure Select_nextchannel (setchan: byte);  
}
24 Function Read_counter (cnt: byte): word;  
}
25 procedure Reload_counter (dl1, dh1, dl2, dh2: byte);  
}
26 procedure Xuat (add:word; data: byte);  
}
27 function Nhap (add:word): byte;  
}
implementation  
Function inport (address: word): byte;  
ham nhap vao Port  
{ }  
var data: word;  
begin  
asm  
mov dx, address  
in ax, dx  
mov data, ax  
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  
{
}
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 127  
var dlow, dhigh: byte;  
begin  
dlo:= inport (reg0);  
dhigh:=inport(regl);  
channel:= dlow and $0F; lay 4 bit thap  
{
}
dlow:= (dlow and $F0) shr 4;  
Read_AD:= dlow + 16*dhigh;  
end;  
2
Procedure Trig_AD;  
kich mem bo A/D  
{ }  
{ }  
begin  
outport (reg0, $FF);  
end;  
3
{ }  
Procedure Set_rangeAD (range: byte);  
dat tam dien ap ngo vao AD  
{
}
var rang: byte;  
begin  
rang:=range and $03;  
outport (reg1, rang);  
end;  
4
Procedure Set_channel AD (start: byte; stop: byte);  
{ }  
begin  
outport (reg2, (stop shl 4) or start);  
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;  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 128  
8
Function EOC: byte;  
{ }  
begin  
EOC:= (inport (reg8) and $80) shr 7;  
end;  
9
Function MUX: byte;  
{ }  
begin  
MUX:= (inport (reg8) and $20) shr 5;  
end;  
10 Function INT: byte;  
{
}
begin  
INT:= (inport (reg8) and $10) shr 4;  
end;  
11 Function Next_channel: byte;  
{
}
begin  
Next_channel:= inport (reg8) and $0F;  
end;  
12 Function INTE: byte;  
{
}
begin  
INTE:= (inport (reg9) and $80) shr 7;  
end;  
13 Function IRQ: byte;  
{
}
begin  
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);  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 129  
end;  
17 Procedure Set_IRQ (irq: byte); {chon ngo ngat}  
{
}
var i: byte;  
begin  
i:= inport (reg9) and $8F;  
outport (reg9, (irq shl 4) or i);  
end;  
18 Procedure Set_DMAE (dmae: byte); {dat xoa DMAE}  
{
}
var i: byte;  
begin  
i:= inport (reg9) and $FB;  
outport (reg9, (dmae shl 2) or i);  
end;  
19 Procedure Set_trigsource (trs: byte);  
{
}
var i: byte;  
begin  
i:= inport (reg9) and $FC;  
outport (reg9, i or trs);  
end;  
20 Procedure Clear_INT;  
{
}
begin  
outport (reg8, $FF);  
end;  
21 Procedure Counter_enb (tc: 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)  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
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));  
dl:= inport (reg12 + cnt);  
dh:=inport (reg12 + cnt);  
Read_counter:= dl + 256*dh;  
end;  
25 Procedure Reload_counter (dl1, dh1, dl2, dh2: byte);  
}
{
var dl, dh: byte;  
begin  
outport (reg15, $D4);  
dl:= inport (reg13);  
dh:= inport (reg13);  
if (dl+dh = 0) then  
begin  
Counter_enb (1); counter 1, mode 2  
{
}
Set_counter (1, 2, dl1, dh1);  
end;  
outport (reg15, $D8);  
dl:= inport (reg14);  
dh:= inport (reg14);  
if (dl+dh = 0) then  
begin  
Counter_enb(2);  
counter 1, mode 2  
{ }  
Set_counter (2,2, dl1, dh1);  
end;  
end;  
26 Procedure Xuat (add: word; data: byte);  
{
}
begin  
outport (add, data);  
end;  
27 Function Nhap (add: word): byte;  
}
{
begin  
nhap:=inport (add);  
Taùc giaû: TS Nguyeãn Ñöùc Thaønh  
Trang 131  
end;  
end.  
5.4.2 Chöông trình C ñoåi töông ñoàng ra soá duøng kích meà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;  
port= 0x300;  
/* Set I/O port base address */  
/********** STEP 1: INITIALIZE & SELECT SOFTWARE TRIGGER *************/  
val= 0x70;  
outportb(port+9, val);  
c_reg = inportb(port+9);  
if (c_reg != val)  
{
/* software trigger */  
printf("PCL-818L hardware verification failed!\n");  
exit(0);  
}
outportb(port+8,1);  
/* Clear interrupt request */  
printf("\n***** Please set PCL-818L's jumper 7 (A/D IN) to 5V *****\n\n");  
/* ******** STEP 2: READ A/D STATUS REGISTER **************************** */  
status = inportb(port+ 8);  
if ((status & 0x20)== 0x20)  
s_end = 1;  
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006  
CHÖÔNG 5: CARD THU THAÄP TÍN HIEÄU VAØ ÑIEÀU KHIEÅN  
TRANG 132  
else  
s_end = 0;  
redo:  
if(s_end==1)  
{
printf("Enter start channel number <0-15>: ");  
scanf("%d",&start);  
printf("Enter stop channel number <0-15>: ");  
scanf("%d",&stop);  
}
else  
{
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ải về để xem bản đầy đủ
pdf 43 trang Thùy Anh 23920 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đo lường và điều khiển bằng máy tính - Chương 5: Card thu thập tín hiệu và điều khiển", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_do_luong_va_dieu_khien_bang_may_tinh_chuong_5_card.pdf