123 lines
2.6 KiB
Tcl
123 lines
2.6 KiB
Tcl
# read 8 ADC channels with taskit RS232 ADC
|
|
namespace eval ana8 {
|
|
}
|
|
|
|
if {![namespace exists lsc]} {
|
|
source drivers/lsc.tcl
|
|
}
|
|
|
|
proc stdConfig::ana8 {channel {scale 1} {offset 0} {curve ""}} {
|
|
|
|
controller std "\r" 2
|
|
prop node_$channel 0
|
|
prop time_$channel 0
|
|
poll 1 read ana8::poll
|
|
|
|
pollperiod 5
|
|
obj ANA8 rd
|
|
prop read "ana8::read $channel"
|
|
variable name
|
|
variable path
|
|
kids "$name analog input" {
|
|
node scale par $scale
|
|
|
|
node offset par $offset
|
|
|
|
node raw upd
|
|
|
|
node curve out -text
|
|
prop width 32
|
|
prop model 0
|
|
prop check ana8::curve
|
|
prop write stdSct::completeUpdate
|
|
|
|
kids "calibration" {
|
|
hfactory $path/points plain mugger floatvarar 1
|
|
}
|
|
}
|
|
if {$curve ne "" && $curve ne "raw"} {
|
|
hset /$name/curve $curve
|
|
} else {
|
|
hupdate /$name/curve ""
|
|
}
|
|
return "ANA8"
|
|
}
|
|
|
|
proc ana8::start {} {
|
|
# set adc rate to 11
|
|
sct send ":10000D000102000B.."
|
|
return ana8::start2
|
|
}
|
|
|
|
proc ana8::start2 {} {
|
|
# set all i/o to output / push-pull / low
|
|
sct send ":10000000030600FF00FF0000.."
|
|
return ana8::getidn
|
|
}
|
|
|
|
proc ana8::getidn {} {
|
|
sct send ":0300030001.."
|
|
return stdSct::completeStart
|
|
}
|
|
|
|
proc ana8::read {channel} {
|
|
sct node_$channel [sct]
|
|
sct time_$channel [DoubleTime]
|
|
return idle
|
|
}
|
|
|
|
proc ana8::poll {} {
|
|
set now [DoubleTime]
|
|
set channels [list ]
|
|
foreach channel {0 1 2 3 4 5 6 7} {
|
|
if {$now < [silent 0 sct time_$channel] + 30} {
|
|
lappend channels $channel
|
|
}
|
|
}
|
|
if {[llength $channels] == 0} {
|
|
return idle
|
|
}
|
|
set first [lindex $channels 0]
|
|
set nchan [expr [lindex $channels end] - $first + 1]
|
|
if {$nchan > 0} {
|
|
sct channels $channels
|
|
sct nchan $nchan
|
|
sct send ":04000${first}000${nchan}.."
|
|
return ana8::update
|
|
}
|
|
return idle
|
|
}
|
|
|
|
proc ana8::update {} {
|
|
set first [lindex [sct channels] 0]
|
|
set nb [format %.2X [expr [sct nchan] * 2]]
|
|
set res [scan [sct result] ":04${nb}%4x%4x%4x%4x%4x%4x%4x%4x" a0 a1 a2 a3 a4 a5 a6 a7]
|
|
if {$res < [sct nchan]} {
|
|
error "bad response to '[sct send]': '[sct result]'"
|
|
}
|
|
foreach ch [sct channels] {
|
|
set i [expr $ch - $first]
|
|
set scale [hval [sct node_$ch]/scale]
|
|
set offset [hval [sct node_$ch]/offset]
|
|
# 26214 = (2^32-1) steps / 2.5 V
|
|
set raw [expr [set a$i] / 26214. * $scale + $offset]
|
|
set node [sct node_$ch]
|
|
updateval $node/raw $raw
|
|
if {[hval $node/curve] eq ""} {
|
|
updateval $node $raw
|
|
} else {
|
|
set t [interpolate [hvali $node/curve/points] 0 $raw logy extrapolate]
|
|
updateval $node $t
|
|
}
|
|
}
|
|
return idle
|
|
}
|
|
|
|
proc ana8::curve {} {
|
|
if {[sct requested] ne "" && [sct requested] ne "raw"} {
|
|
lsc::read_curve
|
|
}
|
|
}
|
|
|
|
|