Skip to the content
2 layers38.7 × 80 mmPi pico AD9854 adapter, the printed circuit board in 3D

Pi pico AD9854 adapter

mmazzanti/PicoDDS3

A raspberry pico PCB for the AD9854 Analog Devices DDS

Size
38.7 × 80 mm
Copper layers
2
Thickness
1.6 mm
Parts
15
Nets
74
Pads
172
Tracks, vias
156, 21
Pours
1
Routed
Yes
KiCad
KiCad 6 (file 20211014)
Created
9 Apr 2022
Updated
28 Aug 2023

Overview

Pi pico AD9854 adapter is an open-source printed circuit board by mmazzanti, from the mmazzanti/PicoDDS repository on GitHub, published under the GPL-3.0 licence. It is a 2-layer board of 38.7 × 80 mm with 15 parts on 74 nets, routed with 156 tracks and 21 vias.

It is built around the DMG2305UX-13, SMBJ5.0A-TR and TYPE-C-31-M-12. Its parts include 4 connectors, 3 resistors, 3 ICs, 2 capacitors and 1 diode. It belongs with the interfaces and adapters boards and the RP2040 boards of this library.

Main components

3

README

README.md

PicoDDS

A Raspberry Pico PCB board that can interface with the AD9854 (and similar others) DDS chips or evaluation boards through parallel port.

V1.0_beta (future release)

This new version addresses one of the problems in the previous board (see release 0.9), the limit on the LDO current. The new version includes a LT1086 3.3V capable of up to 1.5A. This LDO version however is slightly obsolete, I would suggest to move to a LT1963A for future. At the moment I'm very satisfied with the version 0.9 and even if the LDO is at its limits and getting quite hot the board performs well since production (~ 4 months ago) in our lab.

Please use always the last firwmare code provided, this is independent on the board version and getting updated/fixed from time to time.

Buy Me A Coffee

V0.9

Why ?

This project was inspired by the necessity of having a simple python/serial interface to easily control older DDS evaluation boards (e.g. the Eval-AD9854 here described).

The Eval-AD9854 is an "old" evaluation board for the AD9854 Analog Devices DDS IC. The board permits programming of the AD9854 through a serial or parallel interface.

While the AD9854 is still alive and in production at the time of writing, the word "old" refers to the serial port interface used in the Eval-AD9854 boards.

Even though the provided software is not compatible with current Microsoft windows version the hardest part of programming the evaluation board comes from finding a parallel printer cable, perhaps from some electronics "museum".

If you are wondering what the parallel printer port on the Eval-AD9854 looks like, here it is:

Parallel_printer

Lukily this is not the only interface for programming the evaluation board. A 40 pins IDE port is also available on the board:

40_pins_port

This looks like a perfect match for any Raspberry Pi board! A custom cable from a Raspberry Pi 3/4 to the Eval-9854 board could be made (as I did for the first prototyping), but this will require a cable per each DDS and a lot of soldering. A better idea would be to design a PCB board that interfaces a Raspberry Pi with the DDS evaluation board.

Why the Pico ? Can I use any Raspberry Pi ?

Sure, any microcontroller capable of handling 21 digital pins can do the job. I decided on a Raspberry Pico just because of its price tag and small form factor.

How about powering up the board?

The evaluation board needs a 3.3V power source to operate. This can also be provided by the same Raspberry. BEWARE The Eval-9854 can request up to 1A of current at 3.3V, not all Raspberry pi boards can source that amount of power. When not using the sinc filtering function of the DDS the power consumption goes reduces to ~750mA, when prototyping I used a Raspberry pi 400 and it handled the power hungry DDS quite decently. I would however suggest to power this board externally. The PCB board in this repository takes care also of that. I added a 1A LDO with a screw terminal where one can connect power cables to the Eval-9854; not very elegant, I know,but practical.

How to load the "firmware" on the board ?

Once you are in possession of a PicoDDS board you will have to load on the Raspberry Pico the python source file that you find in the /src folder. The programming of the Pico happens through its micro USB connection. The USB connection on the board is only for powering the Pico and the Eval-9854; it cannot be used to transfer data to the board!!

First load a UF2 micropython image on your board (guide here) then load the /src/main.py script on your board. You can do that using Thonny, VS code or whatever IDE is now in vogue.

PCB_top|400

How to program the AD9854 ?

The AD9854 permits various modes of operation:

  • Single tone mode : in this mode we output a single pre-programmed frequency
  • FSK : In this mode it is possible to switch between two pre-programmed frequencies
  • Ramped FSK : As the previous but with ramping the frequency up/down when switching
  • Chirp : A.k.a. as pulsed FM mode, starting from an initial frequency it ramps up (linearly or not linearly) for the programmed time.
  • BPSK : Select between two pre-programmed phase offsets

More precise description can be found on the AD9854 datasheet.

Why do I need this ?

My tipycal day usage of the AD9854 is to drive some AOM in our laboratory (check out here why we want to do that).

An AOM (Acousto Optic Modulator) is nothing more than a cyrstal vibrating at a certain frequency capable of steering a laser beam and adding-subtracting its resonating frequency to the diffracting beam (read more here ).

The typical resonating frequencies of AOM are between 70-300MHz although the coverage of this bandwith is mostly wavelength dependent.

In my case I needed a signal at 150MHz and I appeared to have found some Eval-AD9854 boards in some "storage" around (what a lucky find :blush: )

Clocking the AD9854

One of the parameters hard coded in the main.py file is the clocking speed. The AD9854 can be clocked at 300MHz max. It has an internal PLL clock multiplier in case only slower clocks are available. The board I've been using so far has a 60MHz oscillator on it, however for more phase-dependent applications I plan to use a 10MHz clock reference from an atomic clock in future. The maximum clock multiplier is 20 that would mean that using directly a 10MHz clock and a x20 multiplier will push my clocking speed to 200MHz. In this case one can use a second DDS to generate a higher frequency clock or a second PLL clock multiplier.

Set the following variables depending on your clocking speed :

  • SYSCLK : Provided clock speed (frequency of whatever you connect to the clock input port). In my case SYSCLK = 60E6.
  • CLKMULT : Clock multiplier value, this will define the maximum frequency that can be generated by the DDS. In my case CLKMULT = 4 --> I'm clocking the DDS at 4*60MHz = 240MHz frequency and the highest output frequency I can get is 120MHz.
  • WR_D_A(0x20, 0x60) : This is defined inside the Init_AD9854() function. If you want to enable sinc filtering, replace it to _WR_D_A (0x20, 0x60) BEWARE : This raises the total power consumption to 1.1A (1A AD9854 + 100mA for the Pico), which is 100mA higher than the on-board LDO's capability. It should be enabled only when the Pico is connected through its micro-usb connection. In this configuration the mossfet will set the micro-usb as power source for the Pico and avoid over-loading the LDO. I will provide soon a V2 of the board with an updated LDO that can output up to 1.5A.

How to use the micropython script

Various functions are available from the source script. These don't cover all the capabilities of the AD9854 but only what I need in the lab. More functions might be added in the future if I need them. Feel free to fork this repository if you want to add more!

After connecting to the Pico the following functions are available from the serial terminal.

  • SingleTone(freq,ampl) : Turns on the AD9854 at the input frequency. freq must be declared in hertz. This corresponds to the single tone mode of the DDS. The amplitude of the signal can be selected with the "ampl" parameter [0-4095].
  • on(freq,ampl) : To be used after initializing the DDS (by calling SingleTone()). Sets the output frequency and amplitude in single tone operational mode.
  • off() : Turns off the DDS output (sets it to the lowest amplitude).
  • UFSK(freq1, freq2, ampl) : Sets the AD9854 in FSK mode, the lowest frequency between freq1 and freq2 will be outputted immediately. To switch between the two frequencies one can use the Switch() function.
  • RUFSK(freq1, freq2, ampl, delta, N) : Switches between freq1 and freq2 going through a linear ramp between the two. This corresponds to the ramped-FSK mode of the DDS. N is the number of steps the counter will need before switching to the next frequency. The switching period is given by (N-1)*system_clock. "delta" is the frequency step incremented each time the counter reaches 0
  • Switch() : Switches between freq1 and freq2.

No, I don't want to order your board!

Then no problem, the board just simplifies the connection. If you don't want to order a board or just test if the DDS works for you or any other reasons you can just connect 20 of the 40 pins connection to your Raspberry Pico (or 3/4) and start using generating RF frequencies immediately!

BEWARE : powering the DDS is now up to you. Find a 3.3V 1A power source (better if 1.5A).

Connect the Pico and the Eval-9854 as following:

  • GP16 -> MRESET
  • GP15 -> OSK
  • GP17 -> PMODE
  • GP14 -> RDB
  • GP18 -> WRB
  • GP13 -> I/O UD
  • GP2 -> FSK (this can be found on the pin W9 on the board)
  • GP19 -> A0
  • GP12 -> A1
  • GP20 -> A2
  • GP11 -> A3
  • GP21 -> A4
  • GP10 -> A5
  • GP22 -> D0
  • GP9 -> D1
  • GP8 -> D2
  • GP7 -> D3
  • GP6 -> D4
  • GP5 -> D5
  • GP4 -> D6
  • GP3 -> D7

Or replace the Pins number in the python source file. A Raspberry pico can be connected using dupont wires as following :

Pico_no_board|400

Notice the black wire going on the pin W9, this is used for the FSK bit.

Performances

Switching time :

Time required to switch off -> on the RF signal. It takes ~6ms from the moment one calls the on(freq,ampl) (T=0 in the picture) to the moment when the AD9854 gives an output. Switching time

Frequency sweep :

This is an example of a frequency sweep :

Frequency sweep

Parts

15
QtyValueFootprintReferences
210uFCapacitor_Tantalum_SMD:CP_EIA-2012-12_Kemet-RC1, C2
25.1kResistor_SMD:R_0805_2012MetricR1, R2
2TestPointTestPoint:TestPoint_THTPad_D2.0mm_Drill1.0mmTP1, TP2
10Resistor_SMD:R_0805_2012MetricR3
1Conn_01x01_MaleConnector_Pin:Pin_D1.0mm_L10.0mmJ3
1Conn_02x20_Odd_EvenConnector_IDC:IDC-Header_2x20_P2.54mm_VerticalJ1
1DMG2305UX-13footprints:DMG2305UX-13U3
1LT1086-3.3LT1086:LT1086U2
1PicoMCU_RaspberryPi_and_Boards:RPi_Pico_SMD_THU1
1SMBJ5.0A-TRSMBJ5-0A-TR:SMBJ5.0A-TRD1
1Screw_Terminal_01x02Connector_Phoenix_MSTB:PhoenixContact_MSTBA_2,5_2-G-5,08_1x02_P5.08mm_HorizontalJ4
1TYPE-C-31-M-12TYPE-C-31-M-12:HRO_TYPE-C-31-M-12J2

Similar boards

  • 4 layers160 × 100.1 mmPMT counter 4 layers, the printed circuit board in 3D

    PMT counter 4 layers

    mmazzanti/PMT-counter

    A PCB board for counting pulses up to 1.5GHz from a PMT (or similar)

    126 parts3GPL-3.0
  • 2 layers51.5 × 48.9 mmESP32 IoT Sensor Controller, the printed circuit board in 3D

    ESP32 IoT Sensor Controller

    ehasunchy/kicad-pcb-projects

    KiCad PCB design portfolio featuring ESP32 IoT hardware, power regulation, USB interfaces, schematics, PCB layouts, and manufacturing files.

    36 parts
  • 4 layers90 × 70 mmInclinationMeter, the printed circuit board in 3D

    InclinationMeter

    soldernerd/InclinationMeter

    A battery-powered, Bluetooth-enabled precision electronic level instrument for machine tool geometry inspection and granite surface plate qualification.

    118 parts
  • 2 layers114 × 102 mmRpi cm4-switch board, the printed circuit board in 3D

    Rpi cm4-switch board

    sequoia-hope/rpi-cm4-switch-board

    A Raspberry Pi (RPi) Compute Module 4 (CM4) Carrier Board with integrated gigabit switch

    94 parts45
  • 2 layers81.8 × 55.4 mmCm4-digipi carrier, the printed circuit board in 3D

    Cm4-digipi carrier

    hemna/cm4-digipi-carrier

    Raspberry Pi CM4 Carrier board for Ham radio PTT Control

    52 parts3
  • 2 layers134.3 × 111.8 mmSDG11 ESP32, the printed circuit board in 3D

    SDG11 ESP32

    GreenStars91/CatBot-PCB_SD-G11

    ESP32 PCB for Senior Design Group 11 - Spring 2025

    67 parts
  • 4 layers139.5 × 70 mmEEZ DIB MCU r3B4, the printed circuit board in 3D

    EEZ DIB MCU r3B4

    intergalaktik/bb3-cm4

    CM4 compatible MCU board

    200 parts35
  • 4 layers153 × 148 mmKeep breathing ctrl, the printed circuit board in 3D

    Keep breathing ctrl

    CV19CO/open_controller_for_ventilator

    Open source controller for ventilators

    226 parts5

Questions

How big is the Pi pico AD9854 adapter PCB?

It measures 38.7 × 80 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Pi pico AD9854 adapter use?

15 parts, built around the DMG2305UX-13, SMBJ5.0A-TR and TYPE-C-31-M-12. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Pi pico AD9854 adapter KiCad files?

From the mmazzanti/PicoDDS repository on GitHub, at the commit this page was made from: the board is PCB/Pi-pico-AD9854_adapter.kicad_pcb and its schematic PCB/Pi-pico-AD9854_adapter.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Pi pico AD9854 adapter design in my own project?

Its repository publishes it under the GPL-3.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).