原理
基于内核 IIO 子系统,给定固定输入电压,程序通过设备节点读取读数,换算为采集电压,与实际输入电压计算误差,不大于 5% 为测试通过。
自动化测试设计
1)考虑相邻通道存在短路的可能,最好给相邻通道设置不同的输入电压值。
2)可从板卡扩展接口中的 3.3v、5v 等管脚中通过电阻分压的方法降到 ADC 的采集范围进行输入。
参考代码
#!/usr/bin/env python
# Description:
# Test ADC value, error limit is 5%.
import os, sys, time
import math, commands
if (len(sys.argv) < 3):
print("Usage: {0} <adc device> <adc voltage> <adc channel number(optional )>".format(sys.argv[0]))
print("e.g.: /sys/bus/iio/devices/iio\:device0/in_voltage4_raw 1.8")
sys.exit(10)
print("*****************************************************")
ADC_DEVICE = sys.argv[1]
ADC_VOLTAGE = float(sys.argv[2])
try:
CHANNEL_NUMBER=sys.argv[3]
except:
CHANNEL_NUMBER="------"
ADC_VALUE = 0
CMD = "cat " + ADC_DEVICE
(cmd_status, cmd_result) = commands.getstatusoutput(CMD)
num = 0
while cmd_status != 0 and num < 10:
time.sleep(2)
(cmd_status, cmd_result) = commands.getstatusoutput(CMD)
num = num+1
if cmd_status != 0:
print("adc test run failed: " + cmd_result)
sys.exit(3)
ADC_VALUE = float(cmd_result)
ADC_RAW = (ADC_VALUE * 1.8) / 4095 # 4095 = 2 ** 12 - 1
ADC_RAW = float('%.03f'%ADC_RAW)
deviation_value = (ADC_RAW - ADC_VOLTAGE) / ADC_VOLTAGE
print("adc device: " + sys.argv[1])
print("adc channel number: " + CHANNEL_NUMBER)
print("adc raw value: " + cmd_result)
print("adc input voltage: " + sys.argv[2] + "v")
print("adc actual voltage: " + '%.03f'%ADC_RAW + "v")
print("adc voltage deviation: " + '%.03f'%(deviation_value * 100) + '%')
if -0.05 <= deviation_value and deviation_value <= 0.05:
print("adc test succeed.")
sys.exit(0)
else:
print("adc test failed.")
sys.exit(3)
参考
《嵌入式必会的Linux驱动开发之IIO子系统》: https://www.eet-china.com/mp/a23599.html
2020年10月29日