114 lines
4.5 KiB
Bash
114 lines
4.5 KiB
Bash
|
|
#!/bin/sh
|
|||
|
|
|
|||
|
|
votage_division_factor_0="1"
|
|||
|
|
votage_division_factor_1="1"
|
|||
|
|
votage_division_factor_2="1"
|
|||
|
|
votage_division_factor_3="0.8"
|
|||
|
|
votage_division_factor_4="0.6"
|
|||
|
|
votage_division_factor_5="0.6"
|
|||
|
|
votage_division_factor_6="0.2326"
|
|||
|
|
votage_division_factor_7="1"
|
|||
|
|
|
|||
|
|
ADC128_Channel0_name="Channel 0"
|
|||
|
|
ADC128_Channel1_name="Channel 1"
|
|||
|
|
ADC128_Channel2_name="Channel 2"
|
|||
|
|
ADC128_Channel3_name="Channel 3"
|
|||
|
|
ADC128_Channel4_name="Channel 4"
|
|||
|
|
ADC128_Channel5_name="Channel 5"
|
|||
|
|
ADC128_Channel6_name="Channel 6"
|
|||
|
|
ADC128_Channel7_name="Channel 7"
|
|||
|
|
|
|||
|
|
REG_adc128_config="0x00"
|
|||
|
|
REG_adc128_advance="0x0b"
|
|||
|
|
REG_adc128_status="0x0c"
|
|||
|
|
REG_adc128_ch0="0x20"
|
|||
|
|
REG_adc128_ch1="0x21"
|
|||
|
|
REG_adc128_ch2="0x22"
|
|||
|
|
REG_adc128_ch3="0x23"
|
|||
|
|
REG_adc128_ch4="0x24"
|
|||
|
|
REG_adc128_ch5="0x25"
|
|||
|
|
REG_adc128_ch6="0x26"
|
|||
|
|
REG_adc128_ch7="0x27"
|
|||
|
|
|
|||
|
|
# 进行ADC128芯片的初始化
|
|||
|
|
check_adc128_init(){
|
|||
|
|
# Get Reg 0x00 status
|
|||
|
|
res_adc128_status=`i2cget -y $i2c_bus $chip_slave $REG_adc128_config`
|
|||
|
|
format_log_print $INFO "REG adc128 STATUS : $res_adc128_status"
|
|||
|
|
|
|||
|
|
# if stauts is not 0x01 (Start Monitor) ,then do init
|
|||
|
|
if [ "$res_adc128_status" != "0x01" ];then
|
|||
|
|
format_log_print $INFO "Start Init ADC128 Chip"
|
|||
|
|
# Init ADC128 work as mode 1 (0x02)
|
|||
|
|
res_adc128_advance=`i2ctransfer -y $i2c_bus w2@$chip_slave $REG_adc128_advance 0x02`
|
|||
|
|
# Set ADC128 on start (0x01)
|
|||
|
|
res_adc128_setstart=`i2ctransfer -y $i2c_bus w2@$chip_slave $REG_adc128_config 0x01 r1`
|
|||
|
|
|
|||
|
|
format_log_print $INFO "After Set status, the REG 0x00 value is $res_adc128_setstart"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 处理ADC128读到的数据并输出结果
|
|||
|
|
# @Param 1 ADC128读取数据高位
|
|||
|
|
# @Param 2 ADC128读取数据低位
|
|||
|
|
# @Param 3 channel号/定制化名称
|
|||
|
|
# @Param 4 分压系数
|
|||
|
|
convert_adc128_data(){
|
|||
|
|
# 将读取到的两位数据拼接起来
|
|||
|
|
hex_value1=$(echo "$1" | awk '{sub(/^0x/,""); print}')
|
|||
|
|
hex_value2=$(echo "$2" | awk '{sub(/^0x/,""); print}')
|
|||
|
|
merge_value="${hex_value1}${hex_value2}"
|
|||
|
|
|
|||
|
|
# 由于 bc 计算器只能识别大写的 十六进制数据,这里将小写的十六进制数据全部转化为大写的数据
|
|||
|
|
upper_hex_value=$(echo "$merge_value" | awk '{
|
|||
|
|
for(i=1; i<=length($0); i++){
|
|||
|
|
if(tolower(substr($0,i,1)) ~ /^[a-f]$/)
|
|||
|
|
printf toupper(substr($0,i,1));
|
|||
|
|
else
|
|||
|
|
printf substr($0,i,1);
|
|||
|
|
}
|
|||
|
|
print ""
|
|||
|
|
}')
|
|||
|
|
|
|||
|
|
# 利用bc计算器进行运算,并将返回值格式化后输出
|
|||
|
|
dec_val=$(echo "ibase=16; $upper_hex_value" | bc)
|
|||
|
|
volt=$(echo "scale=4; $dec_val / 16 / 4096 * 2.65 / $4" | bc)
|
|||
|
|
format_volt=$(echo "$volt" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }')
|
|||
|
|
|
|||
|
|
echo "$3 : $format_volt v, hex value: $upper_hex_value"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 读取ADC128芯片每个通道的数据,随后调用数据处理函数进行数据解析并输出
|
|||
|
|
read_adc128_channel_value(){
|
|||
|
|
format_log_print $INFO "Start Read ADC128 channel data ..."
|
|||
|
|
|
|||
|
|
res_ch0=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch0 r2`
|
|||
|
|
res_ch1=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch1 r2`
|
|||
|
|
res_ch2=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch2 r2`
|
|||
|
|
res_ch3=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch3 r2`
|
|||
|
|
res_ch4=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch4 r2`
|
|||
|
|
res_ch5=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch5 r2`
|
|||
|
|
res_ch6=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch6 r2`
|
|||
|
|
res_ch7=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_adc128_ch7 r2`
|
|||
|
|
|
|||
|
|
# 将 I2C 读取的 raw 数据记录到调试日志中
|
|||
|
|
format_log_print $INFO "channel0 : $res_ch0"
|
|||
|
|
format_log_print $INFO "channel1 : $res_ch1"
|
|||
|
|
format_log_print $INFO "channel2 : $res_ch2"
|
|||
|
|
format_log_print $INFO "channel3 : $res_ch3"
|
|||
|
|
format_log_print $INFO "channel4 : $res_ch4"
|
|||
|
|
format_log_print $INFO "channel5 : $res_ch5"
|
|||
|
|
format_log_print $INFO "channel6 : $res_ch6"
|
|||
|
|
format_log_print $INFO "channel7 : $res_ch7"
|
|||
|
|
|
|||
|
|
# start parse raw data
|
|||
|
|
echo ">>> The ADC128 value is :"
|
|||
|
|
convert_adc128_data $res_ch0 $ADC128_Channel0_name $votage_division_factor_0
|
|||
|
|
convert_adc128_data $res_ch1 $ADC128_Channel1_name $votage_division_factor_1
|
|||
|
|
convert_adc128_data $res_ch2 $ADC128_Channel2_name $votage_division_factor_2
|
|||
|
|
convert_adc128_data $res_ch3 $ADC128_Channel3_name $votage_division_factor_3
|
|||
|
|
convert_adc128_data $res_ch4 $ADC128_Channel4_name $votage_division_factor_4
|
|||
|
|
convert_adc128_data $res_ch5 $ADC128_Channel5_name $votage_division_factor_5
|
|||
|
|
convert_adc128_data $res_ch6 $ADC128_Channel6_name $votage_division_factor_6
|
|||
|
|
convert_adc128_data $res_ch7 $ADC128_Channel7_name $votage_division_factor_7
|
|||
|
|
}
|