Eenvoudige DDS-signaalgenerator: directe digitale synthese in zijn puurste vorm
Wil je je eigen signaalgenerator bouwen? Volg de instructies en tips voor het bouwen van een krachtige maar eenvoudige signaalgenerator met een AD9851. Modificatie van de module, theorie over de werking en software komen allemaal aan bod.
Analog Devices biedt een reeks geïntegreerde schakelingen met complete DDS-signaalgeneratoren. Deze IC’s kunnen niet op zichzelf werken, maar hebben een laagdoorlaatfilter en een besturing nodig voor initialisatie en het instellen van de gewenste uitgangsfrequentie. Op AliExpress worden voor een uiterst concurrerende prijs complete modules aangeboden met de AD-chip samen met het filter en enkele andere componenten. In de kleine signaalgenerator die hieronder wordt beschreven, wordt een module met de AD9851 gebruikt. Deze module kan een sinusvormig signaal produceren met een frequentie tussen 1 Hz en 70 MHz. Op de chip is een comparator aanwezig die het sinus-uitgangssignaal vergelijkt met een instelbare gelijkspanning en zo een blokgolf produceert met een instelbare duty cycle. Door toevoeging van een kleine microprocessor, een draai-encoder en een display ontstaat een complete signaalgenerator.
Wat zit er onder de motorkap?
Signalen worden gegenereerd met behulp van directe digitale synthese (DDS). Daarbij wordt gebruik gemaakt van een numeriek gestuurde oscillator (NCO) en een opzoektabel (LUT) om een digitale sinus te produceren. Deze wordt in analoge vorm omgezet met een digitaal/analoog-omzetter (DAC). De datasheet van de AD9851 geeft meer gedetailleerde informatie. Figuur 1 toont de module met de AD9851. Om hem in de gekozen behuizing te laten passen, werd de LED verwijderd en een hoek van de module weggesneden. De potentiometer voor het instellen van de DC-ingangsspanning voor de comparator werd ook verwijderd, omdat die niet nodig was: die gelijkspanning wordt gegenereerd door een DAC in de microcontroller die wordt gebruikt om de module aan te sturen.
De AD9851 kan worden aangestuurd in parallelle of seriële modus. Omdat de seriële modus maar vier aansluitingen nodig heeft en de parallelle modus meer dan twee keer zoveel, gebruiken we de seriële modus voor initialisatie en frequentieselectie. De ‘serial load’-signalen, zoals ze in de datasheet worden genoemd, zijn te zien in figuur 2. Het vierde signaal reset de chip om hem te initialiseren. Een microcontroller levert deze signalen via de ingebouwde SPI-periferie. Omdat de frequentie variabel is, wordt een draai-encoder gebruikt waarmee de gebruiker de frequentie kan wijzigen. Er is een klein display toegevoegd om informatie over de momenteel ingestelde frequentie weer te geven. Je moet zich bewust zijn van het feit dat een DDS-signaalgenerator geen zuivere sinussen produceert – het uitgangssignaal bevat meerdere harmonischen van de bemonsteringsfrequentie.
Een blik op het schema
Figuur 3 toont het schema. Omdat slechts een beperkt aantal IO’s nodig is, wordt een Microchip PIC18F04Q41 14-pin-microcontroller gebruikt. Deze bestuurt de DDS-module met vier uitgangen, leest de draai-encoder via drie ingangen in en stuurt het display aan via de I2C-bus, waarvoor nog eens twee uitgangen nodig zijn. De DC-uitgangsspanning wordt gegenereerd op pin 11.
Blijven nog pinnen 1 en 14 over voor de voeding en 12 en 13 voor de programmering. De PIC18F04Q41 kan geprogrammeerd worden met een PICkit 4, PICkit 5, ICD 4, ICD 5 of MPLAB Snap. Eerdere versies van deze tools zijn niet compatibel met deze PIC. De processor wordt geprogrammeerd voordat hij op de print wordt gemonteerd. Het is echter mogelijk om de processor on-board te programmeren door tijdelijk draden aan de processorpennen te solderen en deze na het programmeren weer te verwijderen. De 5V-voedingsspanning wordt geleverd via een USB-connector.
De PIC18F04Q41 behoort tot een nieuwe serie PIC’s. Vooral de seriële I/O-modules voor SPI en I2C zijn verbeterd in vergelijking met oudere chips. Dit is erg nuttig in deze toepassing. De SPI-module heeft nu een gebufferd uitgangsregister, waardoor we het vereiste veertig-bits seriële uitgangssignaal in een enkele continue stroom kunnen produceren. Voor dit seriële signaal wordt een klok van 16 MHz gebruikt, zodat een verandering van de uitgangsfrequentie van de generator minder dan 3 µs duurt. Ook is de I2C-module eenvoudiger in te stellen dan bij de oudere type PIC’s. De momentele frequentie van het gegenereerde signaal wordt weergegeven op een klein OLED-display van 0,91", dat wordt bestuurd via een I2C-bus met een klok van 400 kHz.
Instellingen wijzigen
Als je de draai-encoder indrukt, beweegt een underscore-cursor van links naar rechts en weer terug naar links als hij helemaal rechts staat. Door aan de encoder te draaien, verhoog of verlaag je het getal onder en links van de cursor. Dit is een gemakkelijke manier om snel het totale bereik van 1 Hz tot 70 MHz te doorlopen. Elke verandering van het weergegeven getal veroorzaakt een signaal naar de DDS-module om de uitgangsfrequentie overeenkomstig aan te passen.
Zoals gezegd wordt de gelijkspanning die naar de ingang van de comparator op de module gaat, geproduceerd door een DAC in de microcontroller. Deze spanning kan worden gewijzigd door de schakelaar van de encoder ongeveer twee seconden ingedrukt te houden tot het display een getal van drie cijfers weergeeft. Dan kan de spanning in 256 stapjes worden aangepast door de encoder te verdraaien tot de duty cycle van de blokgolf naar wens is. Als de knop opnieuw gedurende meer dan twee seconden ingedrukt wordt gehouden, keert het display terug naar de frequentieweergave. De waarde van de geselecteerde DC-spanning wordt opgeslagen in de interne EEPROM van de PIC.
Bouw
De schakeling heeft maar een paar componenten nodig. Er is een kleine print ontworpen zodat alles in een kleine Strapubox-behuizing kan worden gemonteerd, met afmetingen 50×50×20 mm. Twee SMA-connectoren dienen als uitgangen. Er was niet voldoende ruimte voor BNC-connectoren. Zoals te zien is in figuren 4a, 4b en 4c, zijn de aansluitpinnen van de encoder 180˚ gebogen zodat ze aan de print gesoldeerd kunnen worden. Dit moet voorzichtig gebeuren, want ze breken gemakkelijk.
Een van de schroeven waarmee de print in de behuizing wordt bevestigd, wordt afgedekt door de DDS-module. Daarom is deze module steekbaar gemaakt. Hier stuiten we op een ruimteprobleem: de behuizing is slechts 20 mm hoog. Met behulp van ultra-low-profile busstrips en dito pinnen kon alles net passend worden gemaakt. De microprocessor is alleen beschikbaar in een SMD-behuizing. De drie condensatoren en de USB-connector zijn ook SMD, wat de layout erg eenvoudig maakte.
Firmware
De firmware is geschreven in assembler en neemt slechts 13% van het programmageheugen van de processor in beslag. Eerst worden de poorten ingesteld en vervolgens worden twee configureerbare logische cellen (CLC’s) ingesteld als flipflops die elke positieve flank detecteren die wordt veroorzaakt wanneer de draai-encoder wordt bediend. Hierna wordt timer2 geconfigureerd om een vertraging van 10 ms in te stellen voor het ontdenderen van de schakelaar, en timer4 om een vertraging van ongeveer 100 ms in te stellen. Deze laatste is nodig na het initialiseren van het OLED-display. Na het instellen van de DAC die de gelijkspanning voor de comparator produceert, wordt de I2C-busmodule geconfigureerd om met het OLED-display te communiceren met een klokfrequentie van 400 kHz, en tenslotte de SPI-module die de DDS-module aanstuurt. Hierna worden het display, de DDS-module en de interrupts geïnitialiseerd.
Alles is volledig interruptgestuurd. Het programmadeel bestaat alleen uit NOP’s. Hier wacht de processor op interrupts. De interruptroutine van de schakelaar verplaatst de cursor naar rechts. Als de schakelaar langer wordt ingedrukt, wordt de uitgangswaarde van de DAC getoond zoals hierboven beschreven. Als de flipflop van de tweede CLC van toestand verandert, zal de tweede interruptroutine worden uitgevoerd. De uitgangsstatus van de CLC geeft aan of de weergegeven frequentiewaarde moet worden verhoogd of verlaagd. Na het weergeven van de nieuwe waarde worden de besturingsbytes voor de DDS-module berekend en verzonden en gaat de processor weer wachten op de volgende interrupt.
Noot van de redactie: Het artikel "Een eenvoudige DDS-signaalgenerator" (230695-01) verschijnt in Elektor mei/juni 2024.
Over de auteur
Willem den Hollander is al sinds zijn 12e gepassioneerd door elektronica. Hij heeft een Master in elektrotechniek en werkte 37 jaar in R&D op het gebied van consumentenelektronica. Zijn favoriete onderwerpen zijn voedingen, digitale schakelingen, programmeerbare logica en microprocessoren. Verschillende van zijn projecten zijn gepubliceerd in Elektor.