#!/bin/sh log="/tmp/nicsensor_debug.log" INFO="Info" WARNING="Warning" ERROR="Error" shunt_resistor_0="2" shunt_resistor_1="2" shunt_resistor_2="5" REG_ina3221_ch1="0x01" REG_ina3221_ch2="0x03" REG_ina3221_ch3="0x05" REG_ina3221_bus1="0x02" REG_ina3221_bus2="0x04" REG_ina3221_bus3="0x06" INA3221_SHUNT_VOLT=0 INA3221_BUS_VOLT=1 INA3221_POWER=2 ina3221_ch0_volt="0" ina3221_ch1_volt="0" ina3221_ch2_volt="0" ina3221_ch0_current="0" ina3221_ch1_current="0" ina3221_ch2_current="0" # 处理INA3221读到的电流数据并输出结果 # @Param1 ina3221读取数据高位 # @Param2 ina3221读取数据低位 # @Param3 channel号 # @Param4 0代表数据是shunt volt # 1代表数据是bus volt # @Param5 分流电阻 (仅在 Param4 是 shunt volt时有用) convert_ina3221_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 "" }') # 将16进制数据转化为10进制 dec_val=$(echo "ibase=16; $upper_hex_value" | bc) # todo 检查这个数据的最高位是否为1 # max_unsigned_32bit_half=$(echo "scale=0; 2^31 / 2" | bc) # if [ $(echo "$dec_val >= $max_unsigned_32bit_half" | bc) -eq 1 ];then # echo "" # else # echo "" # fi if [ $4 -eq $INA3221_BUS_VOLT ];then # 计算每个通道上的电压 volt=$(echo "scale=4; $dec_val / 8 * 40 / 10000 * 2" | bc) # 格式化输出数据 format_volt=$(echo "$volt" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') echo "channel $3 : $format_volt V, hex value: $upper_hex_value" if [ $3 -eq 0 ];then ina3221_ch0_volt=$format_volt elif [ $3 -eq 1 ];then ina3221_ch1_volt=$format_volt else ina3221_ch2_volt=$format_volt fi elif [ $4 -eq $INA3221_SHUNT_VOLT ];then # 计算每个分流电阻上的电压,同时计算出电流 current_mv=$(echo "scale=4; $dec_val / 8 * 40 / 1000" | bc) current=$(echo "scale=4; $current_mv / $5" | bc) # 格式化输出数据 format_current=$(echo "$current" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') format_current_mv=$(echo "$current_mv" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') echo "channel $3 : $format_current A, shunt volt: $format_current_mv mV, shunt resistor: $5 mOhm, hex value: $upper_hex_value" if [ $3 -eq 0 ];then ina3221_ch0_current=$format_current elif [ $3 -eq 1 ];then ina3221_ch1_current=$format_current else ina3221_ch2_current=$format_current fi elif [ $4 -eq $INA3221_POWER ];then # 计算每个通道上的功耗,并算总和 power_ch0=$(echo "scale=4; $ina3221_ch0_volt * $ina3221_ch0_current" | bc) power_ch1=$(echo "scale=4; $ina3221_ch1_volt * $ina3221_ch1_current" | bc) power_ch2=$(echo "scale=4; $ina3221_ch2_volt * $ina3221_ch2_current" | bc) # 格式化输出数据 format_power_ch0=$(echo "$power_ch0" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') format_power_ch1=$(echo "$power_ch1" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') format_power_ch2=$(echo "$power_ch2" | awk '{ if ($0 ~ /^\./) print "0" $0; else print $0 }') total_power=$(echo "scale=4; $power_ch0 + $power_ch1 + $power_ch2" | bc) echo "channel 0 : $format_power_ch0 W" echo "channel 1 : $format_power_ch1 W" echo "channel 2 : $format_power_ch2 W" echo "total power: $total_power W" fi } # 读取INA3221芯片每个通道的数据,随后调用数据处理函数进行数据解析并输出 read_ina3221_channel_value(){ format_log_print $INFO "Start Read INA3221 channel data ..." res_ch0=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_ch1 r2` res_ch1=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_ch2 r2` res_ch2=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_ch3 r2` res_bus0=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_bus1 r2` res_bus1=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_bus2 r2` res_bus2=`i2ctransfer -y $i2c_bus w1@$chip_slave $REG_ina3221_bus3 r2` # 将 I2C 读取的 raw 数据记录到调试日志中 format_log_print $INFO "channel 0 shunt volt: $res_ch0" format_log_print $INFO "channel 1 shunt volt: $res_ch1" format_log_print $INFO "channel 2 shunt volt: $res_ch2" format_log_print $INFO "Channel 0 bus volt : $res_bus0" format_log_print $INFO "Channel 1 bus volt : $res_bus1" format_log_print $INFO "Channel 2 bus volt : $res_bus2" # start parse raw data echo ">>> The INA3221 shunt value is :" convert_ina3221_data $res_ch0 0 $INA3221_SHUNT_VOLT $shunt_resistor_0 convert_ina3221_data $res_ch1 1 $INA3221_SHUNT_VOLT $shunt_resistor_1 convert_ina3221_data $res_ch2 2 $INA3221_SHUNT_VOLT $shunt_resistor_2 echo ">>> The INA3221 bus value is :" convert_ina3221_data $res_bus0 0 $INA3221_BUS_VOLT convert_ina3221_data $res_bus1 1 $INA3221_BUS_VOLT convert_ina3221_data $res_bus2 2 $INA3221_BUS_VOLT echo ">>> The INA3221 bus power is :" convert_ina3221_data 0 0 0 $INA3221_POWER }