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

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
好的,我知道了。针对你的问题,我能够为你提供如下的解答: 在使用 MicroPython 和 ESP8266 控制 LED 的过程中,可以通过 PWM 技术实现呼吸灯效果。PWM(Pulse Width Modulation)脉宽调制技术是一种通过改变信号的占空比来控制电路输出功率的技术。 具体实现步骤如下: 1. 首先需要在 ESP8266 上安装 MicroPython,然后连接 ESP8266 和 LED。 2. 在 MicroPython 中,可以使用 machine 模块中的 Pin 和 PWM 类来控制 LED。 3. 先使用 Pin 类将 LED 连接到 ESP8266 上的一个 GPIO 引脚。 4. 再使用 PWM 类来初始化一个 PWM 对象,并设置 PWM 对象的频率和占空比。 5. 最后使用 PWM 对象的 duty() 方法来改变占空比,从而控制 LED 显示的亮度。 下面是一个简单的 MicroPython 代码示例,用于控制 LED 呼吸灯效果: ```python from machine import Pin, PWM import time led_pin = Pin(2, Pin.OUT) # 连接到GPIO2 pwm = PWM(led_pin, freq=5000) # 初始化PWM对象,设置频率为5000Hz while True: for duty_cycle in range(0, 1024, 8): # 从0到1024,每次增加8 pwm.duty(duty_cycle) # 设置占空比 time.sleep_ms(5) # 暂停5ms for duty_cycle in range(1023, -1, -8): # 从1023到0,每次减少8 pwm.duty(duty_cycle) # 设置占空比 time.sleep_ms(5) # 暂停5ms ``` 上面的代码中,使用了一个无限循环来让 LED 一直显示呼吸灯效果。在每个循环中,通过循环改变占空比,从而让 LED 呈现出呼吸灯效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大大棋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值