From 2eb7bbaf953c1f45165cec4aef8ff241f9ea21b1 Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 24 Aug 2026 09:15:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=94=90=E7=A3=8A=20hw=20agent=20?= =?UTF-8?q?=E5=88=87=E6=8D=A2=20Vision-Exp=20=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- memory/2026-08-24.md | 11 + pcb/loop-detector/osc-module/gen_osc_pcb.py | 422 + pcb/loop-detector/osc-module/gen_osc_sch.py | 250 + .../osc-module/loopdet.kicad_sym | 392 + .../osc-module/osc-module.kicad_sch | 845 + pcb/loop-detector/osc-module/osc-module.pdf | Bin 0 -> 96586 bytes .../osc-module/osc-module.svg/osc-module.svg | 21114 ++++++++++++++++ 7 files changed, 23034 insertions(+) create mode 100644 memory/2026-08-24.md create mode 100644 pcb/loop-detector/osc-module/gen_osc_pcb.py create mode 100644 pcb/loop-detector/osc-module/gen_osc_sch.py create mode 100644 pcb/loop-detector/osc-module/loopdet.kicad_sym create mode 100644 pcb/loop-detector/osc-module/osc-module.kicad_sch create mode 100644 pcb/loop-detector/osc-module/osc-module.pdf create mode 100644 pcb/loop-detector/osc-module/osc-module.svg/osc-module.svg diff --git a/memory/2026-08-24.md b/memory/2026-08-24.md new file mode 100644 index 0000000..a5748fa --- /dev/null +++ b/memory/2026-08-24.md @@ -0,0 +1,11 @@ + +# 2026-08-24 工作日志 + +## 唐磊模型切换 DeepSeek-V4-Flash-Vision-Exp + +- 背景:唐磊(ou_b048b1554913b061ae24ae15a89d6d3b)后续主要做硬件设计、画 PCB,需要看图能力(原理图/PCB/datasheet/封装/波形) +- 方案:新增 `hw` agent,默认模型 `deepseek/deepseek-v4-flash-vision-exp`(text+image),通过 bindings 把唐磊飞书 DM 精确路由到 hw +- 路由:`{agentId: hw, match: {channel: feishu, peer: {kind: direct, id: ou_b048b1554913b061ae24ae15a89d6d3b}}}`;main agent 兜底 feishu +- 模型验证:官方定价与 v4-flash 相同(input $0.22/1M, output $0.66/1M, 1M ctx),实测推理正常 +- 配置备份:~/.openclaw/openclaw.json.bak.vision-* +- 注意:bindings 是追加到 config 的顶层 key;agents.list 热重载生效,bindings 需配合 openclaw agents list 验证 diff --git a/pcb/loop-detector/osc-module/gen_osc_pcb.py b/pcb/loop-detector/osc-module/gen_osc_pcb.py new file mode 100644 index 0000000..02e7ec9 --- /dev/null +++ b/pcb/loop-detector/osc-module/gen_osc_pcb.py @@ -0,0 +1,422 @@ +#!/usr/bin/env python3 +"""Generate KiCad 7 PCB for the standalone oscillator module (min board). + +Flow: J1(coil) -> TVS1 -> T1 -> Colpitts(Q1+C1/C2/Cc2) -> LM393(U1) -> F_OUT +Layout: 46x28mm, VCC rail top (y=25.5), GND pour bottom, 2-layer. +Routing: grid A* router (0.5mm), 0.25mm tracks, 0.2mm clearance. +""" +import os, math, heapq, glob + +import pcbnew +from pcbnew import (VECTOR2I, FromMM, F_Cu, B_Cu, F_SilkS, F_CrtYd, + Edge_Cuts, PAD_SHAPE_ROUNDRECT, PAD_ATTRIB_SMD) + +BASE = os.path.dirname(os.path.abspath(__file__)) +PCB = os.path.join(BASE, "osc-module.kicad_pcb") +FP = "/usr/share/kicad/footprints" + +MM = lambda v: int(FromMM(v)) +PX = lambda x, y: VECTOR2I(MM(x), MM(y)) + +# ---------------- board ---------------- +board = pcbnew.BOARD() +ds = board.GetDesignSettings() +ds.m_MinClearance = MM(0.2) +ds.m_TrackMinWidth = MM(0.25) +ds.m_MinThroughDrill = MM(0.4) +ds.m_ViasMinSize = MM(0.8) + +BOARD_W, BOARD_H = 46.0, 28.0 + +# ---------------- nets ---------------- +def make_net(name): + n = pcbnew.NETINFO_ITEM(board, name) + board.Add(n) + return n + +NETS = {} +for nm in ["COIL_A", "COIL_B", "BASE", "COLLECTOR", "EMITTER", + "COMP_IN", "VREF", "F_OUT", "VCC", "GND"]: + NETS[nm] = make_net(nm) + +def nc(nm): + return NETS[nm].GetNetCode() + +# ---------------- footprints ---------------- +def load_fp(lib, name): + fp = pcbnew.FootprintLoad(os.path.join(FP, lib), name) + if fp is None: + raise RuntimeError(f"footprint not found: {lib}:{name}") + return fp + +def place(fp, ref, value, x, y, rot=0): + fp.SetReference(ref) + fp.SetValue(value) + fp.SetPosition(PX(x, y)) + fp.SetOrientationDegrees(rot) + board.Add(fp) + return fp + +place(load_fp("Connector_PinHeader_2.54mm.pretty", "PinHeader_1x02_P2.54mm_Vertical"), + "J1", "接线圈", 4.5, 21.5) +place(load_fp("Diode_SMD.pretty", "D_SOD-123"), "TVS1", "TVS", 9.0, 21.5) +place(load_fp("Capacitor_SMD.pretty", "C_0603_1608Metric"), "C1", "100~470p", 20.5, 20.0, 180) +place(load_fp("Package_TO_SOT_SMD.pretty", "SOT-23-3"), "Q1", "S9018", 25.5, 21.5) +place(load_fp("Capacitor_SMD.pretty", "C_0603_1608Metric"), "Cc2", "10p", 30.5, 20.0) +place(load_fp("Capacitor_SMD.pretty", "C_0603_1608Metric"), "C2", "100p", 27.5, 23.5, 90) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "Re", "1k", 30.0, 23.5, 90) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "Rb1", "100k", 20.5, 16.5, 180) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "Rb2", "47k", 22.7, 16.5, 180) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "Rc", "2.2k", 29.5, 16.5, 180) +place(load_fp("Package_SO.pretty", "SOIC-8_3.9x4.9mm_P1.27mm"), "U1", "LM393", 33.0, 6.0) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "R3", "10k", 27.5, 2.0, 90) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "R4", "10k", 29.0, 2.0, 90) +place(load_fp("Resistor_SMD.pretty", "R_0603_1608Metric"), "R7", "10k上拉", 38.5, 4.5) +place(load_fp("Connector_PinHeader_2.54mm.pretty", "PinHeader_1x03_P2.54mm_Vertical"), + "J2", "VCC/GND/F_OUT", 40.5, 6.0) + +# custom T1: 4-pad SMD matching transformer +t1 = pcbnew.FOOTPRINT(board) +t1.SetReference("T1") +t1.SetValue("XFMR 1:1") +t1.SetPosition(PX(15.0, 21.5)) +for i, (dx, dy) in enumerate([(-2.5, -1.5), (-2.5, 1.5), (2.5, -1.5), (2.5, 1.5)], 1): + pad = pcbnew.PAD(t1) + pad.SetName(str(i)) + pad.SetShape(PAD_SHAPE_ROUNDRECT) + pad.SetSize(PX(1.6, 1.6)) + pad.SetPosition(PX(dx, dy)) + pad.SetLayerSet(pcbnew.PAD_SMD) + pad.SetAttribute(PAD_ATTRIB_SMD) + pad.SetRoundRectRadiusRatio(0.25) + t1.Add(pad) +for layer, x1, y1, x2, y2 in [(F_CrtYd, -3.4, -2.4, 3.4, 2.4), + (F_SilkS, -3.0, -2.0, 3.0, 2.0)]: + s = pcbnew.FP_SHAPE(t1) + s.SetShape(pcbnew.SHAPE_T_RECT) + s.SetStart(PX(x1, y1)) + s.SetEnd(PX(x2, y2)) + s.SetLayer(layer) + s.SetStrokeWidth(MM(0.15)) + t1.Add(s) +board.Add(t1) + +# mounting holes (2x, non-plated M3) +holes = [(6.0, 4.0), (42.0, 22.0)] +for hx, hy in holes: + name = "MountingHole_3.2mm_M3" + cand = glob.glob(os.path.join(FP, "MountingHole.pretty", name + ".kicad_mod")) + if not cand: + cand = glob.glob(os.path.join(FP, "MountingHole.pretty", "*3.2mm*.kicad_mod")) + if not cand: + raise RuntimeError("no mounting hole footprint") + place(load_fp("MountingHole.pretty", os.path.basename(cand[0])[:-9]), + "H", "M3", hx, hy) + +# ---------------- pad net map ---------------- +PADMAP = { + "J1": {"1": "COIL_A", "2": "COIL_B"}, + "TVS1": {"1": "COIL_A", "2": "COIL_B"}, + "T1": {"1": "COIL_A", "2": "COIL_B", "3": "BASE", "4": "GND"}, + "C1": {"1": "BASE", "2": "GND"}, + "Q1": {"1": "BASE", "2": "EMITTER", "3": "COLLECTOR"}, + "Cc2": {"1": "COLLECTOR", "2": "COMP_IN"}, + "C2": {"1": "EMITTER", "2": "GND"}, + "Re": {"1": "EMITTER", "2": "GND"}, + "Rb1": {"1": "BASE", "2": "VCC"}, + "Rb2": {"1": "BASE", "2": "GND"}, + "Rc": {"1": "VCC", "2": "COLLECTOR"}, + "U1": {"1": "F_OUT", "2": "VREF", "3": "COMP_IN", "4": "GND", + "5": "GND", "6": "GND", "7": "GND", "8": "VCC"}, + "R3": {"1": "VREF", "2": "VCC"}, + "R4": {"1": "GND", "2": "VREF"}, + "R7": {"1": "F_OUT", "2": "VCC"}, + "J2": {"1": "VCC", "2": "GND", "3": "F_OUT"}, +} + +fps = {fp.GetReference(): fp for fp in board.GetFootprints()} +net_pads = {nm: [] for nm in NETS} +for ref, pm in PADMAP.items(): + for pname, net in pm.items(): + pad = fps[ref].FindPadByNumber(pname) + pad.SetNetCode(nc(net)) + pos = pad.GetPosition() + net_pads[net].append((ref, pname, pos.x, pos.y)) + +def mmpos(p): + return (p.x / 1e6, p.y / 1e6) + +# ---------------- grid A* router ---------------- +GRID = 0.5 +NX = int(BOARD_W / GRID) +NY = int(BOARD_H / GRID) +blocked = bytearray(NX * NY) + +def cell(x, y): + return (int(round(x / GRID)), int(round(y / GRID))) + +def idx(i, j): + return j * NX + i + +def inb(i, j): + return 0 <= i < NX and 0 <= j < NY + +def block_circle(cx, cy, r): + i0, j0 = cell(cx - r, cy - r) + i1, j1 = cell(cx + r, cy + r) + for j in range(max(0, j0), min(NY, j1 + 1)): + for i in range(max(0, i0), min(NX, i1 + 1)): + dx = i * GRID - cx + dy = j * GRID - cy + if dx * dx + dy * dy <= r * r: + blocked[idx(i, j)] = 1 + +def block_rect(x0, y0, x1, y1): + i0, j0 = cell(x0, y0) + i1, j1 = cell(x1, y1) + for j in range(max(0, j0), min(NY, j1 + 1)): + for i in range(max(0, i0), min(NX, i1 + 1)): + blocked[idx(i, j)] = 1 + +def dist_pt_seg(px, py, x0, y0, x1, y1): + dx, dy = x1 - x0, y1 - y0 + L2 = dx * dx + dy * dy + if L2 == 0: + return math.hypot(px - x0, py - y0) + t = max(0.0, min(1.0, ((px - x0) * dx + (py - y0) * dy) / L2)) + return math.hypot(px - (x0 + t * dx), py - (y0 + t * dy)) + +def block_segment(x0, y0, x1, y1, pad=0.4): + i0, j0 = cell(min(x0, x1) - pad, min(y0, y1) - pad) + i1, j1 = cell(max(x0, x1) + pad, max(y0, y1) + pad) + for j in range(max(0, j0), min(NY, j1 + 1)): + for i in range(max(0, i0), min(NX, i1 + 1)): + if dist_pt_seg(i * GRID, j * GRID, x0, y0, x1, y1) <= pad: + blocked[idx(i, j)] = 1 + +# block everything that already exists +for fp in board.GetFootprints(): + for pad in fp.Pads(): + if not (pad.IsOnLayer(F_Cu) or pad.IsOnLayer(B_Cu)): + continue + bb = pad.GetBoundingBox() + block_rect(bb.GetLeft() / 1e6 - 0.4, bb.GetTop() / 1e6 - 0.4, + bb.GetRight() / 1e6 + 0.4, bb.GetBottom() / 1e6 + 0.4) + +# board edge margin +block_rect(-5, -5, 1.2, BOARD_H + 5) +block_rect(BOARD_W - 1.2, -5, BOARD_W + 5, BOARD_H + 5) +block_rect(-5, -5, BOARD_W + 5, 1.2) +block_rect(-5, BOARD_H - 1.2, BOARD_W + 5, BOARD_H + 5) + +for hx, hy in holes: + block_circle(hx, hy, 2.0) + +tracks = [] + +def add_track(x0, y0, x1, y1, net): + t = pcbnew.PCB_TRACK(board) + t.SetStart(PX(x0, y0)) + t.SetEnd(PX(x1, y1)) + t.SetWidth(MM(0.25)) + t.SetLayer(F_Cu) + t.SetNetCode(nc(net)) + board.Add(t) + tracks.append(t) + block_segment(x0, y0, x1, y1) + +def unblock_net(net, r=0.45): + for (ref, pname, x, y) in net_pads[net]: + block_circle_free(x / 1e6, y / 1e6, r) + +def block_circle_free(cx, cy, r): + """unblock cells within r of (cx,cy)""" + i0, j0 = cell(cx - r, cy - r) + i1, j1 = cell(cx + r, cy + r) + for j in range(max(0, j0), min(NY, j1 + 1)): + for i in range(max(0, i0), min(NX, i1 + 1)): + dx = i * GRID - cx + dy = j * GRID - cy + if dx * dx + dy * dy <= r * r: + blocked[idx(i, j)] = 0 + +def astar(sx, sy, gx, gy): + si, sj = cell(sx, sy) + gi, gj = cell(gx, gy) + if not inb(si, sj) or not inb(gi, gj): + return None + if blocked[idx(si, sj)] or blocked[idx(gi, gj)]: + return None + open_h = [(0.0, si, sj)] + g = {(si, sj): 0.0} + came = {} + closed = set() + while open_h: + f, i, j = heapq.heappop(open_h) + if (i, j) == (gi, gj): + path = [(gi, gj)] + while (i, j) in came: + (i, j) = came[(i, j)] + path.append((i, j)) + path.reverse() + return path + if (i, j) in closed: + continue + closed.add((i, j)) + for di, dj in ((1, 0), (-1, 0), (0, 1), (0, -1)): + ni, nj = i + di, j + dj + if not inb(ni, nj) or blocked[idx(ni, nj)]: + continue + ng = g[(i, j)] + 1.0 + if (ni, nj) not in g or ng < g[(ni, nj)]: + g[(ni, nj)] = ng + came[(ni, nj)] = (i, j) + heapq.heappush(open_h, (ng + abs(ni - gi) + abs(nj - gj), ni, nj)) + return None + +def path_to_tracks(path, net): + # merge collinear runs + runs = [] + cur = [path[0]] + for p in path[1:]: + if cur and (p[0] == cur[-1][0] or p[1] == cur[-1][1]): + cur.append(p) + else: + runs.append(cur) + cur = [p] + runs.append(cur) + for run in runs: + x0, y0 = run[0][0] * GRID, run[0][1] * GRID + x1, y1 = run[-1][0] * GRID, run[-1][1] * GRID + if (x0, y0) != (x1, y1): + add_track(x0, y0, x1, y1, net) + +def route_net(net, order=None): + pads = [(p[2] / 1e6, p[3] / 1e6) for p in net_pads[net]] + if order: + pads = [pads[i] for i in order] + unblock_net(net) + cur = pads[0] + for nxt in pads[1:]: + path = astar(cur[0], cur[1], nxt[0], nxt[1]) + if path is None: + print(f"!! A* FAILED: {net} {cur} -> {nxt}") + return False + path_to_tracks(path, net) + cur = nxt + return True + +# ---- VCC rail (top) ---- +add_track(2.0, 25.5, 44.0, 25.5, "VCC") + +# ---- signal nets ---- +ok = True +ok &= route_net("COIL_A") +ok &= route_net("COIL_B") +ok &= route_net("EMITTER") +ok &= route_net("COLLECTOR") +ok &= route_net("BASE") +ok &= route_net("COMP_IN") +ok &= route_net("VREF") +ok &= route_net("F_OUT") + +# ---- VCC drops (chain from rail) ---- +vcc_pads = [(p[2] / 1e6, p[3] / 1e6) for p in net_pads["VCC"]] +vcc_chain = [(43.0, 25.5)] + vcc_pads + [(3.0, 25.5)] +unblock_net("VCC") +cur = vcc_chain[0] +for nxt in vcc_chain[1:]: + path = astar(cur[0], cur[1], nxt[0], nxt[1]) + if path is None: + print(f"!! A* FAILED: VCC {cur} -> {nxt}") + ok = False + else: + path_to_tracks(path, "VCC") + cur = nxt + +# ---- GND vias + stubs ---- +gnd_vias = [] +for (ref, pname, x, y) in net_pads["GND"]: + pad = fps[ref].FindPadByNumber(pname) + if pad.GetAttribute() != PAD_ATTRIB_SMD: + continue # THT connects to pour through hole + px, py = x / 1e6, y / 1e6 + # chain the three unused U1 comparator pads together first + vx, vy = None, None + for ox, oy in [(1.6, 0), (-1.6, 0), (0, 1.6), (0, -1.6)]: + cx0, cy0 = px + ox, py + oy + i0, j0 = cell(cx0, cy0) + if not inb(i0, j0): + continue + free = True + for j in range(max(0, j0 - 2), min(NY, j0 + 3)): + for i in range(max(0, i0 - 2), min(NX, i0 + 3)): + if blocked[idx(i, j)]: + free = False + break + if not free: + break + if free: + vx, vy = cx0, cy0 + break + if vx is None: + print(f"!! no via spot for GND {ref}.{pname}") + ok = False + continue + via = pcbnew.PCB_VIA(board) + via.SetPosition(PX(vx, vy)) + via.SetDrill(MM(0.4)) + via.SetWidth(MM(0.8)) + via.SetLayerPair(F_Cu, B_Cu) + via.SetNetCode(nc("GND")) + board.Add(via) + block_circle(vx, vy, 0.7) + # route stub pad -> via + unblock_net("GND") + path = astar(px, py, vx, vy) + if path is None: + print(f"!! A* FAILED: GND stub {ref}.{pname}") + ok = False + else: + path_to_tracks(path, "GND") + +# ---- GND pour (bottom) ---- +z = pcbnew.ZONE(board) +z.SetLayer(B_Cu) +z.SetNetCode(nc("GND")) +z.SetIsFilled(False) +ol = z.Outline() +for (ox, oy) in [(1.0, 1.0), (BOARD_W - 1.0, 1.0), (BOARD_W - 1.0, BOARD_H - 1.0), + (1.0, BOARD_H - 1.0), (1.0, 1.0)]: + ol.Append(PX(ox, oy)) +board.Add(z) + +# ---- edge cuts ---- +e = pcbnew.PCB_SHAPE(board) +e.SetShape(pcbnew.SHAPE_T_RECT) +e.SetStart(PX(0, 0)) +e.SetEnd(PX(BOARD_W, BOARD_H)) +e.SetLayer(Edge_Cuts) +board.Add(e) + +# ---- silk text ---- +for txt, x, y, sz in [("OSC-MOD v1.0", 23.0, 27.2, 1.2), + ("J1: COIL", 4.5, 26.2, 0.8), + ("J2: 1=VCC 2=GND 3=F_OUT", 33.5, 12.5, 0.8)]: + t = pcbnew.PCB_TEXT(board) + t.SetText(txt) + t.SetPosition(PX(x, y)) + t.SetLayer(F_SilkS) + t.SetTextSize(PX(sz, sz)) + t.SetTextThickness(MM(0.15)) + board.Add(t) + +board.Save(PCB) +print("saved", PCB) +print("nets routed OK" if ok else "!!! SOME NETS FAILED !!!") + +# ---- zone fill ---- +filler = pcbnew.ZONE_FILLER(board) +filler.Fill([z]) +board.Save(PCB) +print("zone filled & re-saved") diff --git a/pcb/loop-detector/osc-module/gen_osc_sch.py b/pcb/loop-detector/osc-module/gen_osc_sch.py new file mode 100644 index 0000000..58ac80b --- /dev/null +++ b/pcb/loop-detector/osc-module/gen_osc_sch.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python3 +"""Generate KiCad 7 schematic for the standalone oscillator module (osc-module). + +Derived from the full loop-detector schematic (loop-detector.kicad_sch): + J1 (coil) -> TVS1 -> T1 (matching xfmr) -> Colpitts osc (Q1 + C1/C2/Cc2) + -> LM393 squarer (U1) -> F_OUT with pullup R7 -> J2 (VCC/GND/F_OUT) +""" +import re, uuid, os + +BASE = os.path.dirname(os.path.abspath(__file__)) +SYM = os.path.join(BASE, "loopdet.kicad_sym") +SCH = os.path.join(BASE, "osc-module.kicad_sch") + +def uid(): + return str(uuid.uuid4()) + +# ---------- extract lib_symbols from loopdet.kicad_sym ---------- +data = open(SYM, encoding="utf-8").read() +pat = re.compile(r'\(symbol "([^"]+)"') +sym_blocks = [] +for m in pat.finditer(data): + prefix = data[:m.start()] + d = prefix.count('(') - prefix.count(')') + if d == 1: + start = m.start() + depth = 0 + j = start + while j < len(data): + if data[j] == '(': + depth += 1 + elif data[j] == ')': + depth -= 1 + if depth == 0: + break + j += 1 + sym_blocks.append(data[start:j+1]) + +# keep only the symbols the oscillator module needs +WANT = {"C", "COMP", "CONN2", "Q_NPN", "R", "TVS_BI", "XFMR"} +def top_name(block): + m = re.search(r'\(symbol "([^"]+)"', block) + return m.group(1) if m else "" +kept = [b for b in sym_blocks if top_name(b) in WANT] + +def _prefix(sym_block): + return re.sub(r'\(symbol "([^"]+)"', r'(symbol "loopdet:\1"', sym_block, count=1) + +CONN3 = ''' (symbol "loopdet:CONN3" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at -2.54 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "J" (at -2.54 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "CONN3_0_1" + (polyline (pts (xy -3.81 -5.08) (xy -3.81 5.08)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 0) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "CONN3_1_1" + (pin passive line (at -2.54 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + ) + )''' + +lib_symbols = "(lib_symbols\n" + "\n".join(" " + _prefix(b) for b in kept) + "\n" + CONN3 + "\n)\n" + +# ---------- components ---------- +# (lib, ref, value, x, y, rot) +COMPONENTS = [ + ("CONN2", "J1", "接线圈(3~5匝)", 30, 120, 0), + ("TVS_BI", "TVS1", "TVS", 55, 120, 0), + ("XFMR", "T1", "1:1 匹配变压器", 85, 120, 0), + ("C", "C1", "100~470p", 110, 120, 90), + ("Q_NPN", "Q1", "S9018", 135, 120, 0), + ("R", "Rc", "2.2k", 145, 116.2, 0), + ("R", "Rb1", "100k", 131, 111.5, 90), + ("R", "Rb2", "47k", 131, 128.5, 90), + ("R", "Re", "1k", 139, 130, 90), + ("C", "C2", "100p", 145, 125.5, 90), + ("C", "Cc2", "10p", 153, 116.2, 0), + ("COMP", "U1", "LM393", 178, 120, 0), + ("R", "R3", "10k", 158, 114, 90), + ("R", "R4", "10k", 158, 130, 90), + ("R", "R7", "10k 上拉", 196, 114, 0), + ("CONN3", "J2", "VCC/GND/F_OUT", 225, 120, 0), +] + +# ---------- wires ---------- +WIRES = [ + # coil side: J1 - TVS1 - T1 primary + ((27.46, 117.46), (77.38, 117.46)), # A: J1.p1 - TVS1.p1 - T1.p1 + ((52.46, 117.46), (52.46, 120)), + ((27.46, 122.54), (77.38, 122.54)), # B: J1.p2 - TVS1.p2 - T1.p2 + ((57.54, 122.54), (57.54, 120)), + # T1 secondary upper: p3 - C1.p1 - base node + ((92.62, 117.46), (113, 117.46)), + ((113, 117.46), (113, 120)), + ((113, 120), (131, 120)), + # T1 secondary lower: p4 - C1.p2 - GND + ((92.62, 122.54), (107, 122.54)), + ((107, 122.54), (107, 138)), + # VCC bus + ((95, 105), (245, 105)), + ((145, 116.2), (145, 105)), + ((131, 108.96), (131, 105)), + ((158, 111.46), (158, 105)), + ((193.46, 114), (193.46, 105)), + ((222.46, 117.46), (222.46, 105)), + # GND bus + ((95, 138), (245, 138)), + ((131, 131.04), (131, 138)), + ((139, 132.54), (139, 138)), + ((145, 128.04), (145, 138)), + ((158, 132.54), (158, 138)), + ((222.46, 122.54), (222.46, 138)), + # base node + ((131, 114.04), (131, 125.96)), + # collector + ((139, 116.2), (150.46, 116.2)), + ((145, 116.2), (145, 122.96)), + # emitter + ((139, 123.81), (139, 127.46)), + # comp in+ + ((155.54, 116.2), (170.38, 116.2)), + ((170.38, 116.2), (170.38, 117.46)), + # vref + ((158, 116.54), (158, 125.96)), + ((158, 122.54), (170.38, 122.54)), + # comp out -> R7 -> J2 + ((185.62, 120), (185.62, 114)), + ((185.62, 114), (193.46, 114)), + ((198.54, 114), (222.46, 114)), + ((222.46, 114), (222.46, 117.46)), +] + +# ---------- net labels ---------- +LABELS = [ + ("VCC", (95, 105), 0), + ("GND", (95, 138), 0), + ("VCC", (222.46, 130.54), 0), + ("GND", (222.46, 134.96), 0), + ("F_OUT", (222.46, 112.54), 0), +] + +# ---------- texts ---------- +TEXTS = [ + ("振荡模块原理图 — 板框最小版(从环路车检器全图截取)", (20, 20), 3.5), + ("信号链:线圈 → TVS1 → T1 匹配变压器 → 考毕兹振荡(Q1) → LM393 整形 → F_OUT", (20, 30), 1.5), + ("接路面环形线圈(3~5匝,双绞屏蔽线 ≤20m)", (20, 100), 1.27), + ("【设计说明】", (20, 155), 1.5), + ("1) 本模块仅含振荡+整形部分,供电 VCC 3.3~5V,输出 F_OUT 为方波(频率 = 谐振频率);", (20, 163), 1.27), + ("2) 频率计数/判车逻辑由外部 MCU 完成(见主原理图);", (20, 171), 1.27), + ("3) R7 为 LM393 开漏输出上拉,必须保留;", (20, 179), 1.27), + ("4) C1 决定谐振频率 f0 ≈ 1/(2π√(L·C1)),20~150kHz(待现场验证);", (20, 187), 1.27), + ("5) TVS1 保护线圈侧浪涌;T1 隔离耦合抗地环路。", (20, 195), 1.27), +] + +# ---------- build ---------- +def fmt_xy(p): + return f"(xy {p[0]:g} {p[1]:g})" + +parts = [] +ROOT_UUID = uid() +parts.append("(kicad_sch") +parts.append(" (version 20230121)") +parts.append(" (generator eeschema)") +parts.append(f" (uuid {ROOT_UUID})") +parts.append(' (paper "A4")') +parts.append(" (title_block") +parts.append(' (title "Oscillator Module")') +parts.append(' (date "2026-08-24")') +parts.append(' (rev "1.0")') +parts.append(' (company "xde")') +parts.append(' (comment 1 "LC Osc + LM393 squarer, standalone")') +parts.append(" )") +parts.append("") +parts.append(lib_symbols.rstrip("\n")) +parts.append("") +PINMAP = { + "R": ["1", "2"], "C": ["1", "2"], "TVS_BI": ["1", "2"], + "Q_NPN": ["B", "C", "E"], "XFMR": ["1", "2", "3", "4"], + "COMP": ["+", "-", "OUT"], "CONN2": ["1", "2"], "CONN3": ["1", "2", "3"], +} +for lib, ref, value, x, y, rot in COMPONENTS: + parts.append(" (symbol") + parts.append(f" (lib_id \"loopdet:{lib}\")") + parts.append(f" (at {x:g} {y:g} {rot})") + parts.append(" (unit 1)") + parts.append(" (in_bom yes)") + parts.append(" (on_board yes)") + parts.append(" (dnp no)") + parts.append(f" (uuid {uid()})") + parts.append(f" (property \"Reference\" \"{ref}\" (at {x:g} {y+6:g} 0) (effects (font (size 1.27 1.27)) (justify left)))") + parts.append(f" (property \"Value\" \"{value}\" (at {x:g} {y-6:g} 0) (effects (font (size 1.27 1.27)) (justify left)))") + parts.append(f" (property \"Footprint\" \"\" (at {x:g} {y:g} 0) (effects (font (size 1.27 1.27)) hide))") + parts.append(f" (property \"Datasheet\" \"\" (at {x:g} {y:g} 0) (effects (font (size 1.27 1.27)) hide))") + for pn in PINMAP[lib]: + parts.append(f" (pin \"{pn}\" (uuid {uid()}))") + parts.append(" (instances") + parts.append(" (project \"osc-module\"") + parts.append(f" (path \"/{ROOT_UUID}\"") + parts.append(f" (reference \"{ref}\") (unit 1)") + parts.append(" )") + parts.append(" )") + parts.append(" )") + parts.append(" )") +parts.append("") +for p1, p2 in WIRES: + parts.append(" (wire") + parts.append(f" (pts {fmt_xy(p1)} {fmt_xy(p2)})") + parts.append(" (stroke (width 0) (type default))") + parts.append(f" (uuid {uid()})") + parts.append(" )") +parts.append("") +for name, pos, ang in LABELS: + parts.append(" (label") + parts.append(f" \"{name}\" (at {pos[0]:g} {pos[1]:g} {ang})") + parts.append(" (effects (font (size 1.27 1.27)) (justify left bottom))") + parts.append(f" (uuid {uid()})") + parts.append(" )") +parts.append("") +for s, pos, size in TEXTS: + parts.append(" (text") + parts.append(f" \"{s}\" (at {pos[0]:g} {pos[1]:g} 0)") + parts.append(f" (effects (font (size {size:g} {size:g})))") + parts.append(f" (uuid {uid()})") + parts.append(" )") +parts.append("") +parts.append(" (sheet_instances") +parts.append(' (path "/" (page "1"))') +parts.append(" )") +parts.append(")") + +out = "\n".join(parts) + "\n" +open(SCH, "w", encoding="utf-8").write(out) +print("wrote", SCH, len(out), "bytes") diff --git a/pcb/loop-detector/osc-module/loopdet.kicad_sym b/pcb/loop-detector/osc-module/loopdet.kicad_sym new file mode 100644 index 0000000..9a2f791 --- /dev/null +++ b/pcb/loop-detector/osc-module/loopdet.kicad_sym @@ -0,0 +1,392 @@ +(kicad_symbol_lib + (version 20220914) + (generator "xde") + (symbol "R" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "R" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "R" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "R_0_1" + (rectangle (start -1.27 -1.27) (end 1.27 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "R_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "C" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "C" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "C" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "C_0_1" + (polyline (pts (xy -0.635 -1.905) (xy -0.635 1.905)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0.635 -1.905) (xy 0.635 1.905)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "C_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "Q_NPN" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" (at -5.08 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "Q" (at -5.08 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "Q_NPN_0_1" + (circle (center 0 0) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -3.81 0) (xy -1.27 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 0) (xy 1.27 -2.54) (xy 1.27 -3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 0) (xy 1.27 2.54) (xy 1.27 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.02 1.78) (xy 1.45 1.65) (xy 1.35 2.2)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "Q_NPN_1_1" + (pin passive line (at -5.08 0 0) (length 1.27) + (name "B" (effects (font (size 1.27 1.27)))) + (number "B" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 -3.81 90) (length 1.27) + (name "C" (effects (font (size 1.27 1.27)))) + (number "C" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 3.81 270) (length 1.27) + (name "E" (effects (font (size 1.27 1.27)))) + (number "E" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "MOS_N" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" (at -5.08 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "Q" (at -5.08 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "MOS_N_0_1" + (polyline (pts (xy -3.81 0) (xy -1.27 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -1.27 -3.81) (xy -1.27 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 -3.81) (xy 0 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 -3.81) (xy 2.54 -3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 3.81) (xy 2.54 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 1.2) (xy 0.45 0) (xy 1.27 -1.2)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "MOS_N_1_1" + (pin passive line (at -5.08 0 0) (length 1.27) + (name "G" (effects (font (size 1.27 1.27)))) + (number "G" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 -3.81 90) (length 1.27) + (name "D" (effects (font (size 1.27 1.27)))) + (number "D" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 3.81 270) (length 1.27) + (name "S" (effects (font (size 1.27 1.27)))) + (number "S" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "LED" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "D" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "D" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "LED_0_1" + (polyline (pts (xy -1.27 -1.27) (xy -1.27 1.27) (xy 1.27 0) (xy -1.27 -1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 -1.27) (xy 1.27 1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 0) (xy 2.54 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -2.29 -1.02) (xy -1.52 -0.51)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -2.29 -1.4) (xy -1.52 -0.89)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "LED_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "A" (effects (font (size 1.27 1.27)))) + (number "A" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "K" (effects (font (size 1.27 1.27)))) + (number "K" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "TVS_BI" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "TVS" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "TVS" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "TVS_BI_0_1" + (polyline (pts (xy -1.27 -1.27) (xy -1.27 1.27) (xy 0 0) (xy -1.27 -1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 -1.27) (xy 1.27 1.27) (xy 0 0) (xy 1.27 -1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -3.81 0) (xy -1.27 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 0) (xy 3.81 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "TVS_BI_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "XFMR" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "T" (at -7.62 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "T" (at -7.62 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "XFMR_0_1" + (polyline (pts (xy -2.54 -2.54) (xy -1.27 -1.27) (xy -3.81 -1.27) (xy -1.27 1.27) (xy -3.81 1.27) (xy -2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 -2.54) (xy 1.27 -1.27) (xy 3.81 -1.27) (xy 1.27 1.27) (xy 3.81 1.27) (xy 2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -0.635 -2.54) (xy -0.635 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0.635 -2.54) (xy 0.635 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (circle (center 2.54 -2.54) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (polyline (pts (xy -6.35 -2.54) (xy -2.54 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -6.35 2.54) (xy -2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 -2.54) (xy 6.35 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 2.54) (xy 6.35 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "XFMR_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 -2.54 180) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 2.54 180) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "OPTO" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "U" (at -7.62 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "U" (at -7.62 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "OPTO_0_1" + (rectangle (start -5.08 -3.81) (end 5.08 3.81) + (stroke (width 0.254) (type default)) (fill (type none))) + (text "OPTO" (at 0 0 0) (effects (font (size 1.27 1.27)))) + (polyline (pts (xy -6.35 -2.54) (xy -4.32 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -4.32 -2.54) (xy -3.3 -2.54) (xy -3.81 -1.4) (xy -4.32 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -6.35 2.54) (xy -3.81 2.54) (xy -3.81 -1.4)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center 2.54 0) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 0) (xy 3.81 -1.27) (xy 3.81 -2.54) (xy 6.35 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 0) (xy 3.81 1.27) (xy 3.81 2.54) (xy 6.35 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -1.9 -0.9) (xy -0.6 0.3)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -1.9 -0.3) (xy -0.6 0.9)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "OPTO_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "A" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "K" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 -2.54 180) (length 1.27) + (name "C" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 2.54 180) (length 1.27) + (name "E" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "COMP" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "U" (at -7.62 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "U" (at -7.62 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "COMP_0_1" + (polyline (pts (xy -6.35 -2.54) (xy -6.35 2.54) (xy 6.35 0) (xy -6.35 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (text "+" (at -5.7 -2.29 0) (effects (font (size 1.27 1.27)))) + (text "-" (at -5.7 1.4 0) (effects (font (size 1.27 1.27)))) + ) + (symbol "COMP_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "+" (effects (font (size 1.27 1.27)))) + (number "+" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "-" (effects (font (size 1.27 1.27)))) + (number "-" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 0 180) (length 1.27) + (name "OUT" (effects (font (size 1.27 1.27)))) + (number "OUT" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "MCU" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "U" (at 0 12.7 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "U" (at 0 -12.7 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "MCU_0_1" + (rectangle (start -12.7 -10.16) (end 12.7 10.16) + (stroke (width 0.254) (type default)) (fill (type none))) + (text "MCU" (at 0 -5.08 0) (effects (font (size 1.27 1.27)))) + (text "STM32/GD32" (at 0 -2.54 0) (effects (font (size 1.27 1.27)))) + ) + (symbol "MCU_1_1" + (pin passive line (at -12.7 -5.08 0) (length 1.27) + (name "PA0" (effects (font (size 1.27 1.27)))) + (number "PA0" (effects (font (size 1.27 1.27))))) + (pin passive line (at -12.7 5.08 0) (length 1.27) + (name "GND" (effects (font (size 1.27 1.27)))) + (number "GND" (effects (font (size 1.27 1.27))))) + (pin passive line (at 12.7 -5.08 180) (length 1.27) + (name "PA1" (effects (font (size 1.27 1.27)))) + (number "PA1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 12.7 0 180) (length 1.27) + (name "PA2" (effects (font (size 1.27 1.27)))) + (number "PA2" (effects (font (size 1.27 1.27))))) + (pin passive line (at 12.7 5.08 180) (length 1.27) + (name "VDD" (effects (font (size 1.27 1.27)))) + (number "VDD" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "RELAY_SPDT" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "K" (at -7.62 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "K" (at -7.62 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "RELAY_SPDT_0_1" + (rectangle (start -5.08 -2.54) (end 2.54 2.54) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -5.08 -1.9) (xy 2.54 1.9)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -6.35 -2.54) (xy -5.08 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -6.35 2.54) (xy -5.08 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 0) (xy 5.08 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 5.08 0) (xy 5.08 5.08)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 5.08 5.08) (xy 6.35 5.08)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 5.08 -5.08) (xy 6.35 -5.08)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center 5.08 0) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (circle (center 5.08 -5.08) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (circle (center 5.08 5.08) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + ) + (symbol "RELAY_SPDT_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "A1" (effects (font (size 1.27 1.27)))) + (number "A1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "A2" (effects (font (size 1.27 1.27)))) + (number "A2" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 0 180) (length 1.27) + (name "COM" (effects (font (size 1.27 1.27)))) + (number "COM" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 -5.08 180) (length 1.27) + (name "NO" (effects (font (size 1.27 1.27)))) + (number "NO" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 5.08 180) (length 1.27) + (name "NC" (effects (font (size 1.27 1.27)))) + (number "NC" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "CONN2" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at -2.54 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "J" (at -2.54 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "CONN2_0_1" + (polyline (pts (xy -3.81 -3.81) (xy -3.81 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "CONN2_1_1" + (pin passive line (at -2.54 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) +) diff --git a/pcb/loop-detector/osc-module/osc-module.kicad_sch b/pcb/loop-detector/osc-module/osc-module.kicad_sch new file mode 100644 index 0000000..b6faf15 --- /dev/null +++ b/pcb/loop-detector/osc-module/osc-module.kicad_sch @@ -0,0 +1,845 @@ +(kicad_sch + (version 20230121) + (generator eeschema) + (uuid 8ece584f-3e63-4d0a-a133-2ce3dfd672e7) + (paper "A4") + (title_block + (title "Oscillator Module") + (date "2026-08-24") + (rev "1.0") + (company "xde") + (comment 1 "LC Osc + LM393 squarer, standalone") + ) + +(lib_symbols + (symbol "loopdet:R" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "R" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "R" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "R_0_1" + (rectangle (start -1.27 -1.27) (end 1.27 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "R_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:C" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "C" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "C" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "C_0_1" + (polyline (pts (xy -0.635 -1.905) (xy -0.635 1.905)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0.635 -1.905) (xy 0.635 1.905)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "C_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:Q_NPN" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "Q" (at -5.08 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "Q" (at -5.08 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "Q_NPN_0_1" + (circle (center 0 0) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -3.81 0) (xy -1.27 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 0) (xy 1.27 -2.54) (xy 1.27 -3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0 0) (xy 1.27 2.54) (xy 1.27 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.02 1.78) (xy 1.45 1.65) (xy 1.35 2.2)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "Q_NPN_1_1" + (pin passive line (at -5.08 0 0) (length 1.27) + (name "B" (effects (font (size 1.27 1.27)))) + (number "B" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 -3.81 90) (length 1.27) + (name "C" (effects (font (size 1.27 1.27)))) + (number "C" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 3.81 270) (length 1.27) + (name "E" (effects (font (size 1.27 1.27)))) + (number "E" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:TVS_BI" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "TVS" (at 0 2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "TVS" (at 0 -2.54 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "TVS_BI_0_1" + (polyline (pts (xy -1.27 -1.27) (xy -1.27 1.27) (xy 0 0) (xy -1.27 -1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 -1.27) (xy 1.27 1.27) (xy 0 0) (xy 1.27 -1.27)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -3.81 0) (xy -1.27 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 1.27 0) (xy 3.81 0)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "TVS_BI_1_1" + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at 2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:XFMR" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "T" (at -7.62 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "T" (at -7.62 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "XFMR_0_1" + (polyline (pts (xy -2.54 -2.54) (xy -1.27 -1.27) (xy -3.81 -1.27) (xy -1.27 1.27) (xy -3.81 1.27) (xy -2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 -2.54) (xy 1.27 -1.27) (xy 3.81 -1.27) (xy 1.27 1.27) (xy 3.81 1.27) (xy 2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -0.635 -2.54) (xy -0.635 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 0.635 -2.54) (xy 0.635 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (circle (center 2.54 -2.54) (radius 0.4) + (stroke (width 0.254) (type default)) (fill (type outline))) + (polyline (pts (xy -6.35 -2.54) (xy -2.54 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy -6.35 2.54) (xy -2.54 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 -2.54) (xy 6.35 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (polyline (pts (xy 2.54 2.54) (xy 6.35 2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "XFMR_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 -2.54 180) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 2.54 180) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "4" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:COMP" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "U" (at -7.62 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "U" (at -7.62 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "COMP_0_1" + (polyline (pts (xy -6.35 -2.54) (xy -6.35 2.54) (xy 6.35 0) (xy -6.35 -2.54)) + (stroke (width 0.254) (type default)) (fill (type none))) + (text "+" (at -5.7 -2.29 0) (effects (font (size 1.27 1.27)))) + (text "-" (at -5.7 1.4 0) (effects (font (size 1.27 1.27)))) + ) + (symbol "COMP_1_1" + (pin passive line (at -7.62 -2.54 0) (length 1.27) + (name "+" (effects (font (size 1.27 1.27)))) + (number "+" (effects (font (size 1.27 1.27))))) + (pin passive line (at -7.62 2.54 0) (length 1.27) + (name "-" (effects (font (size 1.27 1.27)))) + (number "-" (effects (font (size 1.27 1.27))))) + (pin passive line (at 7.62 0 180) (length 1.27) + (name "OUT" (effects (font (size 1.27 1.27)))) + (number "OUT" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:CONN2" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at -2.54 5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "J" (at -2.54 -5.08 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "CONN2_0_1" + (polyline (pts (xy -3.81 -3.81) (xy -3.81 3.81)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "CONN2_1_1" + (pin passive line (at -2.54 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + ) + ) + (symbol "loopdet:CONN3" + (pin_numbers hide) (pin_names (offset 0)) + (in_bom yes) + (on_board yes) + (property "Reference" "J" (at -2.54 6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "J" (at -2.54 -6.35 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 0 0 0) (effects (font (size 1.27 1.27)) hide)) + (symbol "CONN3_0_1" + (polyline (pts (xy -3.81 -5.08) (xy -3.81 5.08)) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 -2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 0) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + (circle (center -2.54 2.54) (radius 1.27) + (stroke (width 0.254) (type default)) (fill (type none))) + ) + (symbol "CONN3_1_1" + (pin passive line (at -2.54 -2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "1" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 0 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "2" (effects (font (size 1.27 1.27))))) + (pin passive line (at -2.54 2.54 0) (length 1.27) + (name "~" (effects (font (size 1.27 1.27)))) + (number "3" (effects (font (size 1.27 1.27))))) + ) + ) +) + + (symbol + (lib_id "loopdet:CONN2") + (at 30 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 0e69f1fa-99e1-481d-8149-7fd43700b50a) + (property "Reference" "J1" (at 30 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "接线圈(3~5匝)" (at 30 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 30 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 30 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 21e70984-36ee-443a-8156-5c2e0775e73d)) + (pin "2" (uuid 579b7133-83a1-44fa-9071-2b8895f457e0)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "J1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:TVS_BI") + (at 55 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid ddb51e8a-e597-4eef-9aab-39e53b619973) + (property "Reference" "TVS1" (at 55 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "TVS" (at 55 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 55 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 55 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid e4c78657-6ebd-4048-a90b-6bfaf126518c)) + (pin "2" (uuid 6e0f7ae6-56cc-4976-bd34-2373f48a5114)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "TVS1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:XFMR") + (at 85 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 998a9348-a447-4450-b8c8-7f630dad1670) + (property "Reference" "T1" (at 85 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1:1 匹配变压器" (at 85 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 85 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 85 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid f1175556-0a73-4cf1-9025-fe56613d2bab)) + (pin "2" (uuid 2121e9c4-cc08-4b3f-9d3b-78f746fd24e1)) + (pin "3" (uuid 4a72ee75-a000-475f-86e6-c55e94e57dc7)) + (pin "4" (uuid ea19914b-d7d0-43eb-be3e-557245f5a845)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "T1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:C") + (at 110 120 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 0b74cb24-b9e2-4faa-aba1-65752ad845a4) + (property "Reference" "C1" (at 110 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "100~470p" (at 110 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 110 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 110 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid ca84c2e0-d708-4570-8a6f-a47cda2f32ba)) + (pin "2" (uuid 10b98636-f59b-4234-a8a7-289748c42c29)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "C1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:Q_NPN") + (at 135 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid f082717f-c6d5-4ad2-a2f9-c9268e5cd645) + (property "Reference" "Q1" (at 135 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "S9018" (at 135 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 135 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 135 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "B" (uuid c3ec50e9-c4e5-49e8-97ea-92345e640573)) + (pin "C" (uuid 9c1c98c1-ec2a-4651-b130-03a41dd1ee53)) + (pin "E" (uuid 59a38962-d1aa-4292-9b8f-fa96f05a9114)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Q1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 145 116.2 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid b1598b28-ccb6-458d-9a83-005e88540723) + (property "Reference" "Rc" (at 145 122.2 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "2.2k" (at 145 110.2 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 145 116.2 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 145 116.2 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 0c27d906-9b92-4794-9c41-3341b2da04ec)) + (pin "2" (uuid a6384296-8be3-4310-bcc3-8b5d41b07fab)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Rc") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 131 111.5 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 31dd267e-fe57-47f3-a695-827fe0d9c832) + (property "Reference" "Rb1" (at 131 117.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "100k" (at 131 105.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 131 111.5 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 131 111.5 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid beef8ea8-c658-43d8-961c-752c7af1d7a1)) + (pin "2" (uuid 9f5c9232-2f64-4433-a7f6-51ea6b47540d)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Rb1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 131 128.5 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 42d4a6a1-0132-46d5-aabd-16ea798d086e) + (property "Reference" "Rb2" (at 131 134.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "47k" (at 131 122.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 131 128.5 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 131 128.5 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 97775983-107b-40f4-a48d-808a1baad542)) + (pin "2" (uuid db7ec057-3145-4723-ad27-6a2bd36c32e3)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Rb2") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 139 130 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 298ff928-84df-4fa3-8f91-046fe6eebe85) + (property "Reference" "Re" (at 139 136 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "1k" (at 139 124 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 139 130 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 139 130 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 92355928-79c1-4df1-b004-d5367556a60f)) + (pin "2" (uuid ca5cf7c7-98a5-4f8d-b8fe-9d94c6494eec)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Re") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:C") + (at 145 125.5 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid a37c5f28-5b89-4220-8f9c-69372afac336) + (property "Reference" "C2" (at 145 131.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "100p" (at 145 119.5 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 145 125.5 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 145 125.5 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 763263c1-d879-4a21-ab68-6c16706e0613)) + (pin "2" (uuid a3389cec-a098-483a-8586-e5bbf012212c)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "C2") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:C") + (at 153 116.2 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 8c4de817-e4e8-456c-a62e-d5fbd72637dc) + (property "Reference" "Cc2" (at 153 122.2 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10p" (at 153 110.2 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 153 116.2 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 153 116.2 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 2190b253-036e-497f-9c63-5cf6ec7f774e)) + (pin "2" (uuid fa2f26d1-ceb4-423f-9e35-2a53020eb836)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "Cc2") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:COMP") + (at 178 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 9e6028d4-329c-4df5-b3ee-a05bd9010b89) + (property "Reference" "U1" (at 178 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "LM393" (at 178 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 178 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 178 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "+" (uuid 6673de5f-5f2f-41df-b9b5-6a2cf115bb0b)) + (pin "-" (uuid 588b42b4-5e74-4974-b3e6-afb76fc5446d)) + (pin "OUT" (uuid 993164df-fd61-4d64-a4e8-890d57f531e7)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "U1") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 158 114 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid d3fa0b70-88da-404b-a318-8119a64a356d) + (property "Reference" "R3" (at 158 120 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10k" (at 158 108 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 158 114 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 158 114 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid b14b6506-d938-4c98-8034-67c60fe62a14)) + (pin "2" (uuid 90b503d2-5ca3-49f9-9294-907b364cfaea)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "R3") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 158 130 90) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid b5292343-7a46-48ae-99f0-66f04da7a2ff) + (property "Reference" "R4" (at 158 136 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10k" (at 158 124 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 158 130 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 158 130 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid e20cea5e-5bd7-4c4c-a799-4a9be20f1d6f)) + (pin "2" (uuid 9f27e1d1-aa14-4177-b296-0bf897ac140c)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "R4") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:R") + (at 196 114 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 1d27a812-a361-4b35-a20f-1106f5c670d3) + (property "Reference" "R7" (at 196 120 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "10k 上拉" (at 196 108 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 196 114 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 196 114 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 471afbb8-2124-482e-bd68-e96d3c7e89ed)) + (pin "2" (uuid f87add8f-c048-498d-b803-3844798a752b)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "R7") (unit 1) + ) + ) + ) + ) + (symbol + (lib_id "loopdet:CONN3") + (at 225 120 0) + (unit 1) + (in_bom yes) + (on_board yes) + (dnp no) + (uuid 105dca00-8414-43dc-835c-812a8b15661b) + (property "Reference" "J2" (at 225 126 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Value" "VCC/GND/F_OUT" (at 225 114 0) (effects (font (size 1.27 1.27)) (justify left))) + (property "Footprint" "" (at 225 120 0) (effects (font (size 1.27 1.27)) hide)) + (property "Datasheet" "" (at 225 120 0) (effects (font (size 1.27 1.27)) hide)) + (pin "1" (uuid 98c921e7-a7ea-4ffb-9e36-1bbd99298925)) + (pin "2" (uuid 031d8c64-e8f5-4c40-af64-fe0b66139d6f)) + (pin "3" (uuid 0dca529f-dd2e-4611-9829-401378972e6a)) + (instances + (project "osc-module" + (path "/8ece584f-3e63-4d0a-a133-2ce3dfd672e7" + (reference "J2") (unit 1) + ) + ) + ) + ) + + (wire + (pts (xy 27.46 117.46) (xy 77.38 117.46)) + (stroke (width 0) (type default)) + (uuid 0034b72f-9168-4cbc-9420-146108df0ce5) + ) + (wire + (pts (xy 52.46 117.46) (xy 52.46 120)) + (stroke (width 0) (type default)) + (uuid da492357-95c2-4970-82c5-03805500668d) + ) + (wire + (pts (xy 27.46 122.54) (xy 77.38 122.54)) + (stroke (width 0) (type default)) + (uuid 0c557d16-b2ef-43ef-bcbc-01c147937dc2) + ) + (wire + (pts (xy 57.54 122.54) (xy 57.54 120)) + (stroke (width 0) (type default)) + (uuid fa35acc2-437f-4945-8cc0-f3454484fa72) + ) + (wire + (pts (xy 92.62 117.46) (xy 113 117.46)) + (stroke (width 0) (type default)) + (uuid 44ac980a-f875-4f76-bfc1-af62f1b931ee) + ) + (wire + (pts (xy 113 117.46) (xy 113 120)) + (stroke (width 0) (type default)) + (uuid f99037a2-2fd5-4ab8-a1ca-2030edb1488e) + ) + (wire + (pts (xy 113 120) (xy 131 120)) + (stroke (width 0) (type default)) + (uuid 19e0f398-286b-43e0-9ed9-d0917676270e) + ) + (wire + (pts (xy 92.62 122.54) (xy 107 122.54)) + (stroke (width 0) (type default)) + (uuid e7e85d03-cd8c-4026-ab48-6ea742b63f68) + ) + (wire + (pts (xy 107 122.54) (xy 107 138)) + (stroke (width 0) (type default)) + (uuid 63980619-17cb-493f-b16e-2cfba1b0cd7a) + ) + (wire + (pts (xy 95 105) (xy 245 105)) + (stroke (width 0) (type default)) + (uuid 678a5eec-71cd-4937-83c9-36b3ca329571) + ) + (wire + (pts (xy 145 116.2) (xy 145 105)) + (stroke (width 0) (type default)) + (uuid 337819c1-aa86-4eb8-9faf-e7fb3881c05d) + ) + (wire + (pts (xy 131 108.96) (xy 131 105)) + (stroke (width 0) (type default)) + (uuid c6d20396-71c7-4006-9ab2-ed8b4dead8ea) + ) + (wire + (pts (xy 158 111.46) (xy 158 105)) + (stroke (width 0) (type default)) + (uuid d1432bb4-5e78-45f5-b390-a9cfb5b3de82) + ) + (wire + (pts (xy 193.46 114) (xy 193.46 105)) + (stroke (width 0) (type default)) + (uuid 6212c628-8fd9-4e57-984c-8313416c50e3) + ) + (wire + (pts (xy 222.46 117.46) (xy 222.46 105)) + (stroke (width 0) (type default)) + (uuid 0d0d966f-525c-47a7-8ab8-f27f03483662) + ) + (wire + (pts (xy 95 138) (xy 245 138)) + (stroke (width 0) (type default)) + (uuid 81e02bdb-0ced-4fc5-ae3d-0cec150485d5) + ) + (wire + (pts (xy 131 131.04) (xy 131 138)) + (stroke (width 0) (type default)) + (uuid 2e6eb158-de21-4e73-b723-0c7abe653170) + ) + (wire + (pts (xy 139 132.54) (xy 139 138)) + (stroke (width 0) (type default)) + (uuid e244ec5c-ec49-41fe-92f2-99c3691c0e57) + ) + (wire + (pts (xy 145 128.04) (xy 145 138)) + (stroke (width 0) (type default)) + (uuid 20157378-cc42-4475-b6ea-ffbbe6a5e238) + ) + (wire + (pts (xy 158 132.54) (xy 158 138)) + (stroke (width 0) (type default)) + (uuid d527f3c7-836a-488e-b5f8-ae6e55de0c34) + ) + (wire + (pts (xy 222.46 122.54) (xy 222.46 138)) + (stroke (width 0) (type default)) + (uuid 314706ab-aace-46ec-a9a2-54daacf90228) + ) + (wire + (pts (xy 131 114.04) (xy 131 125.96)) + (stroke (width 0) (type default)) + (uuid a883a5b3-5f41-4655-844b-09686dfb7a6a) + ) + (wire + (pts (xy 139 116.2) (xy 150.46 116.2)) + (stroke (width 0) (type default)) + (uuid c97ca1dc-612c-4d32-b63d-15da756757d7) + ) + (wire + (pts (xy 145 116.2) (xy 145 122.96)) + (stroke (width 0) (type default)) + (uuid bc7e58b8-135a-4999-b508-a1c6a671e1d3) + ) + (wire + (pts (xy 139 123.81) (xy 139 127.46)) + (stroke (width 0) (type default)) + (uuid 9071a1df-edc1-4a1b-a464-4a9477e7ddd6) + ) + (wire + (pts (xy 155.54 116.2) (xy 170.38 116.2)) + (stroke (width 0) (type default)) + (uuid 7d6c2b2d-6b4e-4f34-b7ca-f6c19b9631d7) + ) + (wire + (pts (xy 170.38 116.2) (xy 170.38 117.46)) + (stroke (width 0) (type default)) + (uuid c2f03ccf-61e4-4bac-a5fd-bd4c4ce7bbbd) + ) + (wire + (pts (xy 158 116.54) (xy 158 125.96)) + (stroke (width 0) (type default)) + (uuid c79425e4-5436-4fda-8d4c-af32bfdfef38) + ) + (wire + (pts (xy 158 122.54) (xy 170.38 122.54)) + (stroke (width 0) (type default)) + (uuid 66f4355c-7933-465c-bcbb-f843386538ed) + ) + (wire + (pts (xy 185.62 120) (xy 185.62 114)) + (stroke (width 0) (type default)) + (uuid 92738b2e-6f35-42bf-8be4-32f784b2b360) + ) + (wire + (pts (xy 185.62 114) (xy 193.46 114)) + (stroke (width 0) (type default)) + (uuid 3985a89f-5e3e-42d8-b274-143f38fff2a5) + ) + (wire + (pts (xy 198.54 114) (xy 222.46 114)) + (stroke (width 0) (type default)) + (uuid eff6954e-0d39-4aef-8be3-2ebedd413941) + ) + (wire + (pts (xy 222.46 114) (xy 222.46 117.46)) + (stroke (width 0) (type default)) + (uuid b1f301f7-e104-4ce4-a740-e36e4a3273aa) + ) + + (label + "VCC" (at 95 105 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid e66a99fb-21c5-4af8-b732-8232ac439dec) + ) + (label + "GND" (at 95 138 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 68f63225-1f6b-4008-92f8-8f915d9e61d1) + ) + (label + "VCC" (at 222.46 130.54 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 4f86bf36-28f3-4a51-9709-d28b3d1202dc) + ) + (label + "GND" (at 222.46 134.96 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 54a943f3-9913-49a8-84b1-e800621f03ad) + ) + (label + "F_OUT" (at 222.46 112.54 0) + (effects (font (size 1.27 1.27)) (justify left bottom)) + (uuid 8fa5b8f3-db8d-42a9-ae41-8a1ae0358976) + ) + + (text + "振荡模块原理图 — 板框最小版(从环路车检器全图截取)" (at 20 20 0) + (effects (font (size 3.5 3.5))) + (uuid 3ffdfd83-d275-4d05-9905-5af64d27796e) + ) + (text + "信号链:线圈 → TVS1 → T1 匹配变压器 → 考毕兹振荡(Q1) → LM393 整形 → F_OUT" (at 20 30 0) + (effects (font (size 1.5 1.5))) + (uuid fb003b34-df3a-44d2-aeb5-f340ff3a01a0) + ) + (text + "接路面环形线圈(3~5匝,双绞屏蔽线 ≤20m)" (at 20 100 0) + (effects (font (size 1.27 1.27))) + (uuid 3f6b6ae9-afa0-4a5d-a9b3-1014ee2ae345) + ) + (text + "【设计说明】" (at 20 155 0) + (effects (font (size 1.5 1.5))) + (uuid 448f734b-5e51-47db-ba0c-8348a26a2cc8) + ) + (text + "1) 本模块仅含振荡+整形部分,供电 VCC 3.3~5V,输出 F_OUT 为方波(频率 = 谐振频率);" (at 20 163 0) + (effects (font (size 1.27 1.27))) + (uuid da3492e5-9704-4248-89b9-d0b9fe5d9bda) + ) + (text + "2) 频率计数/判车逻辑由外部 MCU 完成(见主原理图);" (at 20 171 0) + (effects (font (size 1.27 1.27))) + (uuid 733452f2-4883-4f27-915d-9a65eeda21c1) + ) + (text + "3) R7 为 LM393 开漏输出上拉,必须保留;" (at 20 179 0) + (effects (font (size 1.27 1.27))) + (uuid c4fd5c22-1d2f-43dc-b217-bad577093034) + ) + (text + "4) C1 决定谐振频率 f0 ≈ 1/(2π√(L·C1)),20~150kHz(待现场验证);" (at 20 187 0) + (effects (font (size 1.27 1.27))) + (uuid 2e4d17cb-14cc-4552-a227-2354b5a0b4f2) + ) + (text + "5) TVS1 保护线圈侧浪涌;T1 隔离耦合抗地环路。" (at 20 195 0) + (effects (font (size 1.27 1.27))) + (uuid 4682d3bc-9ebe-4bf4-823c-545e9e4e32e0) + ) + + (sheet_instances + (path "/" (page "1")) + ) +) diff --git a/pcb/loop-detector/osc-module/osc-module.pdf b/pcb/loop-detector/osc-module/osc-module.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d1f6a53080d568c2f105ba8099b49cfd05cafcfd GIT binary patch literal 96586 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%0Atn$vF$y(` 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 + + +SVG Image created as osc-module.svg date 2026/08/24 09:11:36 + Image generated by Eeschema-SVG + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + + + +1 +1 + + + + + +2 +2 + + + + + + + + + + +3 +3 + + + + + + + + + + + + + +4 +4 + + + +5 +5 + + + + + + + + + + + + + + + +6 +6 + + + + + + + + + + + + + + + + + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + + + + +A +A + + + +B +B + + + + + + + + + + + + + + + + + + +C +C + + + + + + + + + + + + + + + +D +D + + + + + + + + + + + + +Date: 2026-08-24 +Date: 2026-08-24 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +KiCad E.D.A. kicad-cli 7.0.11+dfsg-1build4 +KiCad E.D.A. kicad-cli 7.0.11+dfsg-1build4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rev: 1.0 +Rev: 1.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Size: A4 +Size: A4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Id: 1/1 +Id: 1/1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Title: Oscillator Module +Title: Oscillator Module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +File: osc-module.kicad_sch +File: osc-module.kicad_sch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sheet: / +Sheet: / + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +xde +xde + + + + + + + + + + + + + + + + + + + + + + + + + + + + +LC Osc + LM393 squarer, standalone +LC Osc + LM393 squarer, standalone + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Cc2 +Cc2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10p +10p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rb1 + +Rb1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100k + +100k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TVS1 +TVS1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + +TVS +TVS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J1 +J1 + + + + + + + + + + +接线圈(3~5匝) +接线圈(3~5匝) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +J2 +J2 + + + + + + + + + + + + + + + +VCC/GND/F_OUT +VCC/GND/F_OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + + + + + +C + +C + + + + + + + + + + + + + + + + + + + + + +E + +E + + + + +Q1 +Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + +S9018 +S9018 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +T1 +T1 + + + + + + + +1:1 匹配变压器 +1:1 匹配变压器 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R7 +R7 + + + + + + + + + + + + + +10k 上拉 +10k 上拉 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ ++ + + +- +- + + + + + + ++ ++ + + + + + + + +- +- + + + + + + +OUT +OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + +U1 +U1 + + + + + + + + + + + + + + +LM393 +LM393 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R4 + +R4 + + + + + + + + + + + + + + + +10k + +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R3 + +R3 + + + + + + + + + + + + + + + + + + + + + + + + + +10k + +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rb2 + +Rb2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +47k + +47k + + + + + + + + + + + + + + + + + + + + + + + + + +C1 + +C1 + + + + + + + + + + + + + + + + + + + + + +100~470p + +100~470p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Re + +Re + + + + + + + + + + + + + + + + + + + + + + + + +1k + +1k + + + + + + + + + + + + + + + + + + + + + + + +Rc +Rc + + + + + + + + + + + + + + + + + + + + + + +2.2k +2.2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C2 + +C2 + + + + + + + + + + + + + + + + + + + + + + + + + + +100p + +100p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +F_OUT +F_OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +VCC +VCC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +GND +GND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1) 本模块仅含振荡+整形部分,供电 VCC 3.3~5V,输出 F_OUT 为方波(频率 = 谐振频率); +1) 本模块仅含振荡+整形部分,供电 VCC 3.3~5V,输出 F_OUT 为方波(频率 = 谐振频率); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +信号链:线圈 → TVS1 → T1 匹配变压器 → 考毕兹振荡(Q1) → LM393 整形 → F_OUT +信号链:线圈 → TVS1 → T1 匹配变压器 → 考毕兹振荡(Q1) → LM393 整形 → F_OUT + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +振荡模块原理图 — 板框最小版(从环路车检器全图截取) +振荡模块原理图 — 板框最小版(从环路车检器全图截取) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +接路面环形线圈(3~5匝,双绞屏蔽线 ≤20m) +接路面环形线圈(3~5匝,双绞屏蔽线 ≤20m) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +【设计说明】 +【设计说明】 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +2) 频率计数/判车逻辑由外部 MCU 完成(见主原理图); +2) 频率计数/判车逻辑由外部 MCU 完成(见主原理图); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3) R7 为 LM393 开漏输出上拉,必须保留; +3) R7 为 LM393 开漏输出上拉,必须保留; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5) TVS1 保护线圈侧浪涌;T1 隔离耦合抗地环路。 +5) TVS1 保护线圈侧浪涌;T1 隔离耦合抗地环路。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4) C1 决定谐振频率 f0 ≈ 1/(2π√(L·C1)),20~150kHz(待现场验证); +4) C1 决定谐振频率 f0 ≈ 1/(2π√(L·C1)),20~150kHz(待现场验证); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rb1 + +Rb1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +100k + +100k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Q1 +Q1 + + + + + + + + + + + + + + + + + + + + + + + + + + +S9018 +S9018 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +B +B + + + + + + + + + + + + + + + + + + + + + + + + +C + +C + + + + + + + + + + + + + + + + + + + + + +E + +E + + + + + +R4 + +R4 + + + + + + + + + + + + + + + +10k + +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Cc2 +Cc2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +10p +10p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +R3 + +R3 + + + + + + + + + + + + + + + + + + + + + + + + + +10k + +10k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Rb2 + +Rb2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +47k + +47k + + + + + + + + + + + + + + + +Re + +Re + + + + + + + + + + + + + + + + + + + + + + + + +1k + +1k + + + + + + + + + + + + + + +Rc +Rc + + + + + + + + + + + + + + + + + + + + + + +2.2k +2.2k + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +C2 + +C2 + + + + + + + + + + + + + + + + + + + + + + + + + + +100p + +100p + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +