Dr.Godfried-Willem RAES
Kursus Experimentele Muziek: Boekdeel 2: Live Electronics for composers and musicians
Hogeschool Gent - Departement Muziek en Drama
Voor de besturing van professionele lichtorgels worden de lichtdimmers voor elke kring gestuurd met een regelspanning in het bereik 0 tot +10Volt. Normaal gezien worden deze regelspanningen geleverd door de besturingsmodule van het lichtorgel. Voor vele muziekteatertoepassingen kan het nuttig zijn de regelspanningen en hun veranderingen in de tijd door een komputer te laten opwekken.
Een volstrekt identisch probleem stelt zich wanneer we een komputer zouden willen gebruiken om een analoge spanningsgestuurde synthesizer mee te kontroleren. Ook dit type synthesizer maakt veelal gebruikt van stuurspanningen in het bereik 0- +10V (1Volt per oktaaf). Veronderstellend dat we liefst geen ingrepen in de komputer zelf willen uitvoeren en dat we ons er liefst zouden toe beperken te volstaan met de op elke komputer -inklusief laptops- voorhanden zijnde I/O aansluitingen, dan ligt het gebruik van de parallelle printerpoort uiteraard voor de hand. Naast de 8 databits, biedt deze poort ons nog 4 extra bits (op het basisadres, dat we hier voor de eenvoud bepaalden op &H378, + 2) die als output bruikbaar kunnen zijn:
OUTPUT-BITMAP:
Databits: &H378:0 DB25-pin: 2
&H378:1 3
&H378:2 4
&H378:3 5
&H378:4 6
&H378:5 7
&H378:6 8
&H378:7 9
Extra-bits: &H37A:0 DB25-pin: 1
&H37A:1 14
&H37A:2 16
&H378:3 17
DB25-pinnen 18-15=ground
Let op de nummering van DB25 konnektoren:
1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 18 19 20 21 22 23 24 25 [26]
Deze nummering geeft bij gebruik van printkonnektoren met normale 26-pin headers vaak aanleiding tot verwarring, omdat deze meestal genummerd worden als:
1 3 5 7 9 11 13 15 17 19 21 23 25
2 4 6 8 10 12 14 16 18 20 22 24 26
Zoals we elders reeds betoogden (bvb. in de tekst over het Midi-interface) worden in het printerinterface sommige bits geinverteerd, een feit waarmee we bij het programmeren uiteraard terdege rekening zullen moeten houden.
Stel dat we nu van deze poort gebruik willen maken voor het ontwerpen en bouwen van een DAC die ons digitaal instelbare analoge spanningen ter beschikking moet stellen, dan blijkt uit de ter beschikking staande mogelijkheden dat we hooguit 8 verschillende konverters zullen kunnen adresseren. Immers bit &H37A:0 dienen we te gebruiken als Strobe signaal, zoals voorzien in de Centronics standaard. De overige bits, &H37A:1,&H37A:2,&H37A:3 laten de vorming van maximaal 8 verschillende adressen toe. Wanneer we onze resolutie zouden beperken tot 7-bits (het Midi-bereik), zouden we bovendien nog één databit (in dit geval &H378:0, namelijk het LSB van de data-lijnen) kunnen opofferen, waardoor we onze konverter eenvoudig tot 16 kanalen zouden kunnen uitbreiden...
Enig opzoekwerk in de katalogi van de chipsfabrikanten zal ons gauw op het spoor brengen van de chip AD7228 van Analog Devices. In deze chip zitten immers zonder meer zowat alle funkties die we voor ons ontwerp nodig hebben: 8 8bit DAC's in één enkele verpakking! De fabrikant garandeert ons dat de chip ook unipolair te gebruiken is met een enkelvoudige voedingsspanning (+15V). Bij bestelling en afname in kleine aantallen is deze chip betrekkelijk duur (ca.2.500fr, 1995), maar wanneer we het alternatief -namelijk de toepassing van 'goedkope' enkelvoudige 8-bit DAC's kwa kostprijs narekenen (die kosten 200 a 400 fr/stuk), en we bovendien rekening houden met de extra grote print die we dan nodig hebben, dan blijkt een en ander toch nog redelijk mee te vallen.
DAC-chips geven op hun analoge uitgangen een spanning die steeds een zoveelste deel van een referentiespanning is als ingesteld werd via de aangeboden data. Dus, wanneer de referentiespanning op 10Volt wordt vastgelegd en wanneer via de data-ingang het getal 128 wordt uitgestuurd, dan is de analoge uitgangsspanning 10V * (128/256), of 5Volt. Is slechts het bit &H378:0 hoog, dan is de uitgangsspanning 10V *(1/256), of 39mV. Hiermee is tevens het kleinste instelbaar stapje vastgelegd en daarmee ook het oplossend vermogen.
Het ontwerpen van de uiteindelijke schakeling bestaat nu uit weinig meer dan uit het in een printontwerpje vastleggen van de juiste verbindingen tussen de printerpoort konnektor (DB25) en de AD7228.
Eens de nodige voedingsspanningen aangesloten (+5V voor de pull-up weerstanden op de poort, de referentiespanning van 10V die we bij voorkeur uit een chip-spanningsreferentie kunnen betrekken, en de +15V voor de stroomvoorziening van de AD7228 zelf - te halen uit een standaard 7815 regulator, is de zaak in principe rond. We zeggen in principe want te bezien valt nog of de analoge uitgangsspanningen die de konverter ons nu achtvoudig ter beschikking stelt voldoende onafhankelijk zijn van de aan te sluiten belasting... In het data-sheet van de chip staat immers duidelijk vermeld dat de uitgangen geen lagere belastingsweerstanden mogen zien dan 2kiloOhm en dat ook de op de uitgangen aangesloten kapaciteit de 500pF beslist niet mag overschrijden. Heel konkreet betekent dit bvb. dat we niet ongestraft lange kabels zullen mogen gebruiken: de kapaciteit ervan zou wel eens deze 500pF kunnen te boven gaan. Evenmin kunnen we bvb. halogeenlampen rechtstreeks op onze arme uitgangen loslaten: een 12V halogeenlamp van bvb. 100W heeft een brandweerstand van minder dan 1.4 Ohm, terwijl de weerstand in koude toestand nog heel wat lager ligt. De door ons chipje te leveren stroom dient te worden beperkt tot 10V / 2000 Ohm = 5 mA! Het zal duidelijk zijn dat in vele gevallen een buffering van de uitgang noodzakelijk kan blijken. In geval we onze schakeling voor de sturing van analoge synths willen gebruiken echter, dan volstaat de chip ruimschoots, mits we geen al te lange kabels gebruiken. Patchcords zijn echter zelden langer dan ca.1.5m, wat geen problemen oplevert.
Voor gebruik in kombinatie met professionele lichtdimmerschakelingen zal een eenvoudige buffering met enkele kortsluitvaste en stabiele op-amps volstaan. Bij een geringe afstand tussen de chip en de lichtdimmers zelf, kan ook dit overbodig blijken. Wanneer we echter spots rechtstreeks willen gaan regelen, die dienen we niet alleen te bufferen, maar ook nog te denken aan de veiligheid van een en ander. Immers, lichtdimmerschakelingen maken gebruik van Triacs die rechtstreeks met het stroomnet verbonden zijn. Voor dergelijke toepassingen worden dan ook optische koppelingen (opto-couplers, bvb. TIL111 of, de triac-optocoupler MCP3041 of MOC3041) gebruikt waardoor elk galvanisch kontakt tussen de netspanning en de komputerperiferie vermeden kan worden.
De ingangsfotodiode van zo'n optocoupler vraagt voor volledige uitsturing een stroom van -varierend al naar gelang het type- 1 tot 30mA, zodat er wel direkt aanstuurbare types te vinden zijn. Het probleem zal echter veelal zijn dat de optocoupler-ingang uit een diode bestaat en dus gekenmerkt wordt door een vaste spanningsval (ca.1V tot 1.4V). Hierdoor zou een zuivere stroomsturing eigenlijk meer aangewezen zijn dan een spanningssturing. Nochtans is het niet zo moeilijk om de fotodiodes een positieve voorspanning mee te geven ter grootte van hun spanningsval, waarbij dan de DAC uitgangsspanning kan worden opgeteld. Hiervoor kan een gewone op-amp schakeling worden toegepast.
Wil je dergelijke moeilijkheden uit de weg gaan, of heb je eigenlijk behoefte aan een galvanisch gescheiden 'VCR' (spanningsgestuurde weerstand) dan kan je steeds de kombinatie van een LED of een lampje met een LDR toepassen. Dergelijke kombinatie werkt prima in kombinatie met de tegenwoordig koerant (Philips) op de markt verkrijgbare schakelende netvoedingen en regelaars voor 12Volt halogeenverlichting tot 100Watt.
Op de volgende paginas staan enkele praktische schemas ter overweging en illustratie:
Het eerste schema omvat de eigenlijke 8-kanaals DAC schakeling, die werkelijk de eenvoud zelf is. Voor de pull-up weerstanden gebruik je best een SIL-reeks bestaande uit 9 10kOhm weerstandjes. Als konnektor is een DIL 26-pin mannelijke konnektor voor printmontage aangewezen. Wanneer je flatcable met 25 aders gebruikt, kan je in geen tijd de noodzakelijke centronics verbindingskabel maken met een DB25 knijpkonnektor aan de ene kant en een 26pins DIL header aan de andere kant. Let wel op de juiste plaatsing van pin 1. Gebruik liefst soepel regenboogdraad en kies de bruine kleur voor pin1.
De AD7228-chip (ESD-sensitive, en dus met omzichtigheid te behandelen) plaats je in een voetje, want hij is niet bepaald heel goedkoop... Voor het overige vinden we op de print (2e schema) een 7815 en een 7805 regulator, een brugcel ofwel vier afzonderlijke diodes (1N4002 bvb.) met de gebruikelijke afvlakkondensator evenals de voedingstransformator, waarvoor naast een model voor printmontage, eventueel ook een adapter met aangegoten stekker kan worden gebruikt. Voor de 10Volt referentiespanning maakten we gebruik van een precisie spanningsreferentie van Analog Devices, maar volstaat een goedkopere maar nog steeds redelijk stabiele oplossing, dan kan je ook beroep doen op hetzij een weerstandsdeler, hetzij een kleine schakeling met een weerstand (2k2 bvb.) en een zenerdiode van 10Volt.
Schetsmatig gaven we ook de aan te brengen veranderingen aan voor wie liever een 16-kanaals 7-bit DAC wilde gaan bouwen. De dekodering van het adres maakt gebruik van een enkele 74HCT00 NAND-chip, waarbij twee NAND funkties gewoon als inverter worden gebruikt.Hoe de dekoder werkt volgt uit volgende waarheidstabel:
D0 -STR STR -WR2 -D0 STR -WR1
NOT NAND NOT NOT NAND
0 0 1 1 1 1 0
0 1 0 1 1 0 1
1 0 1 0 0 1 1
1 1 0 1 0 0 1
-WR2 wordt dus 0 dan en dan alleen als D0=1 en -STR=0
-WR1 wordt dus 0 dan en dan alleen als D0=0 en -STR=0
Merk op dat in dit geval de niet gebruikte ingangspin voor bit D0 van de digitale ingang (pin 20 vban de beide DAC chips) aan massa moet worden gelegd! De 10V referentiespanning evenals uiteraard de voedingsspanning zijn gemeenschappelijk voor beide chips. Wel moet je de transformator iets zwaarder dimensioneren: 16V/250mA volstaat ruimschoots.
Hierbij geven we tot slot nog enkele ideeen weer, voor aansluitingen van de analoge uitgangen op diverse stuurschakelingen voor licht, motoren e.d.m.
Buffers:
Sturing van netspanningsgevoede schakelingen via een optocoupler en een triac vermogensregelaar:
Zo kan het ook:
De software voor deze DAC hardware is eenvoudig te schrijven. De gang van zaken is steeds alsvolgt:
1.- schrijf de gewenste data voor te gewenste spanning naar de databus:
OUT &H378, databyte
Voor de 16-kanaalsschakeling, dient bit 0 0 te zijn wanneer de data bestemd zijn voor de eerste chip en dus de DAC-kanalen 0-7 en 1 wanneer ze bestemd zijn voor de kanalen 8-15.
2.- vorm het gewenste adres door het selekteren van de bits D1,D2 en D3 en houdt rekening met gebeurlijke inversies in de hardware. Maak D0 laag en stuur uit:
OUT &H37A, adresbyte OR 1
3.- maak de strobe hoog:
OUT &H37A, adresbyte
Pas met het terug hoog worden van het strobe signaal op bit 0, worden de data doorgeven naar de interne latch van de DAC en wordt de konversie uitgevoerd voor het geadresseerde kanaal.
De tijd dat het strobe-signaal laag moet blijven, moet minstens 1 microsekonde bedragen. In uitzonderlijke gevallen -op supersnelle PC's die het niet te nauw nemen met de snelheden van de ISA-bus- kan deze tijd te kort blijken. Een eenvoudige 'NOP' instruktie tussen stappen 2 en 3 lost dit gemakkelijk op. (bvb. Tijd$=" ").
Wie de 16-kanaals print opbouwt zal merken dat de geselekteerde kanalen niet overeenstemmen met de lay-out en nummering op de print. Dit komt omdat bepaalde adresbits in het printerinterface omgekeerd worden.
Wanneer de adressen uitgestuurd worden als 0-16 krijgen we volgende volgorde te zien:
omkering D2 omkering D1,D3
oneven data-byte (DAC2) 11 binair: 1011 1111 = 15 0001 = 1
9 1001 1101 = 13 0011 = 3
15 1111 1011 = 11 0101 = 5
13 1101 1001 = 9 0111 = 7
3 0011 0111 = 7 1101 = 13
1 0001 0101 = 5 1111 = 15
7 0111 0011 = 3 1001 = 9
5 0101 0001 = 1 1011 = 11
even data-byte (DAC1) 10 1010 1110 = 14 0100 = 4
8 1000 1100 = 12 0110 = 6
14 1110 1010 = 10 0000 = 0
12 1100 1000 = 8 0010 = 2
2 0010 0110 = 6 1100 = 12
0 0000 0100 = 4 1110 = 14
6 0110 0010 = 2 1000 = 8
4 0100 0000 = 0 1010 = 10
Uit de analyze van het low nibble binair geschreven (2e kolom), blijkt duidelijk dat een en ander te wijten is aan de omkering van bits D2. Willen we de volgorde in onze software doen overeenstemmen met de aansluitvolgorde op de print, dan moeten we dit bit in onze uitstuurprocedure inverteren. Dat na invertering van D2 een en ander weer klopt blijkt uit de derde kolom. Dat dit, mits toevoeging van een inverter in de D2-lijn, ook in hardware voor elkaar kan worden gebracht, zal intussen wel duidelijk zijn.
Dat de omkering dan D1 en D3 niet tot het gezochte rezultaat aanleiding geeft, maakten we duidelijk door toevoeging van de vierde kolom, waarbij deze bits werden geinverteerd.
Testprogramma voor de 16-kanaals DAC-print:
DEFINT A-Z
INIT:
CLS
LOCATE 5, 10: PRINT "Information request :";
LOCATE 6, 10: PRINT " CGA+LPT1 port cards use &H378 ";
LOCATE 7, 10: PRINT " Hercules + LPT cards &H3BC ";
LOCATE 8, 10: PRINT " LPT2-data adres &H278 ";
LOCATE 9, 10: PRINT " Logos modified lpt card &H330 ";
LOCATE 10, 10: INPUT " Base I/O adres for data-transport ?", Dp
IF (Dp < &H100) OR (Dp > &HFFF) THEN GOTO INIT
Sp = Dp + 2: ' adres of strobe-bit port
SH = INP(Sp): ' rusttoestand strobe=high
' ' na reset is op de T1000 SH=108 =&B01101100=&H6C
' Bit 4 moet naar 0 (d.i. IRQ-enable)
' Bits 1,2,3 selekteren het DAC=adres
' Bit 0 is het strobe bit (negatief waar)
' DAC 1 is selected if databyte is EVEN ' DAC 2 is selected if databyte is ODD
' Zaagtandgolf test: (ca.200Hz max. op XT- 4.7MHz)
CLS
LOCATE 5, 10 :PRINT " Single Channel Sawtooth-wave test ";
LOCATE 15, 10
PRINT "Logotronics - 16 Channel 7-bit DAC hardware test program 1995"
LOCATE 16, 10:PRINT " Channel selection: use + key * = Quit";
Channel = -1
DO
Channel = (Channel + 1) MOD 16
LOCATE 20, 10
PRINT "Channel used = "; Channel XOR 4; " ";
'XOR 4 inverts bit D2 zodat de telvolgorde overeenkomt met de nummering op de print
LSB = Channel MOD 2: ' 0 of 1 (DAC-selector)
Adr = (Channel \ 2) * 2: ' 0,2,4,6,8,10,12,14
' genereer de zaagtandgolf:
DO
FOR byte = 0 TO 255 STEP 2
OUT Dp, byte OR LSB: OUT Sp, Adr
OUT Sp, Adr OR 1: OUT Sp, Adr
NEXT byte
LOOP UNTIL INKEY$ = "+"
LOOP UNTIL INKEY$ = "*"
' reset de initiele toestand van het printer-interface:
OUT Dp, &HFF : OUT Sp, SH
Terug naar inhoudstafel kursus: Index Kursus
Naar homepage dr.Godfried-Willem Raes