

Radome dish controller
The Radome CAN protocol is very simple. Send azimuth commands to address 0x1 and elevation commands to address 0x2. Azimuth and elevation reply back from addresses 0x101 and 0x102 respectively.
- Size
- 78 × 70 mm
- Copper layers
- 4
- Thickness
- 1.6 mm
- Parts
- 89
- Nets
- 101
- Pads
- 365
- Tracks, vias
- 541, 444
- Pours
- 16
- Routed
- Yes
- KiCad
- KiCad 7 (file 20221018)
- Created
- 22 Oct 2023
- Updated
- 2 Sep 2025
Overview
Radome dish controller is an open-source printed circuit board by ay2718, from the ay2718/RadomeMotorController repository on GitHub. It is a 4-layer board of 78 × 70 mm with 89 parts on 101 nets, routed with 541 tracks and 444 vias.
It is built around the STM32G431CBU3, SN75176AD and LF2190NTR, with the AS5047D, MAX3051EKA and SIR426DP among its other parts. Its parts include 33 capacitors, 15 resistors, 14 ICs, 9 connectors and 6 transistors. It belongs with the STM32 boards of this library.
Main components
7STM32G431CBU3
UFQFPN-48(7x7)-40℃~+125℃ 1.71V~3.6V 128KB 12bit 12bit 170MHz 32 Bit 32KB 42 ARM Cortex-M4F Built-in FLASH UFQFPN-48(7x7) Microcontrollers (MCU/MPU/SOC) ROHSSTMicroelectronicsMicrocontrollers (MCU/MPU/SOC)SN75176AD
SOIC-80℃~+70℃ 1 1 4.75V~5.25V 5Mbps Transceiver SOIC-8 RS-485 / RS-422 ICs ROHSTexas InstrumentsRS-485/RS-422 ICsLF2190NTR
SOIC-8-40℃~+125℃ 10V~20V 2 20ns 25ns 4.5A 4.5A 75uA Half-Bridge IGBT、MOSFET Under Voltage Protection SOIC-8 Gate Drivers ROHSLittelfuseGate DriversAS5047D
14-Bit On-Axis Magnetic Rotary Position Sensor with 11-Bit Decimal and Binary Incremental Pulse CountOSRAMUncategorisedMAX3051EKA
UncategorisedMaxim Integrated ProductsSIR426DP
PowerPAK-SO-8-55℃~+150℃ 1 N-channel 1.16nF 1.2V 10.5mΩ@10V 26.7W 30A 40V 70pF 9.3nC@10V PowerPAK-SO-8 MOSFETs ROHSVishay IntertechnologyMOSFETs1N4148W
SOD-123150mA 1A 1V@50mA 1uA@75V 400mW 4ns 75V Independent SOD-123 Switching Diodes ROHSSTMicroelectronicsSwitching Diodes
README
README.mdRadome motor controller
CAN protocol
The Radome CAN protocol is very simple. Send azimuth commands to address 0x1 and elevation commands to address 0x2. Azimuth and elevation reply back from addresses 0x101 and 0x102 respectively. Any packet sent to address 0x0 will trigger both azimuth and elevation to reply back with their current status without initiating a motor movement, sending commands will also trigger a reply back.
Even if you feed the CAN total garbage the dish will not exceed safe positions (for elevation), speeds, or acceleration.
The controllers must be updated at least every 100 ms or faster. Othewise they will safely bring the dish to a halt.
The command structure is as follows:
Transmit:
// 2^24 is 360 degrees, position is unsigned
tx byte 0 = position bits 23:16
tx byte 1 = position bits 15:8
tx byte 2 = position bits 7:0
// LSB is 1 arcsecond/s = 1/1200 dps, signed
tx byte 3 = velocity bits 15:8
tx byte 4 = velocity bits 7:0
Receive:
// 2^24 is 360 degrees, position is unsigned
rx byte 0 = position bits 23:16
rx byte 1 = position bits 15:8
rx byte 2 = position bits 7:0
// LSB is 1 arcsecond/s = 1/1200 dps, signed
rx byte 3 = velocity bits 15:8
rx byte 4 = velocity bits 7:0
// LSB is 1 mA, signed
rx byte 5 = current bits 15:8
rx byte 6 = current bits 7:0
// LSB is 0.5V, unsigned
rx byte 7 = bus voltage bits 7:0I recommend casting position as a uint32_t such that 232 is equivalent to 360 degrees. This makes position math very nice since overflow lines up with one rotation.
We feed the dish position and velocity because the velocity information in order to generate very smooth trajectories. If you want to command a position and you don't care much about timing, it's fine to send a position command with zero velocity. If you're tracking a satellite moving a couple degrees per second across the sky on X band, the velocity really helps (empirically we were able to maintain 0.05 degrees of tracking error up to 10 dps or so)
Firmware overview
If you decide to build the firmware, this is an STM32CubeIDE project. You may need to enable floating point support for printf. Define or underine azimuth or elevation in Core/Inc/main.h to set azimuth or elevation. Encoder offsets are hardcoded in.
CAN Bootloader usage
az_bootloader.bin and el_bootloader.bin should already be loaded onto their respective motor drives. The bootloader takes up 2 flash pages on each drive (4 kB)
flash_motor.py is used to upload firmware over CAN bus. The baud rate is 125000 (same as for operating the drives).
Example usage: ./flash_motor.py --id 0x01 -f radome_azimuth.bin. The --idflag selects which drive to write toe (0x01 is azimuth, 0x02 is elevation) and the-for--filename` flag selects the binfile to upload.
If a motor drive is unresponsive to being flashed, try running ./flash_motor.py ..., leave it running, and cycle power to the motor drives. This is useful if there's a problem with the firmware--flash_motor.py sends out pings to each motor's address every 100ms and the drives wait for pings in bootloader mode for 500ms before starting up.
Parts
89| Qty | Value | Footprint | References |
|---|---|---|---|
| 15 | 100nF | Capacitor_SMD:C_0603_1608Metric | C113, C114, C201, C202, C203, C204, C205, C206, C304, C305, C306, C308, C309, C312, C313 |
| 6 | 10uF | Capacitor_SMD:C_2220_5650Metric | C102, C103, C105, C106, C108, C109 |
| 6 | 1uF | Capacitor_SMD:C_0603_1608Metric | C301, C302, C303, C307, C310, C311 |
| 6 | 3 | Resistor_SMD:R_0603_1608Metric | R301, R302, R303, R304, R305, R306 |
| 6 | SIR426DP | Package_SO:PowerPAK_SO-8_Single | Q301, Q302, Q303, Q304, Q305, Q306 |
| 5 | Solder Pad | Connector_Wire:SolderWirePad_1x01_SMD_5x10mm | J101, J102, J103, J104, J105 |
| 4 | 10uF | Capacitor_SMD:C_1206_3216Metric | C107, C110, C111, C112 |
| 3 | 1N4148W | Diode_SMD:D_SOD-123 | D301, D302, D303 |
| 3 | 2m | Resistor_SMD:R_Shunt_Vishay_WSK2512_6332Metric_T2.21mm | R307, R308, R309 |
| 3 | INA181-A2 | Package_TO_SOT_SMD:SOT-23-6 | U304, U305, U306 |
| 3 | LF2190N | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U301, U302, U303 |
| 2 | 1k | Resistor_SMD:R_0603_1608Metric | R310, R311 |
| 2 | 220uF | Capacitor_THT:CP_Radial_D12.5mm_P5.00mm | C101, C104 |
| 2 | Molex Micro-Fit+ | ayeiser_misc:MOLEX_2165711002 | J107, J108 |
| 2 | SN75176AD | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U102, U103 |
| 1 | 1 | Resistor_SMD:R_2512_6332Metric | R101 |
| 1 | 100k | Resistor_SMD:R_0603_1608Metric | R204 |
| 1 | 10k | Resistor_SMD:R_0603_1608Metric | R313 |
| 1 | 10nF | Capacitor_SMD:C_0603_1608Metric | ANACAP201 |
| 1 | 16MHz | Crystal:Resonator_SMD_Murata_CSTxExxV-3Pin_3.0x1.1mm | Y201 |
| 1 | 2.2uH | Inductor_SMD:L_Vishay_IHLP-5050 | L101 |
| 1 | 200k | Resistor_SMD:R_0603_1608Metric | R312 |
| 1 | 600ohm@100MHz | Inductor_SMD:L_0603_1608Metric | FB201 |
| 1 | AS5047D | Package_SO:TSSOP-14_4.4x5mm_P0.65mm | U101 |
| 1 | AZ1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U104 |
| 1 | AZ1117-5.0 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U105 |
| 1 | Conn_02x07_Odd_Even | Connector_PinHeader_1.27mm:PinHeader_2x07_P1.27mm_Vertical_SMD | J201 |
| 1 | K78UXX | ayeiser_misc:K78UXX-RightAngle | U106 |
| 1 | MAX3051 | Package_SO:SO-8_3.9x4.9mm_P1.27mm | U202 |
| 1 | Molex Micro-Fit+ | ayeiser_misc:MOLEX_2068320602 | J106 |
| 1 | NetTie_2 | NetTie:NetTie-2_SMD_Pad2.0mm | NT101 |
| 1 | STM32G431CBU3 | Package_DFN_QFN:QFN-48-1EP_7x7mm_P0.5mm_EP5.3x5.3mm | U201 |
The 85 most common of 89 parts.
Questions
How big is the Radome dish controller PCB?
It measures 78 × 70 mm and has 4 copper layers, 1.6 mm thick.
What parts does the Radome dish controller use?
89 parts, built around the STM32G431CBU3, SN75176AD, LF2190NTR and AS5047D. 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 Radome dish controller KiCad files?
From the ay2718/RadomeMotorController repository on GitHub, at the commit this page was made from: the board is kicad/radome_dish_controller.kicad_pcb and its schematic kicad/drive.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Radome dish controller design in my own project?
Its repository states no licence, so its author keeps all rights: ask ay2718 before reusing the design.
Similar boards
- 2 layers

- 2 layers115.8 × 60.5 mm

- 2 layers40 × 24 mm

- 4 layers100 × 100 mm

MWGEN G1
MR-DOS/MWGEN-G1
12.5 MHz - 6400 MHz (LMX2572) or even up to 20 GHz (LMX2595) generator board with int./ext. reference.
373 parts18GPL-3.0 - 4 layers65.5 × 74.8 mm

- 2 layers40 × 51 mm

- 4 layers80 × 50 mm

MianCtrl H7
Aiyin4Da-2/Main_Ctrl_H7
STM32H723VGT6 MainCtrlBoard Author: Aiyin4DaGLD · Hardware: v1.2 · Updated: 2026-08-21
153 partsMIT - 4 layers50 × 50 mm
