Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- from tkinter import ttk, messagebox
- import numpy as np
- import matplotlib.pyplot as plt
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- # Sample parts library
- def get_parts_library():
- return [
- {"part": "Bourns 5240-RC", "L_uH": 40, "SRF_MHz": 145, "DC_R_ohm": 0.16},
- {"part": "ExampleCo 1001", "L_uH": 10, "SRF_MHz": 100, "DC_R_ohm": 0.05},
- {"part": "RFChokes Inc 500", "L_uH": 50, "SRF_MHz": 200, "DC_R_ohm": 0.2},
- ]
- # Calculation functions
- def calculate_impedance(L, freqs):
- return 2 * np.pi * freqs * L
- class RFChokeSizerApp:
- def __init__(self, root):
- self.root = root
- self.root.title("RF Choke & Discharge Sizer")
- # Set global font size
- default_font = ('Helvetica', 12)
- self.root.option_add("*Font", default_font)
- # Make window resizable
- self.root.geometry('800x600')
- self._build_ui()
- def _build_ui(self):
- frame = ttk.Frame(self.root, padding=20)
- frame.pack(fill='both', expand=True)
- # Inputs
- inputs = [
- ("Min Freq (MHz)", "7"),
- ("Max Freq (MHz)", "22"),
- ("Points", "100"),
- ("Z0 (Ω)", "50"),
- ("Multiple k", "10"),
- ("Elevation (m)","0"),
- ]
- self.vars = {}
- for i, (label, default) in enumerate(inputs):
- lbl = ttk.Label(frame, text=label)
- lbl.grid(row=i, column=0, sticky="e", padx=(0,10), pady=5)
- var = tk.StringVar(value=default)
- self.vars[label] = var
- entry = ttk.Entry(frame, textvariable=var, width=15)
- entry.grid(row=i, column=1, sticky="w", pady=5)
- # Parts combobox
- row_idx = len(inputs)
- ttk.Label(frame, text="Select Part").grid(row=row_idx, column=0, sticky="e", padx=(0,10), pady=5)
- parts = get_parts_library()
- self.part_names = [p['part'] for p in parts]
- self.parts = parts
- self.part_var = tk.StringVar()
- self.part_combo = ttk.Combobox(frame, textvariable=self.part_var, values=self.part_names, state="readonly", width=20)
- self.part_combo.grid(row=row_idx, column=1, sticky="w", pady=5)
- # Compute button
- compute_btn = ttk.Button(frame, text="Compute", command=self.compute)
- compute_btn.grid(row=row_idx+1, column=0, columnspan=2, pady=(15, 10))
- # Results text
- self.result_text = tk.Text(frame, width=60, height=8)
- self.result_text.config(state="disabled", wrap='word')
- self.result_text.grid(row=row_idx+2, column=0, columnspan=2, pady=(10,0))
- # Plot area
- plot_frame = ttk.Frame(frame)
- plot_frame.grid(row=row_idx+3, column=0, columnspan=2, pady=20, sticky='nsew')
- frame.rowconfigure(row_idx+3, weight=1)
- frame.columnconfigure(1, weight=1)
- self.fig, self.ax = plt.subplots(figsize=(6,4))
- self.canvas = FigureCanvasTkAgg(self.fig, master=plot_frame)
- self.canvas.get_tk_widget().pack(fill='both', expand=True)
- def compute(self):
- try:
- f_low = float(self.vars["Min Freq (MHz)"].get()) * 1e6
- f_high = float(self.vars["Max Freq (MHz)"].get()) * 1e6
- n_points = int(self.vars["Points"].get())
- Z0 = float(self.vars["Z0 (Ω)"].get())
- k = float(self.vars["Multiple k"].get())
- elev = float(self.vars["Elevation (m)"].get())
- freqs = np.linspace(f_low, f_high, n_points)
- target = k * Z0
- L_ideal = target / (2 * np.pi * f_low)
- X_ideal = calculate_impedance(L_ideal, freqs)
- selected_part = next((p for p in self.parts if p['part'] == self.part_var.get()), None)
- if selected_part:
- L_sel = selected_part['L_uH'] * 1e-6
- X_sel = calculate_impedance(L_sel, freqs)
- part_desc = f"Selected: {selected_part['part']} (L={selected_part['L_uH']}µH, SRF={selected_part['SRF_MHz']}MHz, DC R={selected_part['DC_R_ohm']}Ω)"
- X_at_high = X_sel[-1]
- else:
- X_sel = X_ideal
- part_desc = "No part selected; using ideal L"
- X_at_high = X_ideal[-1]
- altitude_msg = ''
- if elev > 1000:
- altitude_msg = ('Warning: elevation >1000m may reduce air breakdown voltage; consider corona rings or lower DC bleed resistance.\n')
- result_str = (
- f"Target Impedance: {target:.1f} Ω\n"
- f"Ideal L: {L_ideal*1e6:.2f} µH\n"
- f"{part_desc}\n"
- f"Impedance at {freqs[-1]/1e6:.1f} MHz: {X_at_high:.1f} Ω\n"
- f"{altitude_msg}"
- )
- self.result_text.config(state="normal")
- self.result_text.delete("1.0", tk.END)
- self.result_text.insert(tk.END, result_str)
- self.result_text.config(state="disabled")
- # Plot
- self.ax.clear()
- self.ax.plot(freqs/1e6, X_ideal, label='Ideal L', linewidth=2)
- if selected_part:
- self.ax.plot(freqs/1e6, X_sel, '--', label='Selected Part', linewidth=2)
- self.ax.axhline(target, color='black', linewidth=1, label='Target')
- self.ax.set_xlabel('Frequency (MHz)')
- self.ax.set_ylabel('Impedance (Ω)')
- self.ax.set_title('Choke Impedance vs Frequency')
- self.ax.legend()
- self.canvas.draw()
- except Exception as e:
- messagebox.showerror("Error", str(e))
- if __name__ == '__main__':
- root = tk.Tk()
- app = RFChokeSizerApp(root)
- root.mainloop()
- # --------------------------------------------------
- # A note from a reddit user
- # In response to your question on Reddit, CanNeverPassCaptch made this program for you.
- # Feel free to share, adapt, rename—it's all yours.
- # Enjoy and happy testing!
- # --------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment