set scaleval 2000.0 set rampstep 100 set rampdelay 3 set motdir 1 set pulserstate 0 proc SetVoltScale {newscaleval} { global scaleval set scaleval $newscaleval } proc VoltScale {involt} { global scaleval return [expr {($involt*1.0)/$scaleval}] } proc SetRampParms {_rampstep _rampdelay} { global rampstep rampdelay set rampstep $_rampstep set rampdelay $_rampdelay } proc SetVolt {volt} { global pulserstate if {$volt== 0} { PulserOff set pulserstate 0 } else { set pulservolt [VoltScale $volt] # sct_pulser send "VOLT:OFFS $pulservolt; OFFS?" # PulserDC $pulservolt if {$pulserstate==0} { PulserDC $pulservolt PulserOn set pulserstate 1 } else { sct_pulser send "VOLT:OFFS $pulservolt; OFFS?" PulserOn } } } proc VoltSetStep {start step fin delay} { set i [expr {$start*1.0}] set loopvar 1 SetVolt $i if {($start == $fin) || ($step == 0)} {break} while {$loopvar} { wait $delay if {($start < $fin)} { set i [expr {$i + abs($step)}] if {$i >= $fin} { set i $fin set loopvar 0 } } if {($start > $fin)} { set i [expr {$i - abs($step)}] if {$i <= $fin} { set i $fin set loopvar 0 } } SetVolt $i } } proc GetVolt {} { sct_pulser transact VOLT:OFFS? } proc SingleVolt {volt oscno} { histmem mode unlimited newfile HISTOGRAM_XY SetVolt $volt oct oscillate_count $oscno oct oscillate start save 0 } proc SetDC {} { pulseroff #NOTE: Setting FUNC DC generates a remote ctrl error if the # burst mode happens to be on set resp [sct_pulser send "BURS:STAT OFF;:FUNC DC;:VOLT:OFFS 0; OFFS?"] pulseron } proc VoltRamp {start step fin oscno} { histmem mode unlimited newfile HISTOGRAM_XY set loopvar 1 set i 0 while {$loopvar} { set j [expr {$i*$step+$start}] if {$j> $fin && $step > 0} {break} if {$j< $fin && $step < 0} {break} SetVolt $j oct oscillate_count $oscno oct oscillate start save $i incr i } } proc SingleVTexScan {mot tstart tstep tfin oscno} { global motdir broadcast in singlevtexscan set loopvar 1 set i_bool 0 histmem mode unlimited if {$motdir == 1} { set currentmot $tstart set i 0 } else { set currentmot $tfin set i [expr {int(($tfin-$tstart)/$tstep)}] } newfile HISTOGRAM_XY while {$i_bool==0} { drive $mot $currentmot oct oscillate_count $oscno oct oscillate start hmm countblock save $i if {($motdir > 0)} { set currentmot [expr {$currentmot + $tstep}] if {$currentmot > $tfin} {set i_bool 1} incr i } else { set currentmot [expr {$currentmot - $tstep}] if {$currentmot < $tstart} {set i_bool 1} incr i -1 } } set motdir [expr {(-1*$motdir)}] } proc VListTexScan {voltlist mot tstart tstep tfin oscno} { global rampstep rampdelay set curvolt [lindex $voltlist 0] broadcast $curvolt SetVolt $curvolt foreach volt $voltlist { broadcast $volt VoltSetStep $curvolt $rampstep $volt $rampdelay SingleVTexScan $mot $tstart $tstep $tfin $oscno } } proc SquarePulseTexture {motor start step numsteps volt freq bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT histmem_period_strobo $freq $bins wait 3 set pulservolt [VoltScale $volt] PulserSquare $freq $pulservolt PulserOn for {set i 0} {$i < $numsteps} {incr i} { drive $motor [expr $i*$step+$start] oct oscillate_count $oscno oct oscillate start save $i } } proc UniPulseTexture {motor start step numsteps volt freq bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT histmem_period_strobo $freq $bins wait 3 set pulservolt [VoltScale [expr {$volt*1.0}]] set pulseroffs [VoltScale [expr {$volt*0.5}]] PulserSquareOffs $freq $pulservolt $pulseroffs PulserOn for {set i 0} {$i < $numsteps} {incr i} { drive $motor [expr $i*$step+$start] oct oscillate_count $oscno oct oscillate start save $i } } proc BehlkePulseTexture {motor start step numsteps freq bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT histmem_period_strobo $freq $bins wait 3 PulserSquareOffs $freq 2.5 2.5 PulserOn for {set i 0} {$i < $numsteps} {incr i} { drive $motor [expr $i*$step+$start] oct oscillate_count $oscno oct oscillate start save $i } } proc SquarePulseVolt {start step fin freq bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT histmem_period_strobo $freq $bins wait 3 set loopvar 1 set i 0 while {$loopvar} { set j [expr {$i*$step+$start}] if {$j> $fin && $step > 0} {break} if {$j< $fin && $step < 0} {break} if {$j== 0} { PulserOff } else { set pulservolt [VoltScale $j] PulserSquare $freq $pulservolt PulserOn # sct_pulser send "APPL:SQU $freq,$pulservolt,0" } oct oscillate_count $oscno oct oscillate start save $i incr i } } proc SquarePulseFreq {volt freqlist bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT set loopvar 1 set i 0 foreach freq $freqlist { set pulservolt [VoltScale $volt] histmem_period_strobo $freq $bins wait 3 PulserSquare $freq $pulservolt PulserOn # sct_pulser send "APPL:SQU $freq,$pulservolt,0" oct oscillate_count $oscno oct oscillate start save $i incr i } } proc BehlkePulseFreq {freqlist bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT set loopvar 1 set i 0 foreach freq $freqlist { histmem_period_strobo $freq $bins wait 3 PulserSquareOffs $freq 2.5 2.5 PulserOn oct oscillate_count $oscno oct oscillate start save $i incr i } } proc SinePulseFreq {volt freqlist bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT set loopvar 1 set i 0 foreach freq $freqlist { set pulservolt [VoltScale $volt] histmem_period_strobo $freq $bins wait 3 PulserSin $freq $pulservolt PulserOn oct oscillate_count $oscno oct oscillate start save $i incr i } } proc UniPulseFreq {volt freqlist bins oscno} { histmem mode unlimited newfile HISTOGRAM_XYT set loopvar 1 set i 0 foreach freq $freqlist { histmem_period_strobo $freq $bins wait 3 # PulserSquareOffs $freq $pulservolt [expr {$pulservolt/2}] set pulservolt [VoltScale [expr {$volt*1.0}]] set pulseroffs [VoltScale [expr {$volt*0.5}]] PulserSquareOffs $freq $pulservolt $pulseroffs PulserOn # sct_pulser send "APPL:SQU $freq,$pulservolt,[expr {$pulservolt/2}]" oct oscillate_count $oscno oct oscillate start save $i incr i } } proc UniPulseFatigue {volt freq bins oscno reps runs} { histmem mode unlimited set pulservolt [VoltScale $volt] set halfvolt [expr {$pulservolt/2.0}] histmem_period_strobo $freq $bins wait 3 PulserSquareOffs $freq $halfvolt $halfvolt PulserOn for {set i 0} {$i<$runs} {incr i} { newfile HISTOGRAM_XYT for {set j 0} {$j<$reps} {incr j} { oct oscillate_count $oscno oct oscillate start save $j } oscmd stop } PulserOff set pulserstate 0 Histmem_strobo_off } proc PulserBurst {} { sct_pulser send "BURS:MODE TRIG; MODE?" sct_pulser send "TRIG:SOUR BUS; SOUR?" sct_pulser send "BURS:STAT ON; STAT?" PulserOn sct_pulser send "*TRG;:BURS:NCYC?" while {1} { set sval [sct_pulser transact *OPC?] if {[string first 1 $sval] >-1} {break} } PulserOff set pulserstate 0 } proc VoltPulseRun {vlo vhi freq cycl} { PulserOff sct_pulser send "VOLT:LOW [VoltScale $vlo]; LOW?" sct_pulser send "VOLT:HIGH [VoltScale $vhi]; HIGH?" sct_pulser send "FREQ $freq;:FREQ?" sct_pulser send "BURS:PHAS [expr {90.0 - ($vhi*180.0)/(($vhi-$vlo)*1.0)}]; PHAS?" sct_pulser send "BURS:MODE TRIG; MODE?" set ploop [expr {int($cycl/50000)}] set prem [expr {$cycl % 50000}] if {$ploop >0} { for {set i 0} {$i< $ploop} {incr i} { Pulser send "BURS:NCYC 50000; NCYC?" PulserBurst } } sct_pulser send "BURS:NCYC $prem; NCYC?" PulserBurst PulserOff set pulserstate 0 sct_pulser send "BURS:STAT OFF; STAT?" } proc VoltPulses {vlo vhi freq cycl} { PulserOff sct_pulser send "FUNC SQU;:FUNC?" VoltPulseRun $vlo $vhi $freq $cycl } proc VoltTriPulses {vlo vhi freq cycl} { PulserOff sct_pulser send "FUNC RAMP;:FUNC?" sct_pulser send "FUNC:RAMP:SYMM 50;:FUNC:RAMP:SYMM?" VoltPulseRun $vlo $vhi $freq $cycl } proc OneTri {volt period} { PulserOff if {$volt > 0} { sct_pulser send "VOLT:LOW 0; LOW?" sct_pulser send "VOLT:HIGH [VoltScale $volt]; HIGH?" sct_pulser send "BURS:PHAS -90; PHAS?" } else { sct_pulser send "VOLT:LOW [VoltScale $volt]; LOW?" sct_pulser send "VOLT:HIGH 0; HIGH?" sct_pulser send "BURS:PHAS 90; PHAS?" } sct_pulser send "FUNC RAMP;:FUNC?" sct_pulser send "FUNC:RAMP:SYMM 50;:FUNC:RAMP:SYMM?" sct_pulser send "FREQ [expr {1.0/$period}];:FREQ?" sct_pulser send "BURS:MODE TRIG; MODE?" sct_pulser send "BURS:NCYC 1; NCYC?" PulserBurst PulserOff set pulserstat 0 } publish GetVolt user publish SetDC user publish SetVolt user publish SetVoltScale user publish SingleVTexScan user publish VListTexScan user publish SetRampParms user publish SingleVolt user publish VoltRamp user publish SquarePulseVolt user publish SquarePulseFreq user publish UniPulseFreq user publish VoltTextureRamp user publish VoltPulses user publish VoltPulseRun user publish VoltTriPulses user publish OneTri user publish UniPulseFatigue user publish SquarePulseTexture user publish BehlkePulseTexture user publish BehlkePulseFreq user publish UniPulseTexture user publish VoltSetStep user