molecule
AM/FM Receiver Molecule
Public Made by Adomby adom
USB-powered AM/FM receiver on an Adom Molecule: discrete BJT and op-amp superhet (10.7 MHz and 455 kHz IFs), STM32G0B1 tuning, self-calibration and USB audio over one USB-C cable. 96 x 96 mm pin grid, 4 layers, KiCad 10.
main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
(kicad_sch
(version 20251024)
(generator "eeschema")
(generator_version "10.0")
(uuid "18f8ede3-13f1-5c50-9c4a-943343ee2478")
(paper "A3")
(title_block
(title "AM/FM Receiver Molecule - discrete BJT/op-amp radio, STM32 USB audio")
(date "2026-10-02")
(rev "B (molecule)")
(company "Adom")
(comment 1 "4-layer PCB, JLCPCB-compatible rules")
(comment 2 "Generated from tools/design.py (single source of truth)")
)
(lib_symbols)
(text "AM/FM RECEIVER MOLECULE - discrete BJT + op-amp radio, STM32G0B1 USB audio"
(exclude_from_sim no)
(at 12.7 20.32 0)
(effects (font (size 4 4) (bold yes)) (justify left bottom))
(uuid "01f03014-b20a-5186-8c0d-95e98d8ae93b")
)
(sheet
(at 20.32 35.56)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "79a0e2cd-4299-5691-9113-322db6091e0c")
(property "Sheetname" "FM_Frontend"
(at 20.32 34.8488 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "fm_frontend.kicad_sch"
(at 20.32 92.0338 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "4"))))
)
(text "Antenna, diplexer & FM front end"
(exclude_from_sim no)
(at 22.32 89.56 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "11cccc3d-2cd0-52d1-b958-9821a4bfaa4f")
)
(text "FM: high-side LO, IF 10.7 MHz. Varactor tanks use BB910 through a 22 pF"
(exclude_from_sim no)
(at 22.32 40.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "32edf82e-cf85-5066-b7f4-7c1e21553835")
)
(text "series capacitor (reduces RF swing on the diode and sets the tuning"
(exclude_from_sim no)
(at 22.32 43.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "ecae5e6d-60d9-54dc-a4ed-6a9c4e4eb48e")
)
(text "ratio)."
(exclude_from_sim no)
(at 22.32 46.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "abbc0872-c9f0-57b5-806c-de49851ac296")
)
(sheet
(at 20.32 104.14)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "9f5090b5-2c4c-5b92-be88-c8ef3f1fdbd4")
(property "Sheetname" "AM_Frontend"
(at 20.32 103.4288 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "am_frontend.kicad_sch"
(at 20.32 160.6138 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "5"))))
)
(text "AM front end (up-conversion to 10.7 MHz)"
(exclude_from_sim no)
(at 22.32 158.14 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "351856e6-555e-55aa-8c92-f838e4b9519c")
)
(text "AM 530-1700 kHz is up-converted with a high-side LO at 11.23-12.4 MHz; the"
(exclude_from_sim no)
(at 22.32 109.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "c26332d8-341a-5fa9-aca2-d1489971e041")
)
(text "image lands at 22-23 MHz and is removed by the 2 MHz LPF, so no tracking"
(exclude_from_sim no)
(at 22.32 112.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "97348dad-9deb-5e0a-988a-92f1dc4558dc")
)
(text "preselector is needed."
(exclude_from_sim no)
(at 22.32 115.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "44e9941b-fd34-5b68-a625-76150ab0d048")
)
(sheet
(at 149.86 35.56)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "7ae8963f-5825-5a54-ab11-b87d7a6dbf4d")
(property "Sheetname" "IF_10M7"
(at 149.86 34.8488 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "if_10m7.kicad_sch"
(at 149.86 92.0338 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "6"))))
)
(text "10.7 MHz IF & second conversion to 455 kHz"
(exclude_from_sim no)
(at 151.86 89.56 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "798794a4-5b58-59cc-ba74-bf8b4d0755ac")
)
(text "Two 10.7 MHz ceramic filters (230 kHz) around one BJT gain stage, then a"
(exclude_from_sim no)
(at 151.86 40.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "de72ad0b-5a0b-557c-9e29-11af18d04f2a")
)
(text "BJT mixer with a 10.24 MHz crystal oscillator converts both bands to 455"
(exclude_from_sim no)
(at 151.86 43.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "e0a30d1f-71b1-559f-abcb-c83196599ec7")
)
(text "kHz."
(exclude_from_sim no)
(at 151.86 46.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "2a0e0266-d939-56fc-91e8-156ed87c7cac")
)
(sheet
(at 279.4 35.56)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "cde52c28-1d11-5b9f-8b34-c0367b9766c5")
(property "Sheetname" "AM_IF"
(at 279.4 34.8488 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "am_if.kicad_sch"
(at 279.4 92.0338 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "7"))))
)
(text "AM 455 kHz IF, AGC & envelope detector"
(exclude_from_sim no)
(at 281.4 89.56 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "66bd3833-7be3-5e27-9f07-160805c455bb")
)
(text "Gain is set by the tail currents of two BC847BS differential pairs (~40 dB"
(exclude_from_sim no)
(at 281.4 40.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "60ce2f76-71a1-5406-aa96-aa3eec9c446a")
)
(text "range each); an op-amp integrator holds the detected carrier at ~1 V."
(exclude_from_sim no)
(at 281.4 43.56 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "449a8305-6222-56db-a17f-e8d0d65e2b08")
)
(sheet
(at 279.4 104.14)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "7f492491-f31d-57a8-93ce-fded8f627f19")
(property "Sheetname" "FM_IF"
(at 279.4 103.4288 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "fm_if.kicad_sch"
(at 279.4 160.6138 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "8"))))
)
(text "FM 455 kHz limiter & pulse-count discriminator"
(exclude_from_sim no)
(at 281.4 158.14 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "6fd185c1-cbfb-5227-8902-0e36b68ddd90")
)
(text "Each IF cycle transfers a fixed charge C*(Vpp-2Vf) into the op-amp summing"
(exclude_from_sim no)
(at 281.4 109.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "f14084d5-01a3-5177-b1de-a0f88eb6dbb0")
)
(text "node, so the average current is proportional to frequency (40 uA at 455"
(exclude_from_sim no)
(at 281.4 112.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "60465b71-5020-53ed-aa25-e2ad9deb1a12")
)
(text "kHz, +/-6.6 uA at +/-75 kHz)."
(exclude_from_sim no)
(at 281.4 115.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "df9aa4fb-8192-5bad-972d-c3632c6c1105")
)
(sheet
(at 149.86 104.14)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "1b671d19-7e31-5203-b3cc-27ac66ed76b2")
(property "Sheetname" "Tuning_UI"
(at 149.86 103.4288 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "tuning_ui.kicad_sch"
(at 149.86 160.6138 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "3"))))
)
(text "Tuning, band switching & user interface"
(exclude_from_sim no)
(at 151.86 158.14 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "02734bdf-9a28-592e-b5f7-278fc21028fd")
)
(text "DAC outputs are scaled x1.45 by rail-to-rail op-amps to 0-4.8 V and"
(exclude_from_sim no)
(at 151.86 109.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "4df8670a-7d49-5bb8-9f6d-3b13886bc140")
)
(text "heavily RC filtered (varactor noise = LO phase noise). The RF tracking"
(exclude_from_sim no)
(at 151.86 112.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "1f8b1e81-9405-5867-a4f0-f8ae7eb84324")
)
(text "tank uses a filtered 12-bit PWM."
(exclude_from_sim no)
(at 151.86 115.14 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "2738da20-9d15-563d-9b64-92a28c584021")
)
(sheet
(at 279.4 172.72)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "b7bcedf3-092e-53e9-b7cb-2a962ebb14bd")
(property "Sheetname" "Power_MCU"
(at 279.4 172.0088 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "power_mcu.kicad_sch"
(at 279.4 229.1938 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "2"))))
)
(text "Power, USB & MCU"
(exclude_from_sim no)
(at 281.4 226.72 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "c5d5dd02-436c-5ad3-89c4-8c99b934c689")
)
(text "USB-C 5 V in -> PTC -> +5V. AP2112K LDO -> +3V3 (MCU). Ferrite-filtered"
(exclude_from_sim no)
(at 281.4 177.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "8cc44d68-1140-5f66-9818-82dcf7411c1f")
)
(text "+5VA (all analog/RF) and +3.3VA (MCU VREF+: ADC / DAC reference). The"
(exclude_from_sim no)
(at 281.4 180.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "04a41d75-d480-579b-9d2f-12c57576ece6")
)
(text "STM32G0B1 runs USB from HSI48 + CRS and its timers from a 40 MHz crystal;"
(exclude_from_sim no)
(at 281.4 183.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "e21be9d0-ec1d-50b4-9971-8e66ca4b1343")
)
(text "a blank chip boots straight into the ROM USB DFU bootloader."
(exclude_from_sim no)
(at 281.4 186.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "e5e54955-af63-50ac-a86e-00ab26603233")
)
(sheet
(at 20.32 172.72)
(size 114.3 55.88)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp no)
(fields_autoplaced yes)
(stroke (width 0.1524) (type solid))
(fill (color 0 0 0 0))
(uuid "f309d33b-72b0-50df-988d-26802f658409")
(property "Sheetname" "Molecule_IO"
(at 20.32 172.0088 0)
(effects (font (size 1.27 1.27)) (justify left bottom))
)
(property "Sheetfile" "molecule_io.kicad_sch"
(at 20.32 229.1938 0)
(effects (font (size 1.27 1.27)) (justify left top))
)
(instances (project "amfm_receiver" (path "/18f8ede3-13f1-5c50-9c4a-943343ee2478" (page "9"))))
)
(text "Molecule interface: machine pins & contacts"
(exclude_from_sim no)
(at 22.32 226.72 0)
(effects (font (size 1.8 1.8) (bold yes)) (justify left bottom))
(uuid "8e9321a2-f240-5ea1-900c-f349c0952e73")
)
(text "Adom Molecule (Molecule Design Guide v1.0): large / standard machine pins"
(exclude_from_sim no)
(at 22.32 177.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "4bffae73-a23d-5a52-ae8a-7a45da447ebf")
)
(text "in the four corners, 96 x 96 mm apart on the 32 mm large grid (mounts"
(exclude_from_sim no)
(at 22.32 180.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "a7b7e562-faa5-5073-8309-d7b86ecf62e9")
)
(text "directly on the base scaffold), and medium machine contacts on the 2 mm"
(exclude_from_sim no)
(at 22.32 183.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "6f5bb7fd-eca8-5d2a-9fb7-b8ff858a31f2")
)
(text "grid measured from MP1. All four corner pins are GND; 5 V comes in on the"
(exclude_from_sim no)
(at 22.32 186.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "9fd157d4-9d75-559d-bcf1-42aaa8ffbc31")
)
(text "VIN contact (MC1) or USB-C. None of the contacts is needed in use: power,"
(exclude_from_sim no)
(at 22.32 189.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "23ecbd87-51ef-5c8a-bde0-f89c2807aa08")
)
(text "control, audio and firmware updates all run over USB-C. SWD, UART and the"
(exclude_from_sim no)
(at 22.32 192.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "e0b98661-5540-5355-a1ad-c076c6f5b7ef")
)
(text "audio outputs are optional debug / monitor points; CLK(=BOOT0)/3V3 and"
(exclude_from_sim no)
(at 22.32 195.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "ccf8573f-0e92-5cd7-8dc8-34b1e43968bf")
)
(text "RST/GND are adjacent pairs for jumper recovery."
(exclude_from_sim no)
(at 22.32 198.72 0)
(effects (font (size 1.4 1.4)) (justify left bottom))
(uuid "7112b878-f9ea-55bc-bd1c-c9818e0315e6")
)
(text "SIGNAL FLOW"
(exclude_from_sim no)
(at 20.32 236.22 0)
(effects (font (size 1.9 1.9) (bold yes)) (justify left bottom))
(uuid "e8d05782-b6dd-596d-97ac-3221c971cd95")
)
(text "ANT -> diplexer -> FM: 88-108 MHz RF amp (tracked varactor tank) -> BJT mixer <- 98.7-118.7 MHz VCO"
(exclude_from_sim no)
(at 20.32 240.12 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "1b5442cf-3313-5030-b0de-57ac2c4b28bc")
)
(text " -> AM: 0.53-1.7 MHz preamp -> BJT mixer <- 11.23-12.4 MHz VCO (up-conversion)"
(exclude_from_sim no)
(at 20.32 244.02 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "332cf382-fcc4-5392-b08d-f3845ba3e79a")
)
(text "both -> 10.695 MHz IF (2 ceramic filters + BJT amp) -> BJT mixer <- 10.24 MHz XO -> 455 kHz"
(exclude_from_sim no)
(at 20.32 247.92 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "20aea08f-f813-5be1-aeef-3fc5f3dc421c")
)
(text "AM: ceramic filter -> 2x diff-pair VGA -> post-amp -> diode detector -> op-amp AGC & 5 kHz LPF"
(exclude_from_sim no)
(at 20.32 251.82 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "fad7f18a-057f-5823-8109-eef05eee6f13")
)
(text "FM: BJT limiter -> squarer -> diode-pump pulse-count detector -> op-amp integrator -> 15 kHz LPF"
(exclude_from_sim no)
(at 20.32 255.72 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "2571995c-a19a-5cd6-a57b-79d2a7e3f5dd")
)
(text "STM32G0B1: ADC samples AM_AUDIO / FM_AUDIO; DAC1/DAC2 tune the VCOs; PWM tunes the FM preselector;"
(exclude_from_sim no)
(at 20.32 259.62 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "051fe4c9-765f-555d-84bf-49853503c42f")
)
(text "TIM2_ETR counts the limited IF; TIM1 injects 40 MHz-crystal-derived markers at ANT for self-calibration."
(exclude_from_sim no)
(at 20.32 263.52 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "cae6d8e0-86ed-59f0-b721-93ae5659a102")
)
(text "USB-C only: UAC audio + CDC control port + DFU runtime; a blank chip boots into ROM USB DFU."
(exclude_from_sim no)
(at 20.32 267.42 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "0e4670cd-e637-5bc2-b0b9-5f8ea13bb8f9")
)
(text ""
(exclude_from_sim no)
(at 20.32 271.32 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "a3b4d114-b5db-5315-b9fb-33ee26863868")
)
(text "POWER: USB-C 5 V or VIN machine pin (B5819W OR-ing, 500 mA PTC). AP2112K 3.3 V. +5VA for analog/RF."
(exclude_from_sim no)
(at 20.32 275.22 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "7acb7b6f-8669-59a3-aafd-cdd62cee9083")
)
(text "Band switching: PNP high-side switches (MCU open-drain) power only the active front end."
(exclude_from_sim no)
(at 20.32 279.12 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "25ad8223-f9fd-5872-8e02-d65add158619")
)
(text "ADOM MOLECULE: large/standard GND machine pins 96 x 96 mm, 28 medium contacts on the 2 mm grid (all optional)."
(exclude_from_sim no)
(at 20.32 283.02 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "08459ca1-515a-5a00-98c1-db8fd7c58ec1")
)
(text "PCB: 4 layers - F.Cu signal / In1.Cu solid GND / In2.Cu power / B.Cu signal + GND pour."
(exclude_from_sim no)
(at 20.32 286.92 0)
(effects (font (size 1.6 1.6)) (justify left bottom))
(uuid "14868f9a-120c-5a31-af98-be1947f02a84")
)
(sheet_instances (path "/" (page "1")))
(embedded_fonts no)
)