Vorige: Lange tijden timer.   Omhoog: Oscillatoren.   Volgende: Sturingen.
Inhoudsopgave   Index


Gullinbursti II.


Voorstelling.

Even voorstellen: een pulsgenerator, Gullinbursti1 genaamd ― omdat een serie naaldpulsen op de scoop enige gelijkenis vertonen met de borstelharen van een everzwijn:

GullinburstiMedium.jpg

De originele versie was voorzien van een 74LS624, die als spanningsgestuurde klokgenerator (VCO) fungeerde. Dat werkte redelijk goed, maar het instellen van de gewenste frequentie was nogal omslachtig en tijdrovend.
Grotendikken, de microcontroller die verantwoordelijk was voor de besturing, moest telkens een gelijkspanning genereren met behulp van een PWM-uitgang en een laagdoorlaatfilter. Met deze gelijkspanning werd de frequentie van de 74LS624 ingesteld.
Nadeel hierbij was, dat het lineair verband tussen beiden te wensen overliet, zodat Grotendikken telkens de frequentie moest meten, zijn PWM aanpassen, opnieuw meten, enz. tot het beoogde resultaat bekomen werd.

Hierom, en ook omdat het gedrag van de 74LS624 nogal temperatuur-afhankelijk was, werd besloten over te stappen op een DDS.

De schema's.

Het blokschema.

Om de opzet te verduidelijken, een vereenvoudigd blokschema. De belangrijkste onderdelen hebben een naam gekregen, naar aloude Amiga-gewoonte.

BlokSchema.png


Turbokeu, de DDS, een AD9835, produceert een sinus met een nauwkeurig-instelbare frequentie. Die sinus gaat via een laagdoorlaatfilter naar een versterkertrapje. Vandaar gaat het naar een 74HC74. Deze fungeert als tweedeler, en levert een uitgangsfrequentie met een puls/pauze-verhouding van precies 50%.
Dat laatste is nodig, omdat we hiermee Madwizard van een externe klok voorzien.

Een van Madwizard's PWM-uitgangen levert een symmetrische blokspanning, van een tweede PWM-uitgang is de duty-cycle instelbaar. De frequentie van beide uitgangen is gelijk, en kan varieren van 2MHz tot 0.001Hz. Naar buiten toe zijn beide uitgangen beschikbaar als TTL-signaal (5V) en tevens als een variabele spanning, instelbaar met (oh, schande!) een potmeter.
De bovengrens wordt bepaald door de DDS en zijn ingangsfrequentie. Die laatste bedraagt 50MHz, waardoor de DDS nog een bruikbare uitgangsfrequentie van 20MHz kan produceren. Doordat deze uitgangsfrequentie door de 74HC74 wordt gehalveerd, komen we op 10MHz terecht.
Dat betekent nog niet, dat Madwizard een frequentie van 10MHz op zijn PWM-uitgangen kan zetten! Om te beginnen kan die nooit hoger zijn dan de helft van zijn systeem-klok; 5MHz, dus. Maar bij die PWM-frequentie is er van “echte” PWM uiteraard geen sprake; de puls/pauze-verhouding kan enkel 50/50 zijn.
Om die reden maken we een boogje rond Madwizard bij frequenties van 2MHz of meer.

Grotendikken regelt het verkeer op de print. Hij communiceert via een RS232-lijn met de PC, leest het toetsenbord uit, stelt de DDS in, geeft instellingen door aan Madwizard, vertelt Doolittle ―een GAL16V8― welk van zijn ingangen die naar de uitgangen moet doorspelen, en toont daarnaast verschillende gegevens op een LCD.

Omdat Madwizard's klok varieert, is er gekozen voor een ietwat afwijkende vorm van communicatie: Madwizard gedraagt zich ―wat dat betreft― als een schuifregister (de 74HC595 bijvoorbeeld): databit klaarzetten, INT0 activeren, volgend databit klaarzetten, enz... Als alle bits ingeklokt zijn, wordt INT1 even laag gemaakt, zodat Madwizard weet dat alle bits ingelezen zijn.


Een meer gedetailleerd schema.

GullinburstiSchemaDDS.png


Waarom 2 AVR's en een DDS, hoor ik U vragen.

Wel, de ATtiny2313 beschikt over verschillende PWM-kanalen, waarvan zowel de frequentie als de puls/pauze-verhouding instelbaar is. Dat zou al volstaan, om een instelbare uitgangsfrequentie met een variabele pulsbreedte te bekomen.
Maar, de mate waarin deze frequentie kan gewijzigd worden is nogal beperkt - ze wordt bepaald door de systeem-klok van de AVR te delen door een geheel getal: 2, 3, 4, 5, enz...
Daaruit volgt, dat met een systeem-klok van 20MHz wel een PWM-frequentie van 1MHz of 500kHz kan bekomen worden, maar een frequentie als bv. 123456.7Hz is uitgesloten.
Als we nu de de systeem-klok van Madwizard regelbaar maken, en we laten die zakken tot 6172835Hz, dan kan deze AVR die eenvoudig door 50 delen om de gewenste 123456.7Hz te bekomen.

Het produceren van die systeemklok is de taak van Turbokeu (de DDS). Diens uitgangsfrequentie kunnen we ―in heel kleine stapjes― variëren tussen 10MHz en 20MHz, zodat Madwizard ―na deling door twee― aangedreven kan worden met een systeem-klok tussen 5MHz en 10MHz.

Tijdens het wisselen van de DDS-klok zal Grotendikken de reset-pin van Madwizard even laag maken, zodat die niet in de war geraakt. Daarnaast krijgt ook Doolittle het bevel zich even stil te houden. Zo wordt vermeden dat er willekeurige pulsen op de uitgang komen te staan.

Naast de frequentie van zijn PWM-kanalen kan de Madwizard ook de puls-pauze-verhouding wijzigen. Hier doet zich dezelfde beperking voor als bij het instellen van de frequentie: bij hoge frequenties is het instelbereik beperkt. Immers, als de CLK door 4 gedeeld wordt zijn er slechts 3 mogelijkheden: 1/3, 2/2 en 3/1.

De DDS en omringende componenten.

DDS.png


De uitgangsfrequentie van Turbokeu kan ingesteld worden met een 32-bits getal. Bij het berekenen daarvan gaan we uit van een default-systeemfrequentie van 8333kHz. Dit is de uitgangsfrequentie van de 74HC74; de uitgangsfrequentie van Turbokeu is dus het dubbele, zijnde 16666kHz. Dat komt neer op 50MHz/3. Die delen we door de gewenste uitgangs-frequentie. Het resultaat van die deling komt in het ICR1-register van Madwizard te staan. Dit fungeert als topwaarde voor de 16-bits counter - het getal, waardoor Madwizard zijn systeem-klok deelt.
De volgende stap bestaat er in, de ICR1-waarde ―een integer, dus― terug te vermenigvuldigen met de gewenste uitgangsfrequentie. Dat levert de helft van de gewenste DDS-frequentie op. Het getal dat we naar de DDS moeten schrijven, valt zó te berekenen:
DDS-WORD = DDS-frequentie * (((2^32 / 50000000) / 100) * 22)
In de praktijk vermenigvuldigen we de gewenste DDS-frequentie met 171.79869184, tellen daar 0.53 bij, en zetten we het om naar een 32-bits integer.

Alle berekeningen worden door Grotendikken als floating-point uitgevoerd. Met tussendoor omzettingen naar een integer, waar dat nodig is. Als we die 123456.5Hz uit het voorbeeld hierboven willen bekomen, ziet de bewerking er zo uit:

6250000.00 / 123456.7 = 50.62503695627697808
ICR1 = 50
50 * 123456.7 = 6172835
6172835 * 171.79869184 = 1060484977.9441664
1060484977.9441664 + 0.5 = 1060484978.4441664
DDS-WORD = 1060484978

Nog een woordje over P1: hoewel de ingang van een 74HCxx-IC ongeveer rond de halve voedingsspanning schakelt, is toch een mogelijkheid voorzien om afwijkingen bij te regelen door middel van P1. Hiermee wordt het ook mogelijk, een 74HCT74 als tweedeler te gebruiken.

De uitgangstrap.

UitgangsTrap.png


Er zijn 4 uitgangen beschikbaar:
Een uitgang met variabele amplitude en puls/pauze-verhouding van 50%.
Een TTL- uitgang met een puls/pauze-verhouding van 50%.
Een uitgang met variabele amplitude en instelbare puls/pauze-verhouding.
Een TTL- uitgang met instelbare puls/pauze-verhouding.

Het voedingsgedeelte.

Op de print is geen plaats voorzien voor de voedingstrafo's, gelijkrichters en buffer-elco's. Daarvoor ontbreekt de plaats, maar daarnaast is er zo'n verscheidenheid in de pin-layout van verschillende (merken) printtrafo's, dat het helemaal geen zin heeft er een algemeen-bruikbare print-layout voor te ontwerpen.

GBVoeding.png


Tr1 levert stroom voor de logica en voor de negatieve hulpspanning van de uitgangstrap. Hier kunnen desgewenst twee afzonderlijke trafo's ingezet worden.
Tr2 levert stroom voor de variabele spanning van de uitgangstrap. IC53 moet flink gekoeld worden, maar ook de andere spanningsregelaars kunnen een beetje koeling gebruiken. Daartoe kan een aluminium plaatje van 5cm hoog en 1mm dik geplooid worden, zoals op de print-layout te zien is. De drie regelaars moeten wel geïsoleerd op dit koelplaatje bevestigd worden.
Zorg er ook voor, dat het koelplaatje geen kortsluiting veroorzaakt tussen GND en de uitgang van de 7805 (IC51). Die uitgang loopt immers onder het koelplaatje door.

D55, D56 en D61 zijn toegevoegd om de schade te beperken als de voeding fout op de print wordt aangesloten. Wie gezegend is met een overschot aan zelfvertrouwen kan ze weglaten...

C55, C56 en C58 zijn locale buffer-elco's. Als de afstand tussen trafo/gelijkrichter/buffer-elco en hoofdprint relatief groot is (> 10cm) kunnen ze best een maatje groter genomen worden. De spanningsregelaars zullen dat in dank afnemen.

De firmware.

De broncode voor de firmware is verdeeld over veschillende bestanden.

Madwizard.

Madwizard.c

Voor Madwizard is een hex-bestand beschikbaar.

Grotendikken

Main.h
Main.c
DDS.c
LCD.c
SHIFT.c
Routines.c
UART.c
Version.c

Ook voor Grotendikken is een hex-bestand beschikbaar.

Doolittle.

De GAL16V8-broncode

De bediening.

Met het toetsenbord.

Waartoe de cijfertoetsen dienen, zal wel duidelijk zijn. Daarmee kan de gebruiker een bepaalde waarde intikken. Dat kan de frequentie zijn, maar ook de pulsbreedte (in percent) of een waarde voor een andere functie.
Ook de ↵ toets behoeft geen uitleg.
Met de mode-toets worden verschillende modes doorlopen:

Frequentie-mode.

Hiermee kan de uitgangsfrequentie ingesteld worden tot op 0.001Hz nauwkeurig voor de lagere frequenties.
Bij hogere frequenties wordt de resolutie kleiner, maar ze blijft groter dan 1Hz over het ganse bereik.
Bij erg lage frequenties kan zich een raar verschijnsel voordoen: bij het opgeven van bv. 0.005Hz lijkt het alsof Gullinbursti niet reageert. Geen paniek, daar is een reden voor: de DDS-frequentie is dan gedaald tot een 300kHz, en de communicatie met Madwizard moet gelijke tred houden met diens systeem-frequentie.

Naast de cijfertoetsen is er ook een UP- en een DOWN-toets voorzien. Daarmee wordt de DDS-frequentie telkens met 1Hz verhoogd of verlaagt. Of ―beter gezegd― de uitgangsfrequentie van tweedeler IC2, hetgeen betekent dat de DDS stapjes van 2Hz moet nemen.
Grotendikken berekent bij elke UP- of DOWN-actie opnieuw de uitgangsfrequentie, en toont deze op het scherm. Dat betekent geenszins, dat de gebruiker daar iets van merkt! Bij lagere uitgangsfrequenties is de verandering immers kleiner dan 0.001Hz. Het komt er dan op aan, de UP- of DOWN-toets ingedrukt te houden. Het aanpassen van de frequentie gaat dan sneller en sneller.

Pulsbreedte-mode.

De pulsbreedte wordt voorgesteld als de verhouding tussen een puls en een pause; in percent, dus. Dat kan 1% zijn, maar ook 0.01% of 99.9%.
De hoogst-haalbare resolutie hangt af van de uitgangsfrequentie. Bij frequenties, lager dan 80kHz, bedraagt de resolutie 1/100 of meer. Bij hogere frequenties daalt de resolutie - bij frequenties boven 2MHz valt de pulsbreedte niet meer in te stellen.

Uiteraard kan men bij hogere frequenties nog steeds 0.01% opgeven; Gullinbursti doet zijn best om dat zoveel mogelijk te benaderen.

Sweep-mode.

Zolang we de mode-toets kortstondig indrukken, wisselt de mode tussen “Frequentie” en “Pulsbreedte”. Dat zijn immers de meest-gebruikte modes.
Pas als we in Pulsbreedte-mode zijn, én we houden de mode-toets langer dan 1.5 seconden ingedrukt, komen we in de sweep-mode terecht.

Deze mode laat toe, Gullinbursti doorheen een bepaald frequentiegebied te laten sweepen.
Het werkt, maar verkeert nog in een experimenteel stadium.

Via een RS232-verbinding.

Het is mogelijk, met Gullinbursti te communiceren over een RS232-lijn aan 38400bd (8N1). Dat levert meer mogelijkheden op dan het toetsenbord.
Naast de gebruikelijke zaken (frequentie, puls/pauze-verhouding, enz.) kunnen ook verschillende registers rechtstreeks ingesteld worden:


Het DDS-woord
ICR1 van Madwizard (Madwizard_maxcount)
OCR1B van Madwizard (Madwizard_ocr1b)
De prescaler van Madwizard (Madwizard_prescaler)

Daarnaast kan men ook de DDS-frequentie rechtstreeks opgeven. Hierbij, en bij het instellen van het DDS-woord, is het oppassen geblazen! Wijzigt met de bestaande instellingen te sterk, dan bestaat de mogelijkheid dat Madwizard zich verslikt. Het is immers diens systeemklok die dan grote sprongen maakt!

Wie alle commando's wil kennen, drukt op [ENTER]. Gullinbursti zal ze dan tonen.
De regel is, dat een letter, gevolgd door een gelijk-teken (“f=” bv.) een vraag naar de huidige instelling is, terwijl men deze instelling wijzigd door er een getal bij te voegen, bv. “f=1234.56”.



De hardware.

De print-layout.

De komponent-zijde.

GullinburstiDDSF.png


In pdf-formaat


Het DDS-gedeelte in detail

DDSF.png


Het moeilijkste soldeerwerk wordt gevormd door de DDS zelf. Daarbij kan deze vergroting wellicht hulp bieden.

AD9835.jpg


Een loep kan ook handig zijn voor zo'n klein ding!

Rondom de DDS zijn enkele soldeereilandjes te zien, waarvan het doel niet meteen duidelijk is. Daar ligt de volgende gedachtengang achter:
Als een IC stuk gaat, haal je die gewoon uit zijn voetje, en je vervangt hem. Als echter de DDS stuk gaat, zit je met een probleem. Wie over een SMD-reworkstation beschikt, zal met het verwijderen wellicht niet al te veel moeite hebben. Maar wie enkel over een soldeerbout en een tinzuiger beschikt, loopt kans dat er bij het verwijderen van de DDS enkele van die miniscule printspoortjes sneuvelen.
Dat is vervelend, maar een ramp is het niet. Er kan immers een nieuw printje gemaakt worden, dat er uitziet als de vergroting hierboven. En nu wordt het doel van die eilandjes meteen duidelijk: ze laten toe, dat het nieuwe printje op eenvoudige wijze met de hoofdprint verbonden kan worden.

Deze aanpak maakt het ook mogelijk, een opsteekprintje te maken voor een ander type DDS. De signaal- en de voedings-eilandjes (Vcc, GND, GND, IN, UIT, FSYNC, SDATA en SCLK) zijn aangeduid op het silk-screen.


De soldeer-zijde.

GullinburstiDDSB.png


In pdf-formaat


Het silk-screen.

GullinburstiDDS_silk.png

Hier hoort een woordje uitleg bij: C8 en C9 worden onder het IC-voetje van IC6 geplaatst om ruimte te besparen. Men kan uiteraard ook twee SMD-condensatortjes aan de soldeerzijde plaatsen.


In pdf-formaat


De componentenlijst.

Halfgeleiders.
IC1   AD9835
IC2   74HC74
IC3   ATtiny2313
IC4   74HC14
IC5   GAL16V8
IC6   ATmega32
IC7   MAX232
IC8   50MHz-oscillator
IC51   7805
IC52   7905
IC53   LM317
T1   BC547
T2   BC557
T3   BF494
T41, T44   BS170
T42, T45   2N2219A
T43, T46   2N2905A
D1   BAT85
D41, D42   1N4148
D51 ... D61   1N4007

Allerlei onderdelen.
LCD-module 4 regels x 20 karakters
Trafo 2 x 9V, 4VA (Tr1)
Trafo 1 x 24V, 10VA (Tr2)
Een netschakelaar
Een Euro-chassisdeel (male) + zekering
Koelvinnetjes voor T42 en T45 
4 BNC-connectors, female 
9-polige female sub-D connector voor RS232
16 (miniatuur) druktoetsen
10-polige header voor LCD-aansluiting
Twee 5-polige headers voor ISP
Een (metalen) behuizing
  Passieve componenten.
R1, R2, R11, R12, R13   weerstand 10k
R3, R4, R5, R8, R9, R10   weerstand 470R
R6, R7, R25, R50   weerstand 220R
R21   SMD-weerstand 3k9
R22   weerstand 330R
R23   weerstand 47k
R24   weerstand 1k
R26   weerstand 220k
R27   weerstand 3k9
R41, R46, R43, R48   weerstand 220R 1W
R42, R47   weerstand 2k2
R44, R45, R49, R50   weerstand 100R 1W
P1   instel-potmeter 25k
P2   instel-potmeter 100k
P50   potmeter 5k
C1, C2, C28, C34   condensator 100nF
C3   elco 10μF 16V
C4, C5, C6, C7   elco 1μF 16V
C8, C9   condensator 15pF
C10   condensator 470nF
C21   SMD-condensator 10nF
C22, C25, C26   SMD-condensator 100nF
C23, C24, C27, C52, C52   tantaal-elco 10μF 16V
C29, C30, C31, C32   condensator 100pF
C33   condensator 220nF
C51   elco 2200μF 16V
C51   elco 1000μF 16V
C55, C56   elco 220μF 16V
C57   elco 1000μF 40V
C58   elco 220μF 40V
C59, C60   elco 10μF 40V
L1, L2   spoel 22μH
L3, L4, L5   spoel 2.2μH
Xtal1   kristal 16MHz

Nabij de aansluiting voor de LCD-module is “Rx” terug te vinden. Deze weerstand is enkel nodig, als de LCD-module niet over een serieweerstand voor de achtergrond-verlichting beschikt.
Als dat wel zo is, kan hier een draadbrug geplaatst worden.

Verder is er bij elk IC plaats voorzien voor een ontkoppelcondensator van 100n (3 stuks bij IC6). Die staan niet allenaal op het schema vermeld.

De originele print.

GullinburstiPrintMedium.jpg

Het toetsenbord.

Het toetsenbord bestaat uit 16 toetsen, opgesteld in een matrix van 4 rijen (uitgangen) x 4 kolommen (ingangen). Het afscannen van het toetsenbord gebeurt op traditionele wijze: Grotendikken maakt één voor één de lijnen laag, en gaat vervolgens na of één van de kolom-ingangen daarop reageert. Is dat zo, dan bepaalt de combinatie van rij-nummer en kolom-nummer welke toets is ingedrukt.

GBToetsen.png GBToetsLayout.png GBTBedrading.png


De layout hierboven is ontworpen voor miniatuur-druktoetsen. Merk op, dat er bij de twee middenste kolommen nog draadbruggen gelegd moeten worden, aangegeven met een blauwe lijn.

MiniDruktoets1.jpg MiniDruktoets2.jpg

Zowel trough-hole als SMD-varianten kunnen gebruikt worden.

Ook een pdf-versie van de layout mag niet ontbreken.


De opbouw.
FrontplaatDoorsnede.png
Meer details over de opbouw zijn te vinden bij het Pulsteller-project.




Voetnoot

...Gullinbursti 1
Goudborstel, Frey's vervoermiddel
...2 2
Vermenigvuldigen met 2 om de tweedeling door de 74HC74 te compenseren
...0.5 3
Om afrondingsfouten tot een minimum te beperken



Vorige: Lange tijden timer.   Omhoog: Oscillatoren.   Volgende: Sturingen.
Inhoudsopgave   Index

Pros Robaer - 2014