|
@@ -0,0 +1,140 @@
|
|
|
|
|
+--[[
|
|
|
|
|
+@module test_adc
|
|
|
|
|
+@summary ADC功能测试
|
|
|
|
|
+@version 1.0
|
|
|
|
|
+@date 2025.07.15
|
|
|
|
|
+@author 王城钧
|
|
|
|
|
+@usage
|
|
|
|
|
+本功能模块演示的内容为:
|
|
|
|
|
+1. ADC通道配置与量程设置
|
|
|
|
|
+2. 数据采集并处理
|
|
|
|
|
+3. 循环打印处理过的ADC数据
|
|
|
|
|
+
|
|
|
|
|
+本文件没有对外接口,直接在main.lua中require "test_adc"就可以加载运行;
|
|
|
|
|
+]]
|
|
|
|
|
+
|
|
|
|
|
+--[[
|
|
|
|
|
+
|
|
|
|
|
+1. Air8000内部ADC接口为12bits,ADC量程为0-3.6V
|
|
|
|
|
+2. Air8000内部具有4路通用ADC通道,通道0 -- 3
|
|
|
|
|
+3. 特殊通道,CPU内部温度Temp -- adc.CH_CPU,主供电脚电压 VBAT -- adc.CH_VBAT
|
|
|
|
|
+4. 设置分压(adc.setRange)要在adc.open之前设置,否则无效!!
|
|
|
|
|
+]]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+local function process_channel(channel_samples, tag)
|
|
|
|
|
+ if #channel_samples > 2 then
|
|
|
|
|
+ -- 升序排序
|
|
|
|
|
+ table.sort(channel_samples)
|
|
|
|
|
+
|
|
|
|
|
+ -- 创建剔除极值后的新数组
|
|
|
|
|
+ local trimmed = {}
|
|
|
|
|
+ for i = 2, #channel_samples-1 do
|
|
|
|
|
+ table.insert(trimmed, channel_samples[i])
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ -- 计算平均值
|
|
|
|
|
+ local sum = 0
|
|
|
|
|
+ for _, v in ipairs(trimmed) do
|
|
|
|
|
+ sum = sum + v
|
|
|
|
|
+ end
|
|
|
|
|
+ local avg_value = sum / #trimmed
|
|
|
|
|
+
|
|
|
|
|
+ -- 根据tag进行不同处理
|
|
|
|
|
+ if tag == "CPU TEMP" then
|
|
|
|
|
+ log.info(tag, string.format("温度值: %.2f ℃(样本数:%d)", avg_value/1000, #trimmed+2))
|
|
|
|
|
+ else
|
|
|
|
|
+ log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
|
|
|
|
|
+ end
|
|
|
|
|
+
|
|
|
|
|
+ -- -- 格式化输出
|
|
|
|
|
+ -- log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
|
|
|
|
|
+ else
|
|
|
|
|
+ log.info(tag, "样本不足无法处理")
|
|
|
|
|
+ end
|
|
|
|
|
+end
|
|
|
|
|
+
|
|
|
|
|
+-- 主采集函数
|
|
|
|
|
+function adc_all_func()
|
|
|
|
|
+ local num_samples = 10 -- 每个通道采集样本数(可配置)
|
|
|
|
|
+ local samples = {
|
|
|
|
|
+ [0] = {}, -- 通道0样本数组
|
|
|
|
|
+ [1] = {}, -- 通道1
|
|
|
|
|
+ [2] = {}, -- 通道2
|
|
|
|
|
+ [3] = {}, -- 通道3
|
|
|
|
|
+ [4] = {}, -- CH_CPU
|
|
|
|
|
+ [5] = {} -- CH_VBAT
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ while true do
|
|
|
|
|
+ sys.wait(1000) -- 延时1秒,为了方便观察luatools日志,非必须
|
|
|
|
|
+
|
|
|
|
|
+ -- 通道0采集处理
|
|
|
|
|
+ adc.setRange(adc.ADC_RANGE_MIN)
|
|
|
|
|
+ -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道0的量程设置为了adc.ADC_RANGE_MIN
|
|
|
|
|
+ -- 此演示对通道0外加了1.2V电压,这样设置与通道1形成对比,方便观察1.2V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
|
|
|
|
|
+ adc.open(0)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[0], adc.get(0))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(0)
|
|
|
|
|
+ process_channel(samples[0], "adc通道0")
|
|
|
|
|
+
|
|
|
|
|
+ -- 通道1采集处理
|
|
|
|
|
+ adc.setRange(adc.ADC_RANGE_MAX)
|
|
|
|
|
+ -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道1的量程设置为了adc.ADC_RANGE_MAX
|
|
|
|
|
+ -- 此演示对通道1外加了1.2V电压,这样设置与通道0形成对比,方便观察1.2V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
|
|
|
|
|
+ adc.open(1)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[1], adc.get(1))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(1)
|
|
|
|
|
+ process_channel(samples[1], "adc通道1")
|
|
|
|
|
+
|
|
|
|
|
+ -- 通道2采集处理
|
|
|
|
|
+ adc.setRange(adc.ADC_RANGE_MAX)
|
|
|
|
|
+ -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道2的量程设置为了adc.ADC_RANGE_MAX
|
|
|
|
|
+ -- 此演示对通道2外加3.3V电压,这样设置可以与通道3形成对比,方便观察3.3V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
|
|
|
|
|
+ adc.open(2)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[2], adc.get(2))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(2)
|
|
|
|
|
+ process_channel(samples[2], "adc通道2")
|
|
|
|
|
+
|
|
|
|
|
+ -- 通道3采集处理
|
|
|
|
|
+ adc.setRange(adc.ADC_RANGE_MIN)
|
|
|
|
|
+ -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道3的量程设置为了adc.ADC_RANGE_MIN
|
|
|
|
|
+ -- 此演示对通道3外加3.3V电压,这样设置可以与通道2形成对比,方便观察3.3V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
|
|
|
|
|
+ adc.open(3)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[3], adc.get(3))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(3)
|
|
|
|
|
+ process_channel(samples[3], "adc通道3")
|
|
|
|
|
+
|
|
|
|
|
+ -- CPU温度通道采集处理
|
|
|
|
|
+ adc.open(adc.CH_CPU)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[4], adc.get(adc.CH_CPU))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(adc.CH_CPU)
|
|
|
|
|
+ process_channel(samples[4], "CPU TEMP")
|
|
|
|
|
+
|
|
|
|
|
+ -- VBAT通道采集处理
|
|
|
|
|
+ adc.open(adc.CH_VBAT)
|
|
|
|
|
+ for _ = 1, num_samples do
|
|
|
|
|
+ table.insert(samples[5], adc.get(adc.CH_VBAT))
|
|
|
|
|
+ end
|
|
|
|
|
+ adc.close(adc.CH_VBAT)
|
|
|
|
|
+ process_channel(samples[5], "VBAT")
|
|
|
|
|
+
|
|
|
|
|
+ -- 清空样本数组
|
|
|
|
|
+ for i = 0, 5 do
|
|
|
|
|
+ samples[i] = {}
|
|
|
|
|
+ end
|
|
|
|
|
+ end
|
|
|
|
|
+end
|
|
|
|
|
+
|
|
|
|
|
+sys.taskInit(adc_all_func)
|
|
|
|
|
+
|