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 đủ
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:
bai_giang_do_luong_va_dieu_khien_bang_may_tinh_chuong_5_card.pdf

