Skip to content

Commit a501a13

Browse files
Merge pull request #380 from matthew-kapp/heating-resistor
Made PR#349 mergeable
2 parents b6801d4 + 78d1805 commit a501a13

File tree

4 files changed

+67
-102
lines changed

4 files changed

+67
-102
lines changed

src/Electrical/Analog/ideal_components.jl

Lines changed: 61 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -18,30 +18,57 @@ node.
1818
end
1919

2020
"""
21-
Resistor(; name, R)
21+
Resistor(; name, R = 1.0, T_ref = 300.15, alpha = 0, T_dep = false)
2222
23-
Creates an ideal Resistor following Ohm's Law.
23+
Generic resistor with optional temperature dependency.
2424
2525
# States:
2626
27-
See [OnePort](@ref)
27+
- See [OnePort](@ref)
28+
- `R(t)`: [`Ω`] Resistance (temperature dependent if `T_dep = true`)
2829
2930
# Connectors:
3031
3132
- `p` Positive pin
3233
- `n` Negative pin
34+
- `heat_port` [HeatPort](@ref) (only if `T_dep = true`) Heat port to model the temperature dependency
3335
3436
# Parameters:
3537
36-
- `R`: [`Ohm`] Resistance
38+
- `R`: [`Ω`] Reference resistance
39+
- `T_ref`: [K] Reference temperature
40+
- `alpha`: [K⁻¹] Temperature coefficient of resistance
41+
- `T_dep`: [bool] Temperature dependency
3742
"""
3843
@mtkmodel Resistor begin
3944
@extend v, i = oneport = OnePort()
45+
46+
@structural_parameters begin
47+
T_dep = false
48+
end
49+
4050
@parameters begin
41-
R, [description = "Resistance"]
51+
R = 1.0, [description = "Reference resistance"]
52+
T_ref = 300.15, [description = "Reference temperature"]
53+
alpha = 0.0, [description = "Temperature coefficient of resistance"]
4254
end
43-
@equations begin
44-
v ~ i * R
55+
56+
if T_dep
57+
@components begin
58+
heat_port = HeatPort()
59+
end
60+
@variables begin
61+
R_T(t), [description = "Temperature-dependent resistance"]
62+
end
63+
@equations begin
64+
R_T ~ R * (1 + alpha * (heat_port.T - T_ref)) # Temperature-dependent resistance
65+
heat_port.Q_flow ~ -v * i # -LossPower
66+
v ~ i * R_T # Ohm's Law
67+
end
68+
else
69+
@equations begin
70+
v ~ i * R # Ohm's Law for constant resistance
71+
end
4572
end
4673
end
4774

@@ -178,47 +205,6 @@ See [OnePort](@ref)
178205
end
179206
end
180207

181-
"""
182-
HeatingResistor(; name, R_ref = 1.0, T_ref = 300.15, alpha = 0)
183-
184-
Temperature dependent electrical resistor
185-
186-
# States
187-
188-
- See [OnePort](@ref)
189-
- `R(t)`: [`Ohm`] Temperature dependent resistance `R ~ R_ref*(1 + alpha*(heat_port.T(t) - T_ref))`
190-
191-
# Connectors
192-
193-
- `p` Positive pin
194-
- `n` Negative pin
195-
196-
# Parameters:
197-
198-
- `R_ref`: [`Ω`] Reference resistance
199-
- `T_ref`: [K] Reference temperature
200-
- `alpha`: [K⁻¹] Temperature coefficient of resistance
201-
"""
202-
@mtkmodel HeatingResistor begin
203-
@extend v, i = oneport = OnePort()
204-
@components begin
205-
heat_port = HeatPort()
206-
end
207-
@parameters begin
208-
R_ref = 1.0, [description = "Reference resistance"]
209-
T_ref = 300.15, [description = "Reference temperature"]
210-
alpha = 0, [description = "Temperature coefficient of resistance"]
211-
end
212-
@variables begin
213-
R(t), [guess = R_ref]
214-
end
215-
@equations begin
216-
R ~ R_ref * (1 + alpha * (heat_port.T - T_ref))
217-
heat_port.Q_flow ~ -v * i # -LossPower
218-
v ~ i * R
219-
end
220-
end
221-
222208
"""
223209
EMF(; name, k)
224210
@@ -264,9 +250,9 @@ Electromotoric force (electric/mechanic transformer)
264250
end
265251

266252
"""
267-
Diode(; name, Is = 1e-6, n = 1, T = 300.15)
253+
Diode(; name, Is = 1e-6, n = 1, T = 300.15, T_dep = false)
268254
269-
Ideal diode based on the Shockley diode equation.
255+
Generic diode with optional temperature dependency.
270256
271257
# States
272258
@@ -276,70 +262,48 @@ Ideal diode based on the Shockley diode equation.
276262
277263
- `p` Positive pin
278264
- `n` Negative pin
265+
- `port` [HeatPort](@ref) (only if `T_dep = true`) Heat port to model variable temperature dependency
279266
280-
# Parameters
281-
267+
# Parameters:
268+
282269
- `Is`: [`A`] Saturation current
283270
- `n`: Ideality factor
284-
- `T`: [K] Ambient temperature
271+
- `T`: [K] Constant ambient temperature - only used if T_dep=false
272+
- `T_dep`: [bool] Temperature dependency
285273
"""
286274
@mtkmodel Diode begin
287275
@constants begin
288276
k = 1.380649e-23 # Boltzmann constant (J/K)
289277
q = 1.602176634e-19 # Elementary charge (C)
290278
end
291279
@extend v, i = oneport = OnePort(; v = 0.0)
292-
@parameters begin
293-
Is = 1e-6, [description = "Saturation current (A)"]
294-
n = 1, [description = "Ideality factor"]
295-
T = 300.15, [description = "Ambient temperature"]
296-
end
297-
@equations begin
298-
i ~ Is * (exp(v * q / (n * k * T)) - 1)
299-
end
300-
end
301-
302-
"""
303-
HeatingDiode(; name, Is = 1e-6, n = 1)
304280

305-
Temperature dependent diode based on the Shockley diode equation.
306-
307-
# States
308-
309-
- See [OnePort](@ref)
310-
311-
# Connectors
312-
313-
- `p` Positive pin
314-
- `n` Negative pin
315-
- `port` [HeatPort](@ref) Heat port to model the temperature dependency
316-
317-
# Parameters:
318-
319-
- `Is`: [`A`] Saturation current
320-
- `n`: Ideality factor
321-
"""
322-
@mtkmodel HeatingDiode begin
323-
begin
324-
k = 1.380649e-23 # Boltzmann constant (J/K)
325-
q = 1.602176634e-19 # Elementary charge (C)
281+
@structural_parameters begin
282+
T_dep = false
326283
end
327284

328-
@extend v, i = oneport = OnePort(; v = 0.0)
329-
@components begin
330-
port = HeatPort()
331-
end
332285
@parameters begin
333286
Is = 1e-6, [description = "Saturation current (A)"]
334287
n = 1, [description = "Ideality factor"]
288+
T = 300.15, [description = "Ambient temperature"]
335289
end
336-
@variables begin
337-
Vt(t), [description = "Thermal voltage"]
338-
end
339-
@equations begin
340-
Vt ~ k * port.T / q # Thermal voltage equation
341-
i ~ Is * (exp(v / (n * Vt)) - 1) # Shockley diode equation
342-
port.Q_flow ~ -v * i # -LossPower
290+
291+
if T_dep
292+
@components begin
293+
port = HeatPort()
294+
end
295+
@variables begin
296+
Vt(t), [description = "Thermal voltage"]
297+
end
298+
@equations begin
299+
Vt ~ k * port.T / q # Thermal voltage equation
300+
i ~ Is * (exp(v / (n * Vt)) - 1) # Shockley diode equation with temperature dependence
301+
port.Q_flow ~ -v * i # -LossPower
302+
end
303+
else
304+
@equations begin
305+
i ~ Is * (exp(v * q / (n * k * T)) - 1) # Shockley diode equation
306+
end
343307
end
344308
end
345309

src/Electrical/Electrical.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ include("utils.jl")
1515

1616
export Capacitor,
1717
Ground, Inductor, Resistor, Conductor, Short, IdealOpAmp, EMF,
18-
HeatingResistor, Diode, HeatingDiode, VariableResistor
18+
Diode, VariableResistor
1919
include("Analog/ideal_components.jl")
2020

2121
export CurrentSensor, PotentialSensor, VoltageSensor, PowerSensor, MultiSensor

test/Electrical/analog.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ end
416416
@test capacitor_voltage[end].8.26 rtol=3e-1
417417

418418
# For visual inspection
419-
# plt = plot(sol; vars = [diode.i, resistor.i, capacitor.v],
419+
# plt = plot(sol; idxs = [diode.i, resistor.i, capacitor.v],
420420
# size = (800, 600), dpi = 300,
421421
# labels = ["Diode Current" "Resistor Current" "Capacitor Voltage"],
422422
# title = "Diode Test")
@@ -438,7 +438,7 @@ end
438438
resistor = Resistor(R = R)
439439
capacitor = Capacitor(C = C, v = 0.0)
440440
source = Voltage()
441-
heating_diode = HeatingDiode(n = n, Is = Is)
441+
heating_diode = Diode(n = n, Is = Is, T_dep = true)
442442
ac = Sine(frequency = f, amplitude = V)
443443
ground = Ground()
444444
temp = FixedTemperature(T = T)

test/multi_domain.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,14 @@ end
175175
end
176176
end
177177

178-
@testset "El. Heating Circuit" begin
178+
@testset "Electrical Heating Circuit" begin
179179
@mtkmodel ElHeatingCircuit begin
180180
@components begin
181181
ground = Ground()
182182
source = Voltage()
183183
voltage_sine = Blocks.Sine(amplitude = 220, frequency = 1)
184-
heating_resistor = HeatingResistor(R_ref = 100, alpha = 1e-3, T_ref = 293.15)
184+
heating_resistor = Resistor(R = 100, alpha = 1e-3,
185+
T_ref = 293.15, T_dep = true)
185186
thermal_conductor = ThermalConductor(G = 50)
186187
env = FixedTemperature(T = 273.15 + 20)
187188
end

0 commit comments

Comments
 (0)