ESP8266学习历程(3)——ADC

ADC,Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实现这个功能,在各种不同的产品中都可以找到它的身影。

EESP8266中ADC的介绍:

  1. 模数转换器(ADC)用于将模拟信号转换为数字形式。ESP8266内置10-bit ADC,仅一个ADC通道。

  2. ESP8266中的ADC通道与系统电压多路复用。因此,我们可以将其设置为测量系统电压或外部电压。读取外部电压时,TOUT(ADC)引脚的输入电压范围为0-1.0V。

  3. menuconfig - > Component config - > PHY - > vdd33_const value 提供ADC模式的设置,即是否正在测量系统电压或外部电压。

在这里插入图片描述
4. Menuconfig - > Component config - > PHY - > vdd33_const value必须将其设置为255才能读取系统电压,即ESP8266的VDD引脚上的电压。要读取TOUT(ADC)引脚上的外部电压,vdd33_const需要小于255。当ADC参考电压设置为实际VDD33电源电压时,vdd33_const的值范围为[18,36],单位为0.1V。当ADC参考电压设置为默认值3.3V作为电源电压时,vdd33_const的范围为[0,18]或(36,255)。

在8266中要使用到ADC接口,需要包含一下头文件:

#include "driver/adc.h"

ADC提供的接口有:

esp_err_t adc_read(uint16_t *data);						//单个测量(ADC)引脚,单位:1/1023 V或VDD引脚,uint: 1 mV
esp_err_t adc_read_fast(uint16_t *data, uint16_t len);	  //测量TOUT(ADC)引脚输入电压,单位:1/1023 V
esp_err_t adc_deinit();								   //清除ADC
esp_err_t adc_init(adc_config_t *config);				//初始化ADC

ADC配置结构体:

typedef struct {
    adc_mode_t mode;  /*!< ADC 检测模式 */
    uint8_t clk_div;  /*!< ADC sample collection clock=80M/clk_div, range[8, 32],ADC采样时钟=80M/clk_div,范围[8,32] */
} adc_config_t;

ADC检测模式枚举:

typedef enum {
    ADC_READ_TOUT_MODE = 0,		//设置读取外部ADC
    ADC_READ_VDD_MODE,			//设置读取ADD
    ADC_READ_MAX_MODE			
} adc_mode_t;

本文用例使用的是光敏电阻5516进行演示:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/adc.h"
#include "esp_log.h"

static const char *TAG = "adc example";

static void adc_task()
{
    int x;
    uint16_t adc_data[100];

    while (1) {
    
        if (ESP_OK == adc_read(&adc_data[0])) {
            ESP_LOGI(TAG, "adc read: %d\r\n", adc_data[0]);
        }
        //读100个数值
        /*
        if (ESP_OK == adc_read_fast(adc_data, 100)) {
            for (x = 0; x < 100; x++) {
                printf("%d -> %d\n", x, adc_data[x]);
            }
        }
        */
        vTaskDelay(1000 / portTICK_RATE_MS);
    }
}

void app_main()
{
    
    adc_config_t adc_config;                            // ADC init结构体
    adc_config.mode = ADC_READ_TOUT_MODE;               //设置读取外部电压
    adc_config.clk_div = 8;                             // ADC sample collection clock = 80MHz/clk_div = 10MHz
    ESP_ERROR_CHECK(adc_init(&adc_config));             //ADC初始化

    xTaskCreate(adc_task, "adc_task", 1024, NULL, 5, NULL);//创建ADC任务
}

结果:

在这里插入图片描述

特别注意:在使用硬件ADC时,最好关闭Wi-Fi和中断


我的GITHUB

我的个人博客

CSDN

发布了32 篇原创文章 · 获赞 1 · 访问量 246

猜你喜欢

转载自blog.csdn.net/qq_41714908/article/details/105223433