ESP8266--ADC检测

ESP8266的ADC相关知识点

1. ESP8266与光敏电阻硬件连接

ESP8266--ADC检测_第1张图片
注:光敏电阻接在ESP8266的ADC引脚。

2. 光敏电阻属性

2.1 光敏电阻特点

环氧树脂封装,反应速度快,体积小,灵敏度高,稳定性好,光谱特性好。

2.2 应用范围

① 光控灯
② 报警器
③ 光控开关
④ 光电控制
⑤ 光控音乐 I.C 等等

2.3 结构示意图

ESP8266--ADC检测_第2张图片

2.4 测试条件

最大功率损耗:环境温度为 25°C 时的最大功率。
最大外加电压:在黑暗中可连续施加给元件的最大电压。

3. ESP8266的ADC相关知识点

以下资料来源:乐鑫官方数据手册ESP8266EX Datasheet Version 4.4

3.1 ADC功能简述

ESP8266EX 集成了⼀个通⽤的 10 bit 精度的 ADC。可检测的模拟输⼊电压范围在 0 - 1V。该 ADC 主要⽤于用于检测传感器输出或是电池电量等。在EXP8266发包时不可使用ADC,否则将会导致电压值的不准确。
目前芯片定义TOUT(Pin6)位ADC端口,如下:
在这里插入图片描述
ADC端口(Pin6 TOUT)可提供一下两种应用,单一下两种应用不可同时使用:
① 测量VDD3P3管脚3和4上的电源电压:
测量PA_VDD管脚电压的函数是:uint16 system_get_vdd33(void)
② 测量TOUT管脚6的输入电压:
测量TOUT管脚电压的函数是:uint16 system_adc_read(void)

3.2 应用场景

① 应用场景1:测量VDD3P3管脚3和4上的电源电压

硬件设计:TOUT管脚必须悬空
RF_init参数:esp_init_data_default.bin
(0 – 127Byte)中的第07Byte为”vdd33_const”,必须设置为0xFF,即255;
RF Calibration工作过程:自测VDD33P3管脚3和管脚4上的电源电压,根据测量结果优化RF电路工作状态。
用户软件:可使用system_get_vdd33;不可使用system_adc_read。

② 应用场景2:测量TOUT管脚6的输入电压

硬件设计:TOUT管脚接外部电路,输入电压范围界定为0—1.0V
RF_init参数:esp_init_data_default.bin
(0 – 127Byte)中的第07Byte为”vdd33_const”,必须为真实的VDD3P3管脚3和管脚4电压;
ESP8266EX的工作电压范围为1.8V—3.6V,”vdd33_const”单位为0.1V,因此”vdd33_const”的有效值为18 – 36;
注意:标准情况下工作电压3V-3.6V,2.7以下需要特殊的Flash支持,而且需要同时修改软硬件设计,如无特殊需求请保证标准情况下的工作电压。
若电源电压不稳定,会动态变化,”vdd33_const”应输入为电源电压变化的最小值的10倍。
RF Calibration工作过程:根据RF_init第107 Byte “vdd33_const”的值来优化RF电路工作状态,容许误差约为±0.2V。
用户软件:不可使用system_get_vdd33;可使用system_adc_read

3.3 注意事项

注意事项1:
RF_init 参数,即esp_init_data_default.bin
(0 – 127 Byte) 中的第107Byte,命名为”vdd33_const”,此参数的解释如下:

  1. 当vdd33_const < 18 或 36 < vdd33_const < 255 时,ESP8266 RF Calibration
    使用默认值3.0V来优化RF电路工作状态。
  2. 当vdd33_const = 0xFF,ESP8266 RF Calibration 内部自测VDD3P3 管脚3和管脚 4
    上的电源电压,根据测量结果优化RF电路工作状态。
  3. 当18 <= vdd33_const <= 36,ESP8266 RF Calibration 使用(vdd33_const /
    10)来优化RF电路工作状态。

注意事项2:
函数 system_get_vdd33 ⽤于测量 VDD3P3 管脚 3 和管脚 4 上的电源电压:

  1. Tout 管脚必须悬空,且必须使 RF_init 参数第 107 byte vdd33_const=0xff。
  2. 若 RF_init 参数第 107 byte vdd33_const 等于 0xff, system_get_vdd33
    函数返回值才为有效的测量值;否则 system_get_vdd33 函数返回 0xffff。
  3. 返回值单位: 1/1024 V

注意事项3:
函数 system_adc_read ⽤于测量 Tout 管脚 6 上的输⼊电压时:

  1. 必须 将 RF_init 参数第 107 byte ”vdd33_const” 设置为真实的电压电源。
  2. 若 RF_init 参数第 107 byte ”vdd33_const” 不等于 0xff, system_adc_read
    函数返回值才为有效的测量值;否则 system_adc_read 函数返回 0xffff。
  3. 返回值单位: 1/1024 V

4. 参考代码

/*
* timer.c
*
*  Created on: 2018年8月14日
*      Author: 小良哥
*/

#include "driver/delay.h"
#include "driver/led.h"
#include "driver/key.h"
#include "driver/uart.h"
#include "driver/timer.h"
#include "driver/dht11.h"

/*
* 函数名称:void TimerInitConfig(uint32_t DelayMs,bool repeat_flag)
* 函数功能:定时器初始化函数
* 函数形参:
*       uint32_t DelayMs   延时时间
*       bool repeat_flag   是否重复
*       		1:重复   0:不重复
* 返回值:
* */
os_timer_t os_timer_500ms;//定义一个定时器名称
void TimerInitConfig(uint32_t DelayMs, bool repeat_flag)
{
	os_timer_disarm(&os_timer_500ms);//关闭定时器
	os_timer_setfn(&os_timer_500ms, (os_timer_func_t *)TimerBackFunction, NULL);//设置定时器回调函数
	os_timer_arm(&os_timer_500ms, DelayMs, repeat_flag);
}

/*
* 函数名称:void TimerBackFunction(void)
* 函数功能:定时器回调函数
* 函数形参:无
* 返回值:   无
* */
void TimerBackFunction(void)
{
	//返回ADC测量的数值
	os_printf("ADC检测数值=%u\r\n", system_adc_read());
	//计算出ADC数值对应的电压值
	os_printf("实际电压=0.");
	os_printf("%u\r\n", system_adc_read() * 100 / 1024);
}
void ICACHE_FLASH_ATTR user_init(void)
{
	int i;
	os_DelayMs(1000);
	uart_init(115200, 115200);//设置串口波特率
	while (Ds18b20InitConfig())
	{

	}
	//	LedInitConfig();//LED灯初始化函数
	//	KeyInitConfig();//按键初始化函数
	//	KeyExtiInitConfig();//配置按键外部中断
	TimerInitConfig(500, 1);//通过定时器回调采集DHT数据
							//	hw_timer_set_func();
							//	HwTimerInitConfig();
	os_printf("=============================================\r\n");
	os_printf("\t SDK version:\t%s", system_get_sdk_version());
	os_printf("\r\n嵌入式陈工个人编辑资料\r\n未经本人同意请勿私自传播\r\n");
	os_printf("\r\nADC检测光敏电阻数据\r\n");
	os_printf("\r\n带看门狗\r\n");
	os_printf("\r\nSPI Flash 的 ID 号:%d\r\n", spi_flash_get_id());
	os_printf("=============================================\r\n");
}

源代码参考:https://github.com/ChenJiliang00/ESP8266

你可能感兴趣的:(ESP8266_12F)