Files
sea/tcl/archive/drivers/ana8.tcl
l_samenv 4d9961fe5c add archive (files probably no longer used)
here we can find old files
2022-08-22 15:28:09 +02:00

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
}
}