ESP8266--ADC检测

ESP8266的ADC相关知识点

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

在这里插入图片描述
注:光敏电阻接在ESP8266的ADC引脚。

2. 光敏电阻属性

2.1 光敏电阻特点

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

2.2 应用范围

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

2.3 结构示意图

在这里插入图片描述

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

  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你好!以下是一个简单的ESP32-S3的ADC检测例程: ```C #include <stdio.h> #include "esp_adc_cal.h" #include "esp_log.h" #include "esp_system.h" #include "driver/adc.h" #define DEFAULT_VREF 1100 #define NO_OF_SAMPLES 64 static const char *TAG = "ADC"; void app_main() { // 配置ADC adc1_config_width(ADC_WIDTH_BIT_12); adc1_config_channel_atten(ADC_CHANNEL_0, ADC_ATTEN_DB_11); // 计算ADC参考电压 esp_adc_cal_characteristics_t adc_chars; esp_adc_cal_value_t val_type = esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, &adc_chars); // 读取ADC值并打印 while (1) { uint32_t adc_reading = 0; for (int i = 0; i < NO_OF_SAMPLES; i++) { adc_reading += adc1_get_raw((adc1_channel_t)ADC_CHANNEL_0); } adc_reading /= NO_OF_SAMPLES; uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, &adc_chars); ESP_LOGI(TAG, "Raw: %d\tVoltage: %dmV", adc_reading, voltage); vTaskDelay(pdMS_TO_TICKS(1000)); } } ``` 这个例程使用了ESP-IDF框架来进行ADC的配置和读取。首先,我们通过`adc1_config_width`函数将ADC的位宽设置为12位,然后使用`adc1_config_channel_atten`函数将ADC通道设置为通道0,并设置增益为11dB。 接下来,我们使用`esp_adc_cal_characterize`函数计算ADC的参考电压,并将结果存储在`adc_chars`结构体中。 在主循环中,我们使用`adc1_get_raw`函数来读取ADC的原始值,并将它们累加起来。然后,我们对累加值求平均值,得到一个稳定的ADC读数。最后,我们使用`esp_adc_cal_raw_to_voltage`函数将原始值转换为电压,并打印出来。 请注意,这个例程仅仅是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值