Autolisp to Write a Lange Coupler
Greg Merrell
Retired Sr Design Engineer/Project Manager at Teledyne Technologies Incorporated
Autolisp Routine for Rapid Drawing of a Lange Coupler
G. Merrell August 2, 2021? Revised February 28, 2024 to correct errors and reformat
An Autolisp program for drawing a Lange coupler is described and listed.
For the uninitiated, a Lange coupler is a microwave circuit element used to couple (divide) a signal into two separate outputs, often at close to equal levels, or to combine two separate inputs into one output. The innovation of this coupler is in its interdigital topology that can be bonded to connect alternating fingers to comprise a tightly coupled pair of signal paths.? The coupler has four ports which can be connected and terminated in various ways to implement the desired function. The Lange coupler was invented by Julius Lange at Texas Instruments, and was published in 1969, as indicated in reference [1]. An alternate application is also shown by [2]. This coupler is described and analyzed by many other sources as well.
Program inputs are: Coupler finger width, finger spacing, and coupler length. The routine intends that thousandths of an inch (mils) are used as dimensional units when it is initially drawn.? If this is not the unit set in the drawing, then the coupler can be scaled to inches or metric units manually in the drawing if desired.
The program output is a circuit pattern drawn in separate contiguous arcs and polylines. Once drawn, the pattern can be edited, and the segments can be joined, and closed if desired. The result can be used to connect to other microstrip elements to fabricate a circuit.? When the circuit is assembled, the bond wires can be added to complete the Lange coupler. Bonding for such patterns are shown in many references.
The program is first loaded into an Autocad drawing.? The routine is then called from the Autocad command line by entering “lange” followed by return (“enter”).? The user is prompted for the finger width, spacing, and coupler length. A pattern is then drawn with the input dimensions.? Figure 1 shows a sample coupler generated with shown dimensions.? Figure 2? shows many of the points of the arcs and polylines that are defined in the routine.
Two references for Lange couplers are shown below, after Figures 1 and 2.? The program is then listed after that.
Figure 1 Lange Coupler Routine Output: W=1.5, S=1, L=100
Figure 2 Lange Coupler with Identification of Many of the Points Used in the Routine to Draw the Pattern
[1] J. Lange, "Interdigitated Strip-Line Quadrature Hybrid", 1969 IEEE-MTT-S International Microwave Symposium, May 1969, pp 10-13.
[2] R. Waugh and D. LaCombe, “Unfolding the Lange
Coupler,” IEEE Trans. Microwave Theory Tech., Vol. MTT20, pp. 777-779, Nov. 1972.
PROGRAM LISTING
; Auto Lisp for Autocad to draw a planar Lange Coupler
; for use in microwave circuits.
; G. Merrell? August 1, 2021
; An interdigitated coupler is drawn in a vertical orientation based
; on user inputs.
; Pads are drawn for finger interconnects in the middle section.
; Mitred feeds are provided for connection to microstrip
; transmission lines.
; The coupler is drawn in arc and polyline segments that can be modified,
; joined, and closed as desired for fabrication.
; The inputs are prompted for width, spacing, and length.
; All dimesions are in mils (thousandths of an inch).
; The coupler can be scaled in autocad to inches if needed.
(defun c:Lange (/ #spacing? #width? #length lpt0 lpt1 lpt2 lpt3 lpt4 lpt5 lpt6 lpt7 lpt8 lpt9 lpt10
upt0 upt1 upt2 upt3 upt4 upt5 upt6 upt7 upt8 upt9 upt10
mpt0 mpt1 mpt2 mpt3 mpt4 mpt5 mpt6 mpt7 mpt8 mpt9 mpt10
?;x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
?;ly0 ly1 ly2 ly3 ly4 ly5 ly6 ly7 ly8 ly9 ly10 uy0 uy1 uy2 uy3 uy4 uy5 uy6 uy7 uy8 uy9 uy10
?padstart pad2 padend paddir cntrul cntrur cntrll cntrlr midlayout startul startur startll startlr
midul midur midll midlr endul endur endll endlr
startul2 endul2 startul3 endul3 startul4 endul4 startul5 endul5
startur2 endur2 startur3 endur3 startur4 endur4 startur5 endur5
startll2 endll2 startll3 endll3 startll4 endll4 startll5 endll5
startlr2 endlr2 startlr3 endlr3 startlr4 endlr4 startlr5 endlr5
#Rll #Rll2 #Rul #Rul2 #Rul3 #All )
??
??(setq #width (getreal "Enter Lange Coupler Width: "))
??(setq #spacing (getreal "Enter Lange Coupler spacing: "))
??(setq #length (getreal "Enter Lange Coupler length: "))
??(setvar "osmode" 0)??
??(setvar "cmdecho" 0)
??(setq lpt0 (list 0? 0? ) ? )
??(setq lpt1 (list #width? 0? ) ? )
??(setq lpt2 (list? (+ (car lpt1) #spacing)? 0? )? )??
??(setq lpt3 (list? (+ (car lpt2) #width)? 0? ) ? )
??(setq lpt4 (list (+ (car lpt3) #spacing)? 0? ) ? )
??(setq lpt5 (list (+ (car lpt4) #width)? 0? ) ? )
??(setq lpt6 (list (+ (car lpt5) #spacing)? 0? ) ? )
??(setq lpt7 (list (+ (car lpt6) #width)? 0? ) ? )
??(setq lpt8 (list (+ (car lpt7) #spacing)? 0? ) ? )
??(setq lpt9 (list (+ (car lpt8) #width)? 0? ) ? )
??(setq lpt10 (list (+ (car lpt9) #spacing)? 0? ) ? )
??
??(setq upt0 (list 0? 0? ) ? )
??(setq upt1 (list 0? 0? ) ? )
??(setq upt2 (list 0? 0? ) ? )
??(setq upt3 (list 0? 0? ) ? )
??(setq upt4 (list 0? 0? ) ? )
??(setq upt5 (list 0? 0? ) ? )
??(setq upt6 (list 0? 0? ) ? )
??(setq upt7 (list 0? 0? ) ? )
??(setq upt8 (list 0? 0? ) ? )
??(setq upt9 (list 0? 0? ) ? )
??(setq upt10 (list 0? 0 ) ? )
??
??(setq upt0 (list 0? #length? ) ? )
??(setq upt1 (list #width? #length? ) ? )
??(setq upt2 (list? (+ (car upt1) #spacing)? #length? )? )??
??(setq upt3 (list? (+ (car upt2) #width)? #length? ) ? )
??(setq upt4 (list (+ (car upt3) #spacing)? #length? ) ? )
??(setq upt5 (list (+ (car upt4) #width)? #length? ) ? )
??(setq upt6 (list (+ (car upt5) #spacing)? #length? ) ? )
??(setq upt7 (list (+ (car upt6) #width)? #length? ) ? )
??(setq upt8 (list (+ (car upt7) #spacing)? #length? ) ? )
??(setq upt9 (list (+ (car upt8) #width)? #length? ) ? )
??(setq upt10 (list (+ (car upt9) #spacing)? #length? ) ? )
??(setq mpt0 (list 0? ( / #length 2.0 )? ) ? )
??(setq midlayout (list (+? (* #width 2.50 ) ? (* #spacing 2.0) ? )
????
? ( cadr mpt0 )
??
? )
??)
(setq
??cntrul (list (+ ? (car midlayout ) 0.25 )
? ? ? (+ ? (cadr midlayout ) 0.60 )
?????????)
??#Rul (+? ( - (car cntrul)? (car lpt4)? )? 0.3 ? )
??#Rul2 (+? #Rul #spacing ? )
???#Rul3 (+? #Rul #width ? )
???
??
??cntrur (list (- ? (car midlayout ) 0.25 )
? ? ? (+ ? (cadr midlayout ) 0.60 )
?????????)
??
??cntrll (list (+ ? (car midlayout ) 0.25 )
? ? ? (- ? (cadr midlayout ) 0.6 )
?????????)
?
??#Rll (+? ( - (car cntrll)? (car lpt4)? )? 0.3 ? )
??
??cntrlr (list (- ? (car midlayout ) 0.25 )
? ? ? (- ? (cadr midlayout ) 0.60 )
?????????)
?startul (list ? (- ? (car midlayout ) (/ #width 2.0) ? ? )
????????????(+ (cadr cntrul)?
?????????????????(sqrt
????????????????????(- ? (* #Rul #Rul )
?????????????????????????(*? (- (car cntrul) (- ? (car midlayout ) (/ #width 2.0))? )
?????????????????????????????(- (car cntrul) (- ? (car midlayout ) (/ #width 2.0))? )
?????????????????????????)
?????????? ? ? )?????
?????????????????)
?????????????)??
???????????)
??endul (list? ? ? (- (car cntrul)? (distance cntrul startul)? )
? ? ? ? ? ;(- ? (car midlayout )
? ? ;???
? ;? ? (-? 2.0 ? #width ? )?
? ? ;???
???????????????????;)
? ;(cadr midlayout )
? (cadr cntrul )
?????????)
???midul? (list
? ;0
? (/ (+ (car startul)? (car endul) ? )? ? 2.0)
? (/ (+ (cadr startul) (cadr endul)? )? ? 2.0)
?????????)
??startur (list ? (+ ? (car midlayout ) (/ #width 2.0) ? ? )
? (+ ? (cadr midlayout ) 1.5 )
??
??????????)
??endur (list? ? ? (+ (car cntrur)? (distance cntrur startur)? )
? ? ? ? ? ;(+ ? (car midlayout )
? ;????
? ;? ? (-? 2.0 ? #width ? )?
? ;????
???????????????????;)
? ;(cadr midlayout )
? (cadr cntrur )
?????????)
??midur? (list
? ;0
? (/ (+ (car startur)? (car endur) ? )? ? 2.0)
? (/ (+ (cadr startur) (cadr endur)? )? ? 2.0)
?????????)
??
??#All? (angle cntrll lpt4)?
??
??startll (list ? (- ? (car midlayout ) (/ #width 2.0) ? ? )
????????????(- (cadr cntrll)?
?????????????????(sqrt
????????????????????(- ? (* #Rll #Rll )
?????????????????????????(*? (- (car cntrll) (- ? (car midlayout ) (/ #width 2.0))? )
?????????????????????????????(- (car cntrll) (- ? (car midlayout ) (/ #width 2.0))? )
?????????????????????????)
?????????? ? ? )?????
?????????????????)
?????????????)??
???????????)
??
??endll (list? ? ? (- (car cntrll)? (distance cntrll startll)? )
? (cadr cntrll )
?????????)
???midll? (list
? (/ (+ (car startll)? (car endll) ? )? ? 2.0)
领英推荐
? (/ (+ (cadr startll) (cadr endll)? )? ? 2.0)
?????????)
??startlr (list ? (+ ? (car midlayout ) (/ #width 2.0) ? ? )
? (- ? (cadr midlayout ) 1.5 ) ??
??????????)
??endlr (list? ? ? (+ (car cntrlr)? (distance cntrlr startlr)? )
??????????
? (cadr cntrlr )
?????????)
???midlr? (list
? (/ (+ (car startlr)? (car endlr) ? )? ? 2.0)
? (/ (+ (cadr startlr) (cadr endlr)? )? ? 2.0)
?????????)
???
??)? ;* end setq
??(prin1 (rtd #All)? )
(setq
???????; startul2 (list? (- (car startul) #spacing) (+ ? (cadr midlayout ) 1.5 ) )
???????startul2 (list ? (- ? (car startul ) #spacing )
????????????(+ (cadr cntrul)?
?????????????????(sqrt
????????????????????(- ? (* #Rul2 #Rul2 )
?????????????????????????(*? (- (car cntrul) ? (- ? (car startul ) #spacing )? )
?????????????????????????????(- (car cntrul) ? (- ? (car startul ) #spacing )? )
?????????????????????????)
?????????? ? ? )?????
?????????????????)
?????????????)??
???????????)
; The following line has been????????
;endul2 (list? ? ? (- (car cntrul)? (distance cntrul startul2)? )
; (cadr cntrul ) ? )
???????
endul2 (list? ? ? (- (car endul)? #spacing? )? (cadr cntrul ) ? )
???????
???????startul3 (list? (- (car startul2) #width) (+ ? (cadr midlayout ) 1.5 ) )
???????
???????
???????
???????endul3 (list? ? ? (- (car cntrul)? (distance cntrul startul3)? )? (cadr cntrul ) ? )
???????startul4 (list? (- (car startul3) #spacing) (+ ? (cadr midlayout ) 1.5 ) )
???????endul4 (list? ? ? (- (car cntrul)? (distance cntrul startul4)? )? (cadr cntrul ) ? )
???????startul5 (list? (- (car startul4) #width) (+ ? (cadr midlayout ) 1.5 ) )
???????endul5 (list? ? ? (- (car cntrul)? (distance cntrul startul5)? )? (cadr cntrul ) ? )
???????startur2 (list ? (+ (car startur ) #spacing)? (+ ? (cadr midlayout ) 1.5 ) ? )
???????endur2 (list? ? ? (+ (car cntrur)? (distance cntrur startur2)? )? (cadr cntrur ) ? )
???????
???????startur3 (list ? (+ (car startur2 ) #width)? (+ ? (cadr midlayout ) 1.5 ) ? )
???????endur3 (list? ? ? (+ (car cntrur)? (distance cntrur startur3)? )? (cadr cntrur ) ? )
???????
???????startll2 (list ? (- ? (car startll ) #spacing )
????????????????(- (cadr cntrll)?
?????????????????(sqrt
????????????????????(- ? (* #Rul2 #Rul2 )
?????????????????????????(*? (- (car cntrll) ? (- ? (car startll ) #spacing )? )
?????????????????????????????(- (car cntrll) ? (- ? (car startll ) #spacing )? )
?????????????????????????)
?????????? ? ? )?????
?????????????????)
?????????????)??
???????????)
???????endll2 (list? ? ? (- (car endll)? #spacing? )? (cadr cntrll ) ? )
???????startll3 (list? (- (car startll2) #width) (- ? (cadr midlayout ) 1.5 ) )
???????endll3 (list? ? ? (- (car cntrll)? (distance cntrll startll3)? )? (cadr cntrll ) ? )
???????startll4 (list? (- (car startll3) #spacing) (- ? (cadr midlayout ) 1.5 ) )
???????endll4 (list? ? ? (- (car cntrll)? (distance cntrll startll4)? )? (cadr cntrll ) ? )
???????startll5 (list? (- (car startll4) #width) (- ? (cadr midlayout ) 1.5 ) )
???????endll5 (list? ? ? (- (car cntrll)? (distance cntrll startll5)? )? (cadr cntrll ) ? )
???????startlr2 (list ? (+ (car startlr ) #spacing)? (-? (cadr midlayout ) 1.5 ) ? )
???????endlr2 (list? ? ? (+ (car cntrlr)? (distance cntrlr startlr2)? )? (cadr cntrlr ) ? )
???????
???????startlr3 (list ? (+ (car startlr2 ) #width)? (- ? (cadr midlayout ) 1.5 ) ? )
???????endlr3 (list? ? ? (+ (car cntrlr)? (distance cntrlr startlr3)? )? (cadr cntrlr ) ? )
???????startlr4 (list ? (+ (car startlr3 ) #spacing)? (- ? (cadr midlayout ) 1.5 ) ? )
???????endlr4 (list? ? ? (+ (car cntrlr)? (distance cntrlr startlr4)? )? (cadr cntrlr ) ? )
???????startlr5 (list ? (+ (car startlr4 ) #width)? (- ? (cadr midlayout ) 1.5 ) ? )
???????endlr5 (list? ? ? (+ (car cntrlr)? (distance cntrlr startlr5)? )? (cadr cntrlr ) ? )
???????
???????
??) ;* end setq
??(print #Rul3)
??
??
??(COMMAND "ARC" "C" cntrul startul endul)
??(COMMAND "ARC" "C" cntrur endur startur)
??(COMMAND "ARC" "C" cntrul startul2 endul2)
??(COMMAND "ARC" "C" cntrur endur2 startur2)
??
??(COMMAND "ARC" "C" cntrul startul3 endul3)
??(COMMAND "ARC" "C" cntrur endur3 startur3)
??
??(COMMAND "ARC" "C" cntrul startul4 endul4)
??(COMMAND "ARC" "C" cntrur endur4 startur4)
??
??(COMMAND "ARC" "C" cntrul startul5 endul5)
??(COMMAND "ARC" "C" cntrur endur5 startur5)
??(COMMAND "ARC" "C" cntrll endll startll)
??(COMMAND "ARC" "C" cntrlr startlr endlr )
??(COMMAND "ARC" "C" cntrll endll2 startll2)
??(COMMAND "ARC" "C" cntrlr startlr2 endlr2)
??(COMMAND "ARC" "C" cntrll endll3 startll3)
??(COMMAND "ARC" "C" cntrlr startlr3 endlr3)
??(COMMAND "ARC" "C" cntrlr startlr4 endlr4)
??(COMMAND "ARC" "C" cntrlr startlr5 endlr5)
??(COMMAND "PLINE" endll endul "" )
??(COMMAND "PLINE" endll2 endul2 "" )
??(COMMAND "PLINE" endll3 endul3 "" )
??(COMMAND "PLINE" endur endlr "" )
??(COMMAND "PLINE" endur2 endlr2 "" )
??(COMMAND "PLINE" endur3 endlr3 "" )
??
??(setq mpt1 (list #width? ( / #length 2.0 )? ) ? )
??(setq mpt2 (list? (+ (car upt1) #spacing)? ( / #length 2.0 )? )? )??
??(setq mpt3 (list? (+ (car upt2) #width)? ( / #length 2.0 )? ) ? )
??(setq mpt4 (list (+ (car upt3) #spacing)? ( / #length 2.0 )? ) ? )
??(setq mpt5 (list (+ (car upt4) #width)? ( / #length 2.0 )? ) ? )
??(setq mpt6 (list (+ (car upt5) #spacing)? ( / #length 2.0 )? ) ? )
??(setq mpt7 (list (+ (car upt6) #width)? ( / #length 2.0 )? ) ? )
??(setq mpt8 (list (+ (car upt7) #spacing)? ( / #length 2.0 )? ) ? )
??(setq mpt9 (list (+ (car upt8) #width)? ( / #length 2.0 )? ) ? )
??(setq mpt10 (list (+ (car upt9) #spacing)? ( / #length 2.0 )? ) ? )
??
(setq padstart (list (car endul4)? (- (cadr endul4)? 1? ) ? ? )
)
(setq pad2 (list (- (car endul4) 1.4 ) (-? (cadr endul4) 1.4 )
???????????)
)
(setq padend? (list? (car endul5) (+ (cadr endul5) 0)
? ? ? )
)
(COMMAND "ARC" padstart pad2 padend)
?
?(COMMAND "PLINE" startul5 (list (car upt0) (+ (cadr upt0) 1? ) ) (list -30 (+ (cadr upt0) 1 ) ) "")
??
?(COMMAND "PLINE"? padstart endul4 ? ? "")
?(COMMAND "PLINE"? startul4 (list (car upt1) (+ (cadr upt1) 1) ) (list? (car upt4) (+ (cadr upt1) 1 )? )? ? ? "")
?
?(COMMAND "PLINE" (list (- (car lpt2) 30 ) -1? ) (list (car lpt2) (- (cadr lpt2) 1? )? ) startll3 ? "")
??
?(COMMAND "PLINE" startul3? upt2 upt3 startul2 "")
??
?(COMMAND "PLINE" (list (- (car lpt3) 15 )? -15? )? (list (car lpt3) (- (cadr lpt3) 2 ) )? startll2 "")
?(COMMAND "PLINE" (list (+ (car lpt4) 15 )? -15? ) ? (list (car lpt4) (- (cadr lpt4) 2 ) ) startll? "")
?(COMMAND "PLINE" startul ? (list (car upt4) (+ (cadr upt4) 1) )? "")
???
?(COMMAND "PLINE" (list (car lpt5) (- (cadr lpt5) 1) ) startlr "")
??(COMMAND "PLINE" startur ? upt5 (list (car upt5) (+ (cadr upt5) 2) )
? ? ? (list (- (car upt5) 15)? (+ (cadr upt5) 15) )? "")
??
?(COMMAND "PLINE" (list (car lpt5) (- (cadr lpt5) 1 )? )
? ? (list (car lpt8) (- (cadr lpt5) 1 ) )? lpt8 "")
(setq padstart (list (car endlr4)? (+ (cadr endlr4)? 1? ) ? ? )
)
(setq pad2 (list (+ (car endlr4) 1.4 ) (+? (cadr endlr4) 1.4 )
???????????)
)
(setq padend? (list (car endlr5) (- (cadr endlr5) 0)
? ? ? )
)
?(COMMAND "PLINE" (list (+ (car upt6) 15) (+ (cadr upt6) 15)? )? (list (car upt6) (+ (cadr upt6) 2 ) ) startur2? "")
(COMMAND "PLINE"? startlr2 lpt6 lpt7 startlr3 "")
(COMMAND "PLINE"? startur3? (list (car upt7) (+ (cadr upt7) 1 ) )? (list (+ (car upt7) 15) (+ (cadr upt7) 1 )? )? "")
?
??(COMMAND "PLINE" lpt8 startlr4 "")
??
??(COMMAND "PLINE" startlr5 (list (car lpt9) (- (cadr lpt9) 1 ) ) (list (+ (car lpt9) 10) ? (- (cadr lpt9) 1 )? ) ? "")
??
(COMMAND "ARC" padstart pad2 padend)
(COMMAND "PLINE"? padstart endlr4 ? ? "")
(princ)
??)? ;end Lange
(defun DTR (a)
??(* PI? (/ a 180.0 ))
) ; end def DTR
(defun RTD (a)
??(* 180? (/ a PI ))
) ; end def DTR?
?
??; PROGRAM END