test_adc.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. --[[
  2. @module test_adc
  3. @summary ADC功能测试
  4. @version 1.0
  5. @date 2025.07.15
  6. @author 王城钧
  7. @usage
  8. 本功能模块演示的内容为:
  9. 1. ADC通道配置与量程设置
  10. 2. 数据采集并处理
  11. 3. 循环打印处理过的ADC数据
  12. 本文件没有对外接口,直接在main.lua中require "test_adc"就可以加载运行;
  13. ]]
  14. --[[
  15. 1. Air8000内部ADC接口为12bits,ADC量程为0-3.6V
  16. 2. Air8000内部具有4路通用ADC通道,通道0 -- 3
  17. 3. 特殊通道,CPU内部温度Temp -- adc.CH_CPU,主供电脚电压 VBAT -- adc.CH_VBAT
  18. 4. 设置分压(adc.setRange)要在adc.open之前设置,否则无效!!
  19. ]]
  20. local function process_channel(channel_samples, tag)
  21. if #channel_samples > 2 then
  22. -- 升序排序
  23. table.sort(channel_samples)
  24. -- 创建剔除极值后的新数组
  25. local trimmed = {}
  26. for i = 2, #channel_samples-1 do
  27. table.insert(trimmed, channel_samples[i])
  28. end
  29. -- 计算平均值
  30. local sum = 0
  31. for _, v in ipairs(trimmed) do
  32. sum = sum + v
  33. end
  34. local avg_value = sum / #trimmed
  35. -- 根据tag进行不同处理
  36. if tag == "CPU TEMP" then
  37. log.info(tag, string.format("温度值: %.2f ℃(样本数:%d)", avg_value/1000, #trimmed+2))
  38. else
  39. log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
  40. end
  41. -- -- 格式化输出
  42. -- log.info(tag, string.format("处理值: %.2f mV (样本数:%d)", avg_value, #trimmed+2))
  43. else
  44. log.info(tag, "样本不足无法处理")
  45. end
  46. end
  47. -- 主采集函数
  48. function adc_all_func()
  49. local num_samples = 10 -- 每个通道采集样本数(可配置)
  50. local samples = {
  51. [0] = {}, -- 通道0样本数组
  52. [1] = {}, -- 通道1
  53. [2] = {}, -- 通道2
  54. [3] = {}, -- 通道3
  55. [4] = {}, -- CH_CPU
  56. [5] = {} -- CH_VBAT
  57. }
  58. while true do
  59. sys.wait(1000) -- 延时1秒,为了方便观察luatools日志,非必须
  60. -- 通道0采集处理
  61. adc.setRange(adc.ADC_RANGE_MIN)
  62. -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道0的量程设置为了adc.ADC_RANGE_MIN
  63. -- 此演示对通道0外加了1.2V电压,这样设置与通道1形成对比,方便观察1.2V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
  64. adc.open(0)
  65. for _ = 1, num_samples do
  66. table.insert(samples[0], adc.get(0))
  67. end
  68. adc.close(0)
  69. process_channel(samples[0], "adc通道0")
  70. -- 通道1采集处理
  71. adc.setRange(adc.ADC_RANGE_MAX)
  72. -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道1的量程设置为了adc.ADC_RANGE_MAX
  73. -- 此演示对通道1外加了1.2V电压,这样设置与通道0形成对比,方便观察1.2V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
  74. adc.open(1)
  75. for _ = 1, num_samples do
  76. table.insert(samples[1], adc.get(1))
  77. end
  78. adc.close(1)
  79. process_channel(samples[1], "adc通道1")
  80. -- 通道2采集处理
  81. adc.setRange(adc.ADC_RANGE_MAX)
  82. -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道2的量程设置为了adc.ADC_RANGE_MAX
  83. -- 此演示对通道2外加3.3V电压,这样设置可以与通道3形成对比,方便观察3.3V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
  84. adc.open(2)
  85. for _ = 1, num_samples do
  86. table.insert(samples[2], adc.get(2))
  87. end
  88. adc.close(2)
  89. process_channel(samples[2], "adc通道2")
  90. -- 通道3采集处理
  91. adc.setRange(adc.ADC_RANGE_MIN)
  92. -- 设置ADC量程,注意量程设置一定要在adc.open()之前,通道3的量程设置为了adc.ADC_RANGE_MIN
  93. -- 此演示对通道3外加3.3V电压,这样设置可以与通道2形成对比,方便观察3.3V外部供电下adc.ADC_RANGE_MAX和adc.ADC_RANGE_MIN两种量程的测量精准度。
  94. adc.open(3)
  95. for _ = 1, num_samples do
  96. table.insert(samples[3], adc.get(3))
  97. end
  98. adc.close(3)
  99. process_channel(samples[3], "adc通道3")
  100. -- CPU温度通道采集处理
  101. adc.open(adc.CH_CPU)
  102. for _ = 1, num_samples do
  103. table.insert(samples[4], adc.get(adc.CH_CPU))
  104. end
  105. adc.close(adc.CH_CPU)
  106. process_channel(samples[4], "CPU TEMP")
  107. -- VBAT通道采集处理
  108. adc.open(adc.CH_VBAT)
  109. for _ = 1, num_samples do
  110. table.insert(samples[5], adc.get(adc.CH_VBAT))
  111. end
  112. adc.close(adc.CH_VBAT)
  113. process_channel(samples[5], "VBAT")
  114. -- 清空样本数组
  115. for i = 0, 5 do
  116. samples[i] = {}
  117. end
  118. end
  119. end
  120. sys.taskInit(adc_all_func)