main
noah amfm-receiver-molecule: KiCad project, fab files, 3D and README (1/7) 5441b7c 1d ago

AM/FM Receiver Molecule

A USB-powered AM/FM broadcast receiver on an Adom Molecule: the radio is discrete transistors and op-amps, and an STM32G0B1 tunes it, calibrates it, and streams the audio to a PC over the same USB-C cable that powers it and updates its firmware.

Loads on click. Unloads only if this page sits in the background.

Status

Designed and checked in KiCad 10 (ERC and DRC clean, netlist checked pin for pin against the generator), with JLCPCB fab files ready. Not built or tested yet. RF performance is hand-calculated; expect to trim tank capacitors at bring-up. The firmware is outlined below but not written yet.

Parts

All 88 BOM lines (312 parts JLC places, plus the 32 machine pins and contacts the Adom Factory presses in) link to a wiki page with the symbol, footprint, 3D model, datasheet and the LCSC, Mouser and DigiKey numbers. Pages created for this board carry a verification log; check a page before reusing its part.

Qty References Value Part (MPN) Wiki page LCSC
12 C101 C104 C212 C214 C402 C406 C503 C512 C603 C605 C701 C722 10u Samsung Electro-Mechanics CL21A106KAYNNNE adom/samsung-cl21a-x5r-0805 C15850
35 C102 C105 C107 C110 C111 C115 C205 C209 C211 C213 C215 C311 C314 C401 C403 C404 C405 C407 C413 C504 C506 C510 C513 C604 C606 C607 C610 C615 C620 C702 C706 C709 C712 C721 C723 100n YAGEO CC0603KRX7R9BB104 adom/cc0603-100nf C14663
13 C103 C108 C202 C204 C206 C207 C208 C210 C613 C614 C616 C716 C717 1u Samsung Electro-Mechanics CL10A105KB8NNNC adom/cl10a105kb8nnnc C15849
1 C106 22u Samsung Electro-Mechanics CL21A226MAQNNNE adom/samsung-cl21a-x5r-0805 C45783
14 C109 C322 C501 C505 C507 C508 C601 C602 C608 C609 C611 C705 C708 C711 10n FH (Guangdong Fenghua Advanced Tech) 0603B103K500NT adom/fenghua-0603-mlcc C57112
3 C114 C201 C203 4.7u Samsung Electro-Mechanics CL21A475KAQNNNE adom/cl21a475kaqnnng (1) C1779
2 C116 C117 18p Samsung Electro-Mechanics CL10C180JB8NNNC adom/cl10c180jb8nnnc C1647
2 C301 C302 2.7n Murata Electronics GRM1885C1H272JA01D adom/murata-grm18-gcm18-c0g-0603 C77034
5 C303 C304 C412 C707 C710 47p Samsung Electro-Mechanics CL10C470JB8NNNC adom/samsung-cl10c-c0g-0603 C1671
7 C305 C306 C310 C320 C502 C509 C714 22p Samsung Electro-Mechanics CL10C220JB8NNNC adom/samsung-cl10c-c0g-0603 C1653
8 C307 C308 C312 C315 C316 C619 C703 C720 1n Samsung Electro-Mechanics CL10B102KB8NNNC adom/cl10b102kb8nnnc C1588
2 C309 C319 3.3p YAGEO CC0603CRNPO9BN3R3 adom/yageo-cc0603-npo C282249
2 C313 C318 4.7p FH (Guangdong Fenghua Advanced Tech) 0603CG4R7C500NT adom/fenghua-0603-mlcc C1669
3 C317 C410 C516 15p Samsung Electro-Mechanics CL10C150JB8NNNC adom/samsung-cl10c-c0g-0603 C1644
1 C321 2.2p FH (Guangdong Fenghua Advanced Tech) 0603CG2R2C500NT adom/fenghua-0603-mlcc C1651
4 C323 C511 C514 C713 100p Samsung Electro-Mechanics CL10C101JB8NNNC adom/samsung-cl10c-c0g-0603 C14858
2 C408 C515 220p Murata Electronics GCM1885C2A221JA16D adom/murata-grm18-gcm18-c0g-0603 C388907
1 C409 470p YAGEO CC0603JRNPO9BN471 adom/yageo-cc0603-npo C106211
1 C411 33p Samsung Electro-Mechanics CL10C330JB8NNNC adom/samsung-cl10c-c0g-0603 C1663
2 C612 C618 2.2n Walsin Tech Corp 0603N222J500CT adom/0603n222j500ct C296055
1 C617 4.7n YAGEO CC0603JRNPO9BN472 adom/yageo-cc0603-npo C576818
1 C704 150p YAGEO CC0603JRNPO9BN151 adom/yageo-cc0603-npo C107038
2 C715 C718 1.5n YAGEO CC0603JRNPO9BN152 adom/yageo-cc0603-npo C107039
1 C719 680p YAGEO CC0603JRNPO9BN681 adom/yageo-cc0603-npo C107055
1 D104 RED Hubei KENTO Elec KT-0603R barrett-land/kt-0603r C2286
2 D105 D106 B5819W Jiangsu Changjing Electronics Technology Co., Ltd. B5819W SL adom/b5819w C8598
1 D201 GREEN (FM) Hubei KENTO Elec KT-0603G adom/kt-0603g C12624
1 D202 YELLOW (AM) Hubei KENTO Elec KT-0603Y adom/kt-0603y C2287
1 D203 BLUE (USB/stereo) Hubei KENTO Elec KT-0603B barrett-land/kt-0603b C2288
3 D301 D302 D401 BB910 Shikues BB910 adom/bb910 C475628
2 D601 D701 BAT54WS Diodes Incorporated BAT54WS-7-F adom/bat54ws-7-f C124205
1 D702 BAT54S MDD(Microdiode Semiconductor) BAT54S adom/bat54s (2) C408389
1 F101 500mA TECHFUSE nSMD050-33V adom/nsmd050-33v C70077
2 FB101 FB102 600R@100MHz Sunlord GZ1608D601TF adom/gz1608d601tf C1002
2 FL501 FL502 HCCF3-10.700-LTCVS3L HCI HCCF3-10.700-LTCVS3L adom/hccf3-10-700-ltcvs3l C19191232
1 FL601 HCCF2-455.000-LTWCGL HCI HCCF2-455.000-LTWCGL adom/hccf2-455-000-ltwcgl C19186014
1 J101 USB-C Korean Hroparts Elec TYPE-C-31-M-12 adom/type-c-31-m-12 C165948
1 J301 ANT (SMA) BAT WIRELESS BWSMA-KWE-Z001 adom/bwsma-kwe-z001 C496551
2 L301 L303 2.2u TDK NLV32T-2R2J-PF adom/nlv32t-2r2j-pf C89016
2 L302 L401 8.2u YJYCOIN YSCM322522-8R2J adom/yscm322522-8r2j C52259800
1 L304 56n Murata Electronics LQW18AN56NG00D adom/murata-lqw18an C98079
1 L305 120n Murata Electronics LQW18ANR12G00D adom/murata-lqw18an C86138
1 L306 150n Murata Electronics LQW18ANR15G00D adom/murata-lqw18an C113131
1 L307 110n Murata Electronics LQW18ANR11G00D adom/murata-lqw18an C113130
2 Q201 Q202 MMBT3906 Jiangsu Changjing Electronics Technology Co., Ltd. MMBT3906 2A(RANGE:100-300) adom/mmbt3906 (3) C2143
3 Q301 Q302 Q303 MMBTH10 UMW(Youtai Semiconductor Co., Ltd.) MMBTH10 adom/mmbth10 C545531
12 Q401 Q402 Q403 Q501 Q502 Q503 Q602 Q604 Q605 Q701 Q702 Q703 MMBT3904 Jiangsu Changjing Electronics Technology Co., Ltd. MMBT3904(RANGE:100-300) adom/mmbt3904 (4) C20526
2 Q601 Q603 BC847BS FUXINSEMI BC847BS adom/bc847bs C5380687
2 R101 R102 5.1k UNI-ROYAL(Uniroyal Elec) 0603WAF5101T5E adom/0603waf5101t5e C23186
33 R103 R201 R203 R204 R205 R207 R208 R209 R210 R211 R214 R215 R217 R219 R310 R604 R605 R608 R609 R610 R614 R619 R622 R624 R625 R627 R628 R704 R708 R713 R717 R722 R723 10k UNI-ROYAL(Uniroyal Elec) 0603WAF1002T5E adom/0603waf1002t5e C25804
7 R107 R606 R611 R617 R702 R706 R710 2.2k UNI-ROYAL(Uniroyal Elec) 0603WAF2201T5E adom/uniroyal-0603waf C4190
9 R202 R206 R212 R314 R403 R409 R410 R413 R510 22k UNI-ROYAL(Uniroyal Elec) 0603WAF2202T5E adom/0603waf2202t5e C31850
7 R213 R218 R220 R225 R629 R715 R724 1k UNI-ROYAL(Uniroyal Elec) 0603WAF1001T5E adom/0603waf1001t5e C21190
1 R216 100 UNI-ROYAL(Uniroyal Elec) 0603WAF1000T5E adom/0603waf1000t5e C22775
3 R224 R226 R512 220 UNI-ROYAL(Uniroyal Elec) 0603WAF2200T5E adom/uniroyal-0603waf C22962
9 R301 R307 R313 R412 R620 R626 R712 R719 R721 100k UNI-ROYAL(Uniroyal Elec) 0603WAF1003T5E adom/uniroyal-0603waf C25803
2 R302 R406 56 UNI-ROYAL(Uniroyal Elec) 0603WAF560JT5E adom/uniroyal-0603waf C25196
5 R303 R311 R623 R714 R716 4.7k UNI-ROYAL(Uniroyal Elec) 0603WAF4701T5E adom/0603waf4701t5e C23162
1 R304 1.8k UNI-ROYAL(Uniroyal Elec) 0603WAF1801T5E adom/uniroyal-0603waf C4177
7 R305 R405 R502 R506 R514 R602 R701 22 UNI-ROYAL(Uniroyal Elec) 0603WAF220JT5E adom/0603waf220jt5e C23345
1 R306 82 UNI-ROYAL(Uniroyal Elec) 0603WAF820JT5E adom/uniroyal-0603waf C23255
5 R308 R309 R402 R408 R615 47 UNI-ROYAL(Uniroyal Elec) 0603WAF470JT5E adom/0603waf470jt5e C23182
6 R312 R501 R503 R508 R509 R616 330 UNI-ROYAL(Uniroyal Elec) 0603WAF3300T5E adom/0603waf3300t5e C23138
5 R315 R404 R414 R511 R603 6.8k UNI-ROYAL(Uniroyal Elec) 0603WAF6801T5E adom/0603waf6801t5e C23212
2 R316 R415 150 UNI-ROYAL(Uniroyal Elec) 0603WAF1500T5E adom/uniroyal-0603waf C22808
5 R317 R515 R516 R618 R711 47k UNI-ROYAL(Uniroyal Elec) 0603WAF4702T5E adom/0603waf4702t5e C25819
1 R401 51 UNI-ROYAL(Uniroyal Elec) 0603WAF510JT5E adom/uniroyal-0603waf C23197
3 R407 R705 R709 470 UNI-ROYAL(Uniroyal Elec) 0603WAF4700T5E adom/0603waf4700t5e C23179
3 R411 R513 R517 1.5k UNI-ROYAL(Uniroyal Elec) 0603WAF1501T5E adom/uniroyal-0603waf C22843
1 R504 15k UNI-ROYAL(Uniroyal Elec) 0603WAF1502T5E adom/uniroyal-0603waf C22809
1 R505 5.6k UNI-ROYAL(Uniroyal Elec) 0603WAF5601T5E adom/uniroyal-0603waf C23189
1 R507 120 UNI-ROYAL(Uniroyal Elec) 0603WAF1200T5E adom/uniroyal-0603waf C22787
1 R601 2.7k UNI-ROYAL(Uniroyal Elec) 0603WAF2701T5E adom/uniroyal-0603waf C13167
2 R607 R612 2k UNI-ROYAL(Uniroyal Elec) 0603WAF2001T5E adom/uniroyal-0603waf C22975
3 R613 R703 R707 33k UNI-ROYAL(Uniroyal Elec) 0603WAF3302T5E adom/uniroyal-0603waf C4216
1 R621 39k UNI-ROYAL(Uniroyal Elec) 0603WAF3902T5E adom/uniroyal-0603waf C23153
1 R718 51k UNI-ROYAL(Uniroyal Elec) 0603WAF5102T5E adom/0603waf5102t5e C23196
1 R720 200k UNI-ROYAL(Uniroyal Elec) 0603WAF2003T5E adom/uniroyal-0603waf C25811
1 R725 1.2k UNI-ROYAL(Uniroyal Elec) 0603WAF1201T5E adom/uniroyal-0603waf C22765
1 R726 4.3k UNI-ROYAL(Uniroyal Elec) 0603WAF4301T5E adom/uniroyal-0603waf C23159
1 U101 USBLC6-2SC6 STMicroelectronics USBLC6-2SC6 ray/usblc6-2sc6 C7519
1 U102 AP2112K-3.3 Diodes Incorporated AP2112K-3.3TRG1 adom/ap2112k-3-3trg1 C51118
1 U103 STM32G0B1CCU7 STMicroelectronics STM32G0B1CCU7 adom/stm32g0b1ccu7 C29759424
4 U201 U202 U601 U701 TLV9062IDR Texas Instruments TLV9062IDR adom/tlv9062idr C398355
1 Y101 40MHz TKD SX32Y040000BC1T001 adom/sx32y040000bc1t001 C337678
1 Y501 10.24MHz HCI 0132M4-10.240F12DZNG adom/0132m4-10-240f12dzng C51822681
28 MC1 MC2 MC3 MC4 MC5 MC6 MC7 MC8 MC9 MC10 MC11 MC12 MC13 MC14 MC15 MC16 MC17 MC18 MC19 MC20 MC21 MC22 MC23 MC24 MC25 MC26 MC27 MC28 MachineContactMedium Adom MachineContactMedium adom/machinecontactmedium not on JLC (pressed in by the Adom Factory)
4 MP1 MP2 MP3 MP4 MachinePinLargeStandard Adom MachinePinLargeStandard adom/machinepinlargestandard not on JLC (pressed in by the Adom Factory)
  1. CL21A475KAQNNNE on adom/cl21a475kaqnnng: page is the CL21A475KAQNNNG reel variant; same part, different packaging suffix
  2. BAT54S on adom/bat54s: page is the Diodes Inc BAT54S; we order the MDD BAT54S (same SOT-23 pinout)
  3. MMBT3906 2A(RANGE:100-300) on adom/mmbt3906: page is the Diodes Inc MMBT3906; we order the CJ MMBT3906 (same SOT-23 pinout)
  4. MMBT3904(RANGE:100-300) on adom/mmbt3904: page is the Diodes Inc MMBT3904; we order the CJ MMBT3904 (same SOT-23 pinout)

Two parts to check in the JLC placement preview:

  • FL601 (HCCF2-455.000-LTWCGL) is not symmetric: pins 1 and 2 are the signal pins and 3 and 4 are ground. Rotated 180 degrees, the 455 kHz signal lands on ground. Its part page shows pin 1.
  • D301, D302, D401 (BB910 varactors): the Shikues datasheet does not label the terminals, so the footprint assumes the standard cathode-band pinning. Confirm the band on the first parts. See the BB910 page.

A KiCad 10 project for a USB-powered AM/FM broadcast receiver. The radio itself is built from discrete transistors (MMBTH10 / MMBT3904 / BC847BS) and TLV9062 op-amps.

An onboard STM32G0B1 does all the digital work:

  • It tunes the varactor oscillators, switches bands, calibrates the receiver itself, and reads the demodulated audio with its ADC.
  • It streams that audio to a PC as a USB Audio Class device.
  • It takes every setting, and every firmware update, over the same USB-C cable. No other board is needed.
Item Value
Bands FM 87.5 to 108 MHz, AM (MW) 530 to 1700 kHz
Architecture Dual-conversion superhet: 10.7 MHz first IF (both bands), 455 kHz second IF
Detectors AM: diode envelope detector with op-amp AGC. FM: diode-pump pulse-count discriminator
Tuning Varactor VCOs driven by the STM32 DACs (12-bit), digital AFC through an IF counter, and self-calibration against crystal-derived markers
Control & programming USB-C only: UAC audio, a CDC command port, and USB DFU (a blank chip boots into ROM DFU; updates need no jumper)
Interface USB-C (power, audio, control, firmware), SMA antenna, 4 LEDs. 4 grounded large Adom machine pins + 28 medium machine contacts (optional: VIN, USB, SWD/reset, UART, audio out, antenna, probes)
Debug 59 labelled test pads covering every supply rail, stage bias and signal node, plus 9 probe contacts
PCB Adom Molecule, 96 × 96 mm large-pin grid (102.5 × 102.5 mm outline), 4 layers (F.Cu signal / In1 GND / In2 +5VA & +3V3 / B.Cu signal), JLCPCB rules

Verification status (KiCad 10.0)

  • Netlist: the schematic's exported netlist matches tools/design.py pin for pin (403 parts including 32 machine pins/contacts and 59 test pads; 155 nets). tools/check_sch.py checks this.
  • ERC: 0 errors, 0 warnings (all severities).
  • DRC: 0 violations (all severities), 0 unconnected items, 0 schematic-parity issues.
  • Board: 403 footprints, 1,974 track segments (≈4.5 m), 976 vias, 4 copper layers, 102.5 × 102.5 mm molecule outline.
  • Not verified: RF performance. Oscillator ranges, IF gains and filter terminations are hand calculations. Expect to trim the tank capacitors during bring-up (see below). No SPICE or EM simulation was run.

Board layout and silkscreen

The layout is floorplanned by function (tools/floorplan.py).

  • Every circuit block has its own rectangle on the board, and the silkscreen outlines each one with its function written into the top edge.
  • Signal flow runs from the antenna (top right), through the front ends (right column) and the 10.7 MHz and 455 kHz IFs (middle column), to the MCU (left column).
  • The left column stacks USB/power, the MCU, the LDO and the LED / audio-out block. All their contacts form one column down the left edge.
  • Tuning sits bottom right, so only five slow DC control lines (two DACs, the PWM and two band enables) cross the IF column.
  • Inside each block, parts sit on a 0.5 mm grid, prefer a common orientation, and are pulled onto shared rows and columns.

The silkscreen is kept clean:

  • Reference designators: none on the silkscreen. They are on the F.Fab layer, so KiCad's assembly view and the schematic still cross-reference.
  • Part outlines: passives and discretes have none.
  • What remains: the block outlines and labels, each IC's part name, the test-pad and machine-contact signal names, the connector outlines, and the LED names.
  • DRC: because footprints were edited on the board, the project sets KiCad's "footprint doesn't match library" check to ignore.
Silkscreen group Section
USB-C / POWER IN Power & MCU
STM32 MCU Power & MCU
3.3 V LDO / RAILS Power & MCU
10.24 MHz XO 10.7 MHz IF
10.7 MHz IF AMP 10.7 MHz IF
2ND MIXER 10.7 MHz IF
10.7 MHz FILTER 10.7 MHz IF
455 kHz AM FILTER AM IF
AGC VGA AM IF
AGC / RSSI / AM AUDIO AM IF
IF AMP / AM DETECTOR AM IF
FM LIMITER FM IF
FM RSSI FM IF
SQUARER / IF COUNT FM IF
AFC / FM AUDIO FM IF
FM DISCRIMINATOR FM IF
FM MIXER FM front end
FM LO FM front end
FM RF AMP FM front end
ANT / DIPLEXER FM front end
AM MIXER AM front end
AM LO AM front end
AM RF AMP AM front end
VARACTOR DRIVE Tuning & UI
RF TRACKING / VREF Tuning & UI
BAND SWITCH Tuning & UI
ENCODER / LEDS / AUDIO Tuning & UI

Adom Molecule

This board follows Adom's Molecule Design Guide (white paper v1.0) and uses the official parts from adom/adom-machine-parts-library. The KiCad copies are in lib/AdomMachine.*, with STEP models from the component pages.

Rule This molecule
Machine pin in every corner (pincer grip) 4× MachinePinLargeStandard (Ø3.45 mm plated hole, 5.2 mm pad), all four on GND, 96 × 96 mm apart. That is 3 × 3 cells of the 32 mm large-class grid, so the molecule mounts directly on the base scaffold without a user scaffold. Large Standard is the only large pin Adom makes.
Contacts All 28 are MachineContactMedium, the smaller of Adom's two contact sizes: 0.78 mm drill, 1.3 mm pad, 24 AWG wire. None is closer than 6 mm to a large pin; the pins' 3 mm-radius courtyard is the pincer keep-out.
All pins/contacts on the 2 mm grid from the origin pin MP1 is the origin (KiCad drill/place and grid origin). Every machine contact is at an even-mm offset from MP1, and the probe contacts were snapped to that lattice by the placer.
Board outline 102.5 × 102.5 mm: 3.25 mm beyond the pin centres, with corner arcs centred on the pins (no wings). That is the large pin's 2.6 mm pad radius plus the 0.65 mm edge clearance Adom's example molecules use.
Connections via machine pins/contacts Power, USB, SWD/reset, UART, audio and antenna are on edge contacts, but none is required: USB-C alone runs the board. The only connectors are the USB-C (the pincers can plug USB) and the SMA jack.
Jumpers instead of buttons No buttons and no jumpers are needed. Firmware updates use USB DFU: a blank chip boots into it, and the firmware re-enters it on request. For recovery from a broken image, CLK(=BOOT0) + 3V3 and RST + GND are adjacent contact pairs a machine-pin jumper can bridge.
Self-contained The full radio, MCU, crystal timebase, regulators and decoupling are on board. Tuning, band, volume, calibration and updates are all controlled from the PC over USB-C, with no external controls.

Machine pin and contact map

Grid coordinates are mm from MP1; +x is right and +y is down, as seen in KiCad.

Ref Net Silk label Grid (x, y)
MP1 GND corner machine pin (large) (0, 0)
MP2 GND corner machine pin (large) (96, 0)
MP3 GND corner machine pin (large) (0, 96)
MP4 GND corner machine pin (large) (96, 96)
MC1 VIN 5V (0, 6)
MC2 GND GND (0, 8)
MC3 USB_DP D+ (0, 24)
MC4 USB_DM D- (0, 26)
MC5 GND GND (0, 28)
MC6 +3V3 3V3 (0, 34)
MC7 SWCLK CLK (0, 36)
MC8 NRST RST (0, 38)
MC9 GND GND (0, 40)
MC10 SWDIO DIO (0, 44)
MC11 GND GND (0, 46)
MC12 UART_TX TX (0, 52)
MC13 UART_RX RX (0, 54)
MC14 GND GND (0, 56)
MC15 AM_AUDIO AM (0, 84)
MC16 FM_AUDIO FM (0, 86)
MC17 GND GND (0, 88)
MC18 ANT ANT (96, 20)
MC19 GND GND (96, 22)

The probe contacts (for the factory's probe needles) sit on the grid next to their circuits: MC20 CF2_OUT, MC21 IF2_OUT, MC22 AM_DET, MC23 FM_DEMOD, MC24 LIM_SQ, MC25 VT_FM, MC26 VT_AM, MC27 VT_RF, MC28 +5VA.

Debug test points

59 bare copper test pads, grouped by circuit. Each has its short name printed next to it on the silkscreen (the name is in brackets below).

  • Supply, bias and ground pads are 1.5 mm, for a DMM probe or a scope ground spring. Every circuit block has its own GND pad.
  • Signal pads are 1 mm.
  • They are copper only: no part, not in the BOM or CPL, so they add nothing to the JLC order.
Circuit Test pads
Power & MCU TP101 VBUS (VBUS), TP102 VIN (VIN), TP103 VIN_OR (VOR), TP104 +5V (5V), TP105 +3V3 (3V3), TP106 +3.3VA (3V3A), TP107 +5VA (5VA), TP108 GND (GND), TP109 GND (GND), TP110 CAL_MARK (CAL)
Tuning & band switch TP201 DAC_FM (DACF), TP202 DAC_AM (DACA), TP203 PWM_RF (PWM), TP204 VTF_OUT (VTF1), TP205 VTA_OUT (VTA1), TP206 VTR_OUT (VTR1), TP207 VREF_1V65 (VREF), TP208 +5V_FM (5VFM), TP209 +5V_AM (5VAM), TP210 GND (GND), TP211 GND (GND)
FM front end TP301 V_RF1 (VRF), TP302 V_LO1 (VLO), TP303 FMLO_E (FLO), TP304 IF_MIX (MIX), TP305 GND (GND)
AM front end TP401 V_AM1 (VAM1), TP402 V_AM2 (VAM2), TP403 AM_RFIN (AMIN), TP404 AMRF_C (ARF), TP405 AMLO_E (ALO), TP406 GND (GND)
10.7 MHz IF / 2nd mixer TP501 V_IF1 (VIF1), TP502 V_IF2 (VIF2), TP503 CF1_OUT (CF1), TP504 IF_C1 (IF1), TP505 XO_E (XO), TP506 GND (GND)
AM IF, AGC & detector TP601 V_IF3 (VIF3), TP602 VBIAS (VB), TP603 AMF_OUT (AMF), TP604 VGA1_OUT (VGA1), TP605 VGA2_OUT (VGA2), TP606 AM_IFOUT (AIF), TP607 V_AGC (AGC), TP608 RSSI_AM (RSA), TP609 AMA_OUT (AMA), TP610 GND (GND), TP611 GND (GND)
FM limiter & discriminator TP701 V_IF4 (VIF4), TP702 LIM1_C (LIM1), TP703 LIM2_C (LIM2), TP704 RSSI_FM (RSF), TP705 IF_CNT (CNT), TP706 VREF_FM (VRFM), TP707 FM_DC (FMDC), TP708 FMA_OUT (FMA), TP709 GND (GND), TP710 GND (GND)

On the RF side the pads sit on low-impedance nodes (oscillator emitters, mixer output, supply rails) rather than on the tank circuits, so a probe doesn't detune them.

Using it in the Adom Factory

  • Mounting: the large corner pins sit on the 32 mm grid, so the molecule plugs straight into the base scaffold's large contacts.
  • One cable does everything: plug USB-C into a PC.
    • It powers the board, carries the audio (a USB microphone), accepts every tuning and settings command, and reflashes the firmware.
    • No other board, encoder, programmer or jumper is needed.
  • Optional contacts:
    • VIN: 5 V from the control panel's PS2 or USB rail can come in on the VIN contact (MC1) instead of USB-C. The two are OR-ed through B5819W diodes. Current draw is about 80 mA.
    • Debug: SWD (DIO/CLK/RST) and a UART console (TX/RX) are there for firmware debugging only.
    • Audio: the AM/FM audio contacts (MC15/MC16) can feed another molecule or a scope.

Signal chain and frequency plan

                    ┌─ 2 MHz LPF ─ AM preamp (Q401) ─ AM mixer (Q403) ◄─ AM VCO 11.23 to 12.4 MHz (Q402, Clapp)
 SMA ─ diplexer ────┤                                        │
                    └─ 70 MHz HPF + 130 MHz LPF ─ FM RF amp (Q301, varactor-tracked tank)
                                                  ─ FM mixer (Q303) ◄─ FM VCO 98.7 to 118.7 MHz (Q302, Colpitts)
                                                             │
                                            IF_MIX (10.7 MHz, 330 Ω)
                                                             │
       FL501 10.7 MHz ─ IF amp (Q501) ─ FL502 10.7 MHz ─ 2nd mixer (Q502) ◄─ 10.24 MHz XO (Q503)
                                                             │ 455 kHz
                        ┌────────────────────────────────────┴───────────────────────────┐
  AM: FL601 455 kHz ±4.5 kHz ─ VGA1/VGA2 (BC847BS pairs,        FM: RC LPF ─ limiter (Q701, Q702) ─ squarer (Q703)
      tail-current AGC) ─ post-amp (Q605) ─ BAT54 detector          ─ diode pump (C714 + BAT54S) ─ U701A integrator
      ─ U601A AGC integrator ─ U601B 5 kHz Sallen-Key               (75 µs de-emphasis) ─ U701B 15 kHz Sallen-Key
      ─► AM_AUDIO (PA0)   V_AGC ─► RSSI_AM (PA2)                    ─► FM_AUDIO (PA1)   FM_DC ─► PA3   LIM_SQ ─► IF_CNT (PA15)
  • FM uses high-side injection (LO = RF + 10.7 MHz). The RF amplifier's tank is tuned by VT_RF (a filtered PWM), so the firmware can track the preselector to the LO and suppress the image 21.4 MHz above.
  • AM is up-converted to 10.7 MHz (LO = RF + 10.7 MHz). The image lands at 22 to 23 MHz, far beyond the 2 MHz low-pass, so no tracking preselector is needed and the VCO only has to cover a 1.1:1 range.
  • Both bands share the 10.7 MHz IF and the second conversion to 455 kHz. The second LO is a 10.240 MHz crystal (JLC-stocked; 10.245 MHz parts are scarce), so the first IF is actually 10.695 MHz. Firmware sets LO1 = RF + 10.695 MHz; the offset is only 5 kHz, well inside the 10.7 MHz filters' 180 kHz passband.
    • AM: the narrow ceramic filter sets the selectivity.
    • FM: the wide 10.7 MHz filters set the noise bandwidth, and the ±75 kHz deviation (16 % of 455 kHz) goes straight to the pulse-count detector.

Pulse-count FM detector

Each IF cycle the 0 to 4.6 V square wave (LIM_SQ) moves a fixed charge C714 · (Vpp − 2·Vf) into U701A's summing junction, so the average current is proportional to the IF frequency: 40 µA at 455 kHz and ±6.6 µA at ±75 kHz deviation.

  • Audio and de-emphasis: R718 (51 k) converts the current to ±0.34 V of audio, and R718 ∥ C715 (51 k ∥ 1.5 nF) gives the 75 µs de-emphasis. For 50 µs (EU), change C715 to 1 nF.
  • AFC: FM_DC (FM_DEMOD × 2/3, 0.1 s time constant) gives the firmware an AFC error signal. IF_CNT lets TIM2 count the IF directly.

AM AGC

Two BC847BS differential pairs act as variable-gain amplifiers. Their gain is proportional to the tail current, about 40 dB of range per stage.

  • Loop: U601A integrates AM_DET − 0.98 V and drives both tail transistors through a ÷2 divider, which holds the detected carrier at about 1 V.
  • Signal strength: RSSI_AM (V_AGC/2) is the firmware's signal-strength reading, used for seek. It is inverted: a lower voltage means a stronger signal.

STM32G0B1CCU7 pin map

The MCU is an STM32G0B1CCU7 (Cortex-M0+, 256 KB flash, 144 KB RAM, USB FS, dual 12-bit DAC).

It replaces the STM32F072 because of how a blank chip boots:

  • The G0B1 has a flash empty check. A blank chip straight from the JLC assembly line boots into ST's ROM USB DFU bootloader.
  • The very first firmware load therefore goes over USB, just like every later update.
  • The F072 has no empty check. A blank F072 needs BOOT0 pulled high by a jumper.
Pin Function Net
PA0 / PA1 ADC_IN0 / ADC_IN1 AM_AUDIO / FM_AUDIO (biased at 1.65 V)
PA2 ADC_IN2 RSSI_AM (AGC voltage / 2)
PA3 ADC_IN3 FM_DC (discriminator DC, AFC)
PA6 ADC_IN6 RSSI_FM (limiter stage-1 detector)
PA4 DAC1_OUT1 DAC_FM → ×1.45 → VT_FM (FM VCO)
PA5 DAC1_OUT2 DAC_AM → ×1.45 → VT_AM (AM VCO)
PB1 TIM3_CH4 PWM PWM_RF → 2-pole RC → ×1.45 → VT_RF (FM preselector)
PA15 TIM2_ETR IF_CNT (limited 455 kHz IF: AFC and self-calibration)
PA8 TIM1_CH1 CAL_MARK → 47 k + 100 pF → ANT (calibration markers; idles low)
PF0 / PF1 HSE 40 MHz crystal Y101. Its harmonics land at 80 and 120 MHz, clear of the FM band and the LO range.
PB8 / PB9 GPIO open-drain (5 V tolerant) FM_EN_N / AM_EN_N: low = band powered
PB13 / PB14 / PB15 GPIO LED_FM / LED_AM / LED_STAT
PA11 / PA12 USB FS D− / D+. USB runs on HSI48 + CRS, locked to the host's SOF.
PB6 / PB7 USART1 TX / RX UART_TX / UART_RX: optional debug console (MC12/MC13)
PA13 / PA14, PF2 SWD, NRST Optional debug contacts DIO / CLK / RST. PA14 = SWCLK is also BOOT0 (10 k pull-down).
VREF+ ADC / DAC reference +3.3VA (ferrite-filtered)

Programming and control over USB (firmware outline, not yet written)

Everything runs over the one USB-C cable: power, audio, control and firmware updates.

Programming

  1. First flash: a blank G0B1 enumerates as STM32 BOOTLOADER (USB DFU, VID 0483 / PID DF11). Flash it with dfu-util -a 0 -s 0x08000000:leave -D amfm.bin or STM32CubeProgrammer.
    • The empty-flash flag is only re-read at power-on. Use :leave, or power-cycle once after the first flash.
  2. Updates: the firmware exposes a USB DFU runtime interface, so dfu-util -e works.
    • On that request (or the CDC command dfu), it stores a magic word in RAM and resets.
    • Its startup code sees the word and jumps to the ROM bootloader at 0x1FFF0000.
    • dfu-util then writes the new image and leaves, with no jumper and no ST-Link.
  3. Recovery, only if a broken image never answers USB: bridge CLK↔3V3 (CLK is BOOT0), then RST↔GND or power-cycle. The chip comes up in ROM DFU.

Clocks

  • The 40 MHz crystal drives the PLL: 64 MHz SYSCLK, and 128 MHz for TIM1.
  • USB runs on HSI48 with CRS synced to SOF.
  • Every frequency the MCU generates or measures is therefore crystal-accurate (±10 ppm).

USB composite device

  • Audio: UAC microphone, 48 kHz, 16-bit mono.
    • TIM-triggered ADC with DMA on PA0/PA1, sending the active band.
    • The PC's volume and mute controls act on a feature unit.
  • Control: a CDC-ACM text port (mirrored on the UART console). Commands:
Command Action
band fm / band am Powers the chosen front end (FM_EN_N / AM_EN_N) and loads its tuning table.
freq 101.1 / freq 1010 Tunes in MHz (FM) or kHz (AM): DAC from the calibration table, then AFC.
seek up / seek down, scan Steps and stops on stations, found via RSSI plus the IF count.
mute, volume N, squelch N Digital, in the audio path.
deemph 50 / deemph 75 The analog chain is 75 µs; 50 µs regions get a first-order digital correction.
rssi?, status? Signal strength, AGC voltage, IF frequency, band, frequency.
cal Runs the self-calibration below and stores the tables in flash.
dfu Reboots into the ROM DFU bootloader.

Tuning

  • A per-band table maps DAC code to LO frequency; a second table maps FM frequency to the VT_RF preselector PWM.
  • After each tune, AFC counts IF_CNT for 10 ms against 455.000 kHz and trims the DAC code.

Self-calibration (cal: no signal generator, probe or SDR needed)

  1. Markers: TIM1 drives CAL_MARK with a square wave of 128 MHz / N.
    • Its harmonics reach the antenna input through 47 kΩ and 100 pF, at about −60 dBm each.
    • Example: N = 13 gives markers at 88.6, 98.5 and 108.3 MHz. AM uses the fundamental directly, for example 600 / 1000 / 1400 kHz.
  2. Find each marker: sweep the DAC until the IF counter sees it.
  3. Compute the LO: LO = f_marker + 10.240 MHz + f_IF2, where f_IF2 is the counted IF.
    • The MCU's crystal sets f_marker and the gate time. The ±20 ppm 10.24 MHz crystal sets the second LO.
  4. Build the table: a few markers per band give a DAC → LO table accurate to a few kHz.
    • It also checks that each VCO covers its band (98.7 to 118.7 MHz and 11.23 to 12.4 MHz) and reports if it doesn't.
  5. Preselector: with a marker in view, sweep the VT_RF PWM for maximum RSSI_FM to build the tracking table.
  6. Idle: the marker pin idles low, so nothing is injected during normal reception.

Bring-up and alignment

  1. Rails: power from USB and check the test pads VBUS, VOR, 5V, 3V3, 3V3A and 5VA. The board enumerates as STM32 BOOTLOADER; flash the firmware over USB.
    • Check each stage's bias rail too: VRF, VLO, VAM1, VAM2, VIF1-VIF4 and VB. Every block has a GND pad next to it.
  2. Band power: send band fm and check +5V_FM ≈ 4.9 V (pad 5VFM); then band am (pad 5VAM). The DAC outputs are at DACF/DACA and the op-amp outputs at VTF1/VTA1/VTR1.
  3. Self-calibration: run cal. The firmware reports each VCO's measured range and builds its tables. The CAL pad shows the marker square wave while it runs.
    • If a range misses the band, adjust C319 (FM) or C410 (AM) to shift it. Adjust C320 / C411 to change its width.
  4. Crystal oscillator: check 10.240 MHz at pad XO. With a marker tuned in, 455 kHz appears at probe contact 455K (MC21) and 10.7 MHz at 10M7 (MC20).
  5. FM detector: probe SQ (MC24) should show a clean square wave. FM_DEMOD (probe DEM, MC23) sits near 1.8 V with an unmodulated IF.
  6. AM chain: follow the signal through the pads AMF → VGA1 → VGA2 → AIF → DET (MC22) → AMA, with AGC showing the control voltage.

Ordering from JLCPCB

Every BOM line has an in-stock JLCPCB part (LCSC number), checked against JLCPCB's parts API on 2026-09-29: 86 line items, 312 placed parts. Of those lines, 46 are Basic, 4 Preferred Extended and 36 Extended. Parts cost about $11 per board, and each Extended line adds JLC's per-order Extended-part fee.

  1. PCB: upload fab/amfm_receiver_gerbers.zip (Gerbers + drill, origin at MP1, the top-left corner pin). Settings:
    • 4 layers, 102.5 × 102.5 mm, 1.6 mm. The corner pin holes are 3.45 mm plated through-holes.
    • Optionally, the impedance-controlled stackup JLC04161H-7628. The RF-netclass traces are 0.36 mm, about 50 Ω over the In1 ground plane.
  2. Assembly: top side only. Upload fab/amfm_receiver_BOM_JLCPCB.csv (Comment, Designator, Footprint, LCSC Part #) and fab/amfm_receiver_CPL_JLCPCB.csv (Designator, Mid X, Mid Y, Layer, Rotation).
    • The SMA jack (J301) is the only through-hole part JLC fits: choose Standard PCBA, or leave it out and hand-solder it.
    • The machine pins (MP1-MP4) and machine contacts (MC1-MC28) are not in the JLC files: JLC only drills their plated holes, and the Adom Factory presses the pins and contacts in.
    • The 59 test pads (TP…) are bare copper and are not in the BOM or CPL either.
  3. Check the placement preview before paying. CPL rotations were converted from KiCad to JLC orientation with the JLCKicadTools correction table.
    • Confirm pin 1 or polarity on U103 (QFN-48), U101/U102, U201/U202/U601/U701 (SOIC-8), the SOT-23 and SOT-363 transistors, and the diodes/varactors (D301, D302, D401, D601, D701, D702). Also check the LEDs, the crystals Y101/Y501 and the three ceramic filters.
    • Any part the preview shows rotated can be fixed in the order page.

Parts that differ from a generic design

  • MCU: STM32G0B1CCU7 (C29759424, QFN-48). It was chosen over the STM32F072 because its flash empty check boots a blank chip into ROM USB DFU, so programming never needs a jumper or an ST-Link.
    • The exposed pad uses KiCad's thermal-via land pattern, which ties it to the inner ground plane.
  • MCU crystal: 40 MHz SX32Y040000BC1T001 (C337678, 12 pF load, 20 Ω ESR), with 18 pF C0G loads.
    • 40 MHz puts the crystal's harmonics at 80 and 120 MHz, outside the FM band and the 98.7 to 118.7 MHz LO range.
    • The low ESR keeps the crystal's critical gm at about 1.1 mA/V, inside the G0's 1.5 mA/V start-up limit.
  • Ceramic filters: SMD parts JLC stocks.
    • FL501/FL502: HCI HCCF3-10.700-LTCVS3L (C19191232), 7.0 × 3.0 mm, 180 kHz.
    • FL601: HCCF2-455.000-LTWCGL (C19186014), ±4.5 kHz.
    • Footprints are in lib/AMFM.pretty, built from LCSC's land patterns.
  • Varactor: BB910 (C475628) is a low-voltage part: 35 to 45 pF at 0.5 V and 10 to 20 pF at 5 V, capacitance ratio 3.25 typical and 1.2 minimum (Shikues datasheet p.1). A low-ratio part narrows the VCO ranges, which cal reports.
  • RF inductors: L304-L307 are Murata LQW18 wire-wound parts (Q ≈ 35 at 100 MHz). The medium-wave inductors are 1210 wire-wound: NLV32T-2R2J-PF and YSCM322522-8R2J (Q = 30).
  • Capacitors: every capacitor that sets a frequency, bandwidth or filter corner is C0G/NP0.
  • LEDs: the green and blue LEDs (KT-0603G/B, about 2.8 V forward drop) use 220 Ω resistors so they light from a 3.3 V GPIO.

Regenerating (the generators are in tools/)

Everything is generated from tools/design.py, the single netlist source of truth:

cd tools
python3 make_lib.py      # project symbols/footprints (ceramic filters, Adom machine pin/contact)
python3 gen_sch.py       # hierarchical schematic (9 sheets incl. Molecule_IO)
python3 check_sch.py     # KiCad netlist == design.py, pin for pin
python3 gen_pcb.py place # board, stackup, rules, placement, planes, Specctra DSN
# route build/amfm_receiver.dsn with Freerouting -> build/amfm_receiver.ses
python3 gen_pcb.py finish
python3 gen_pcb.py repair # DRC-driven rip-up/re-route until kicad-cli DRC is clean
python3 make_bom.py      # grouped BOM with JLC type / stock / price
python3 make_jlc.py      # JLCPCB BOM + CPL
./make_fab.sh            # Gerbers, drill, placement, schematic PDF, BOMs

Files

Path What it is
kicad/ The KiCad 10 project: amfm_receiver.kicad_pro, the 10 schematic sheets, amfm_receiver.kicad_pcb, and the project libraries in kicad/lib/. The five LCSC 3D models are the logo-free STEPs from the part pages (3D only; copper and fab output are unchanged).
fab/ What goes to JLCPCB: amfm_receiver_gerbers.zip, amfm_receiver_BOM_JLCPCB.csv, amfm_receiver_CPL_JLCPCB.csv, plus the full BOM, the KiCad placement file and the schematic PDF.
amfm-receiver-molecule.glb The assembled board, Z-up in metres, anchored on the front-left machine pin (step2glb molecule mode), with _footprint.json / _symbol.json for placing the molecule in a layout.
tools/ The generators: design.py is the single netlist source; the others build the schematic, board, routing repairs, BOM and fab files (see Regenerating).
Release amfm-receiver-molecule.step.gz The full board STEP (50 MB unzipped) on the Releases tab.