heliox: improve drivers

- adjustable sorb temperatures
- two phases: one for about 5 min at sorbset1, then sorbset2
This commit is contained in:
2025-07-11 14:11:30 +02:00
parent 4941232be6
commit e8baff57d7

View File

@ -41,6 +41,18 @@ proc stdConfig::heliox {} {
prop check heliox::check_condenseflow
prop help "flow for condensing"
prop write stdSct::complete
node sorbset1 par 40
prop help "sorb T for condensing phase 1"
node sorbset2 par 30
prop help "sorb T for condensing phase 2"
node ts_threshold par 2.7
prop help "ts threshold to trigger condensation"
prop write stdSct::complete
}
catch {
hsetprop /tt getsample hvali /th/pot
@ -116,6 +128,8 @@ proc heliox::check_set {} {
tt dblctrl 0
tt set 1.25
catch {hdelprop /ts/mode soft_deadline}
catch {hdelprop /ts/mode condense_deadline}
catch {hdelprop /ts/mode deadline1}
}
default {
error "bad mode"
@ -185,13 +199,15 @@ proc heliox::check_mode {} {
th set 0
th setsorb/channel C
th mainloop set
th setsorb 40
th setsorb [hvali [sct parent]/sorbset1]
tt set 1.25
tt dblctrl 0
set state "-> condense"
hsetprop /th target 0.25
hsetprop /ts target 0.25
catch {hdelprop /ts/mode soft_deadline}
catch {hdelprop /ts/mode condense_deadline}
catch {hdelprop /ts/mode deadline1}
}
}
setmainsensor $mainsensor
@ -250,12 +266,34 @@ proc heliox::read {} {
}
}
if {$mode == 4} {
if {$ts > 3} {
# try first to heat sorb to sorbset2
# when reached, wait 5 minutes or ts > ts_threshold
# then wait for ts < ts_threshold
# set sorb to sorbset2 and calcualte condense_deadline
# as soon as the calculated target hours (from vapor pressure
# of helium3 at ts) is bigger than the target_hours parameter,
# sorb heating is stopped and cooldown starts
set deadline1 [silent 0 sct deadline1]
set condense_deadline [silent 0 sct condense_deadline]
if {$deadline1 == 0} {
set deadline1 [expr $now + 300]
sct deadline1 $deadline1
}
if {[result th sorb] < [result th setsorb] - 1} {
sct deadline1 [expr $now + 300]
return idle
} elseif {$now < $deadline1 && $ts < [hvali [sct parent]/ts_threshold]} {
return idle
} elseif {$ts > [hvali [sct parent]/ts_threshold] || $condense_deadline == 0} {
# above 3 K: set deadline
nv set [hvali [sct parent]/condenseflow]
set lasts_until 0
set sorbset2 [hvali [sct parent]/sorbset2]
if {[result th setsorb] != $sorbset2} {
th setsorb $sorbset2
}
sct condense_deadline [expr $now + 3600]
} elseif {[result th sorb] > 39} {
} else {
nv set [hvali [sct parent]/condenseflow]
# 3He vapor pressure: 200 mbar at 2 K, power law
set p [expr 200 * ($ts / 2.0) ** 3.5]
@ -268,7 +306,6 @@ proc heliox::read {} {
set target_hours [hvali [sct parent]/target_hours]
set lasts_until [expr int($now + $hours * 3600)]
calc_pot $lasts_until
sct condense_deadline [silent [expr $now + 3600] sct condense_deadline]
if {$hours > 8} {
set dl [expr $now + ($target_hours - $hours) * 30]
set sdl [silent $dl sct soft_deadline]
@ -278,7 +315,7 @@ proc heliox::read {} {
clientput "stop condensing - target_hours is probably too high - expect only [expr round($hours)] h hold time"
set target_hours $hours
}
} elseif {$now > [sct condense_deadline]} {
} elseif {$now > $condense_deadline} {
clientput "condense timeout - hold time is probably very low"
set target_hours $hours
}