adc - 模数转换
背景介绍
本文所述内容,仅针对Air8000这一款型号
Air8000共有4路ADC硬件通道,其通常的作用是用来测试电压数值;
与测量电压相关的函数主要有两个,请务必注意二者的区别:
ADC_RANGE_MAX,ADC引脚的测量范围0-3.6V,这种方式被测电压不可经过外部电阻分压后再挂在ADC上;
ADC_RANGE_MIN,ADC引脚的测量范围0-1.5V,这种方式被测电压可以经过外部电阻分压后再挂在ADC上;
当被测量电压最高值在1.5v以内时, 推荐使用ADC_RANGE_MIN,且不添加外部分压电路;
当被测量电压最高值在3.6v以内时, 推荐使用ADC_RANGE_MAX,且不添加外部分压电路;
当被测量电压最高值在3.6v以上时, 推荐使用ADC_RANGE_MIN,且必须添加外部分压电路;
以下为Air8000模组ADC硬件通道与模组管脚号的对应关系说明;
ADC | 管脚号 | 说明 |
---|---|---|
ADC0 | 9 | 通道ID:0,分辨率12 bits |
ADC1 | 96 | 通道ID:1,分辨率12 bits |
ADC2 | 77 | 通道ID:2,分辨率12 bits |
ADC3 | 76 | 通道ID:3,分辨率12 bits |
ADC常用函数解释
常量
常量 | 类型 | 解释 |
---|---|---|
ADC_RANGE_MAX | number | ADC引脚的测量范围0-3.6V,这种方式被测电压不可经过外部电阻分压后再挂在ADC上; |
ADC_RANGE_MIN | number | ADC引脚的测量范围0-1.5V,这种方式被测电压可以经过外部电阻分压后再挂在ADC上; |
adc.CH_CPU | number | CPU内部温度的通道id,内部通道,直接获取,不占用ADC 0-3,不外接任何电路 |
adc.CH_VBAT | number | VBAT供电电压的通道id,内部通道,直接获取,不占用ADC 0-3,不外接任何电路 |
adc.T1 | number | ADC1 (如存在多个adc可利用此常量使用多ADC 例如 adc.open(ADC1+2) 打开ADC1 channel 2) |
adc.T2 | number | ADC2 (如存在多个adc可利用此常量使用多ADC 例如 adc.open(ADC2+3) 打开ADC2 channel 3) |
示例
-- 本库可读取硬件adc通道, 也支持读取CPU温度和VBAT供电电源
-- 读取CPU温度, 单位为0.001摄氏度, 是内部温度, 非环境温度
adc.open(adc.CH_CPU)
local temp = adc.get(adc.CH_CPU)
adc.close(adc.CH_CPU)
-- adc.CH_CPU,CPU内部温度的通道id,内部通道,直接获取,不占用ADC 0-3,不外接任何电路
-- 读取VBAT供电电压, 单位为mV
adc.open(adc.CH_VBAT)
local vbat = adc.get(adc.CH_VBAT)
adc.close(adc.CH_VBAT)
-- adc.CH_VBAT,VBAT供电电压的通道id,内部通道,直接获取,不占用ADC 0-3,不外接任何电路
adc.CH_CPU 和 adc_CH_VBAT 在做读取动作之前,不需要像 ADC 0-3通道一样先打开adc.setRange(range)函数
adc.setRange(range)
设置ADC的测量范围,就Air8000来说,有 ADC_RANGE_MAX 和 ADC_RANGE_MIN 两个常量;
参数
传入值类型 | 解释 |
---|---|
int | 就Air8000来说,有 ADC_RANGE_MAX 和 ADC_RANGE_MIN 两个常量; |
return | nil |
返回值
无
例子
-- !!!本函数要在调用adc.open之前就调用, 之后调用无效!!!
-- 设置ADC引脚的测量范围0-3.6V,这种方式被测电压不可经过外部电阻分压后再挂在ADC上;
adc.setRange(adc.ADC_RANGE_MAX)
-- 设置ADC引脚的测量范围0-1.5V,这种方式被测电压可以经过外部电阻分压后再挂在ADC上;
adc.setRange(adc.ADC_RANGE_MIN)
-- 说明:
-- 当被测量电压最高值在1.5v以内时, 推荐使用ADC_RANGE_MIN,且不添加外部分压电路;
-- 当被测量电压最高值在3.6v以内时, 推荐使用ADC_RANGE_MAX,且不添加外部分压电路;
-- 当被测量电压最高值在3.6v以上时, 推荐使用ADC_RANGE_MIN,且必须添加外部分压电路;
adc.open(id)
打开adc通道
参数
传入值类型 | 解释 |
---|---|
int | 通道id,与具体设备有关,通常从0开始 |
返回值
返回值类型 | 解释 |
---|---|
boolean | 打开结果 |
例子
-- 打开adc通道2,并读取
if adc.open(2) then
log.info("adc", adc.get(2)) -- 返回电压值;
end
adc.close(2) -- 若需要持续读取, 则不需要close, 功耗会高一点.
adc.get(id)
获取adc计算值
参数
传入值类型 | 解释 |
---|---|
int | 通道id,,Air8000从0开始,共0-3四个硬件通道 |
返回值
返回值类型 | 解释 |
---|---|
int | 单位是mV, 若读取失败,会返回-1 |
例子
-- 设置adc.setRange(adc.ADC_RANGE_MAX)方式,打开adc通道2,并读取电压值
adc.setRange(adc.ADC_RANGE_MAX)
adc.open(2)
local data = adc.get(2)
adc.close(2)
log.info("adc读出值", data)
-- 此时读取的data值即为ADC电压值,也为被测电压的实际值;
-- 设置adc.setRange(adc.ADC_RANGE_MIN)方式,打开adc通道2,并读取电压值
adc.setRange(adc.ADC_RANGE_MIN)
adc.open(2)
local data = adc.get(2)
adc.close(2)
log.info("adc读出值", data)
-- 此时读取的data值即为ADC电压值,但不是外部被测电压的实际值,外部电压的实际值需要再根据外部电压的分压比例进行换算;
-- 由于外部分压电阻的精度客观上存在误差,因此经外部电压的分压比换算而来的外部电压值可能与实际值存在一定的误差;
adc.close(id)
关闭adc通道
参数
传入值类型 | 解释 |
---|---|
int | 通道id,,Air8000从0开始,共0-3四个硬件通道 |
返回值
无
例子
-- 打开adc通道2,并读取
if adc.open(2) then
log.info("adc", adc.read(2))
end
adc.close(2)