【快速上手ESP32(基于ESP-IDF&VSCode)】06-ADC模数转换

本文介绍了ADC在电子游戏中的角色以及在电子元件中的模拟数字转换功能,重点讲述了ESP32中ADC的配置过程,包括ADC1的精度设置、通道选择和实际应用示例,涉及GPIO接口和光敏电阻的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ADC

我们照例是请文心一言来介绍一下ADC。

ADC具有多重含义,以下为你详细介绍其中两种主要的含义:

首先,ADC在电子游戏领域中,特别是在MOBA类游戏中,指的是Attack Damage Carry或Attack Damage Core,即普通攻击持续输出核心。它代表那些以普通攻击为主要输出方式,能造成持续伤害输出的角色。在《刀塔》这样的游戏中,ADC通常指的是那些以物理攻击为主要输出方式的核心英雄。而在《英雄联盟》中,ADC英雄则经常被用于“下路”位置,尽管随着游戏的发展,非ADC英雄走下路的现象逐渐增多,但在赛事场合中,ADC仍然是对这一位置的重要称呼。

其次,ADC也是Analog-to-Digital Converter的缩写,即模拟数字转换器。这是一种将连续变量的模拟信号转换为离散的数字信号的器件。ADC在多个领域都有广泛的应用,包括通信、医疗、汽车、测量和控制等。例如,在无线通信系统中,ADC用于将模拟语音信号转换为数字信号进行传输;在医疗设备中,ADC用于将生物信号如心电图和脑电图转换为数字信号,以便进行分析和存储;在汽车领域,ADC用于检测传感器信号,如发动机转速和车速,从而控制发动机和车辆的其他系统。

AI的回答咱随便看看就行。

ADC就是把模拟信号转换为数字信号用的。

关于ESP32中的ADC,官方文档的介绍很简短,几乎没有,也可能是我没找对地方。

在两个文档中各自都只有一句简短的概括。

但是我们也可以从中提取一点信息出来。

首先ESP32中是有两个ADC。

第二,ADC的分辨率是12位。

接下来看看编程指南中如何使用ADC。

使用ADC

#include "hal/adc_types.h"

编程指南中列了好多条,但实际上我们只需要配置前三个即可。

首先是资源分配。

接着就出现问题了,在IDE中没有相关的函数提示。

可能是我安装的IDF版本和编程指南里的不一样,因此我没有相关函数。

这条路走不通,还有别的办法,可以参考立创开发板提供的文档。

#include "esp_adc_cal.h"
#include "driver/adc.h"

接下来进行两个配置。

第一个是配置adc1的精度,esp32中一共有俩adc,分别是adc1和adc2,按理说我们都可以用。但是我们最好就是用adc1,每个adc有十个通道,所以一个也是够用的。

至于为什么不用adc2,这是因为adc2和WiFi是冲突的,而WiFi基本上是咱物联网的标配,因此为了避免冲突,咱就是用adc1。

void adc1_config_width(adc_bits_width_t width);

可选的参数有9~13位精度的,但是根据之前的文档我们知道,ESP32中的ADC只有最高12位精度,因此13那个选项不能选(应该吧)。

下一个是衰减参数,衰减越大,可接受的电压越大。

void adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten);

第一个参数选择通道,我们知道每个ADC都有十个通道,因此可选的有十个。

第二个选择衰减参数。

这个根据自己手上的传感器的电气参数来选择,不清楚的话就先选11db的,这样就算电压范围不一样也不会导致板子烧坏。

接下来就可以读取ADC的值了。

int adc1_get_raw(adc1_channel_t channel);

另外需要说的是ADC的通道对应的GPIO口是固定的。

从上面的表格看出我们能用的ADC1的通道只有8个而不是10个。

然而还有个问题就是adc1的不同通道对应的GPIO口。

在实测之后我发现adc1的通道0对应的是GPIO1,但是我找了很多地方说的都是像上面表格一样。

然后我找到了立创开发板的图。

因此大家优先以自己买的板子提供的引脚对应表为准。

如果没有的话再按照上面编程指南中提供的表格。

完整实操代码

#include <stdio.h>
#include "driver/gpio.h"
#include "driver/adc.h"
#include <unistd.h>

void app_main(void){
    adc1_config_width(ADC_WIDTH_BIT_12); 
    adc1_config_channel_atten(ADC1_CHANNEL_0,ADC_ATTEN_DB_11);
    while (1){
        uint16_t adc_val = adc1_get_raw(ADC1_CHANNEL_0); 
        printf("%d\r\n",adc_val);
        sleep(1);
    }
}

我在GPIO1的位置接了个光敏电阻,能够正常转换。 

像上面那样使用adc还是很简单的,我看立创开发板还提供了另一种加上了校准的写法,我贴在下面。

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

#define DEFAULT_VREF    1100        //默认参考电压,单位mV

static esp_adc_cal_characteristics_t *adc_chars;

#define channel     ADC_CHANNEL_0               // ADC测量通道
#define width       ADC_WIDTH_BIT_12            // ADC分辨率
#define atten       ADC_ATTEN_DB_11             // ADC衰减
#define unit        ADC_UNIT_1                  // ADC1

void app_main(void)
{
    int read_raw_1=0, read_raw_2=0, read_raw_3=0;
    uint32_t voltage =0;
    float voltage_f = 0;
    adc1_config_width(width);// 12位分辨率
    
    //ADC_ATTEN_DB_0:表示参考电压为1.1V
    //ADC_ATTEN_DB_2_5:表示参考电压为1.5V
    //ADC_ATTEN_DB_6:表示参考电压为2.2V
    //ADC_ATTEN_DB_11:表示参考电压为3.3V
    //adc1_config_channel_atten( channel,atten);// 设置通道0和3.3V参考电压

    // 分配内存
    adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
    // 对 ADC 特性进行初始化,使其能够正确地计算转换结果和补偿因素
    esp_adc_cal_characterize(unit, atten, width, DEFAULT_VREF, adc_chars);

    while(1)
    {
        //采集三个通道的ADC值
        read_raw_1 = adc1_get_raw(ADC1_CHANNEL_0);  //GPIO1
        read_raw_2 = adc1_get_raw(ADC1_CHANNEL_1);  //gpio2
        read_raw_3 = adc1_get_raw(ADC1_CHANNEL_2);  //gpio3
        //将ADC1的通道0(gpio1)的结果转换成电压,单位mV
        voltage = esp_adc_cal_raw_to_voltage(read_raw_1, adc_chars);

        //输出ADC值 与 ADC1通道0(GPIO1)实际电压值
        printf("read_raw_1 = %d\tread_raw_2 = %d\tread_raw_3 = %d\tvoltage: %f\n",read_raw_1,read_raw_2,read_raw_3,voltage/1000.0);
        
        vTaskDelay(100 / portTICK_PERIOD_MS);
    }
}

<think>好的,我需要帮助用户找到关于如何在ESP-IDFVSCode中使用MQTTX的教程或信息。首先,我需要回忆一下MQTTX是什么。MQTTX是一个MQTT客户端工具,通常用于测试和调试MQTT通信。用户可能想在他们的ESP32项目中使用MQTTX来与MQTT代理交互,比如发布或订阅消息。 接下来,用户提到的是ESP-IDFVSCodeESP-IDFEspressif的官方开发框架,而VSCode是一个常用的代码编辑器,可以通过插件支持ESP-IDF开发。所以用户可能是在使用VSCodeESP-IDF插件进行开发,现在想集成MQTTX进行MQTT通信的测试或开发。 首先,我需要检查现有的引用内容。在用户提供的引用中,引用[1]提到arduino-esp32 SDK需要ESP-IDF v4.4的环境,这可能与ESP-IDF的版本兼容性有关。引用[2]讨论了在MCU上部署神经网络模型,可能不直接相关,但可能涉及MQTT用于数据传输。引用[3]是关于XIAO ESP32S3 Sense板的Arduino设置,包括添加Board Manager URL,这可能帮助配置开发环境。 用户的问题是如何在ESP-IDFVSCode中使用MQTTX。需要明确的是,MQTTX本身是一个桌面应用,而ESP-IDF项目可能需要使用MQTT客户端库,比如ESP-MQTT,来与MQTT代理通信。用户可能希望了解如何在ESP-IDF项目中配置MQTT客户端,然后使用MQTTX作为客户端来测试连接。 首先,步骤可能包括: 1. 在ESP-IDF项目中集成MQTT客户端库,比如使用官方的ESP-MQTT。 2. 配置VSCodeESP-IDF插件以支持项目开发。 3. 编写代码连接MQTT代理,比如Mosquitto或EMQX。 4. 使用MQTTX作为另一个客户端进行测试,比如订阅或发布消息。 需要确保用户正确配置了ESP-IDF环境,可能参考引用[1]中的版本要求。例如,确保ESP-IDF版本与arduino-esp32兼容,但用户可能直接使用ESP-IDF而非Arduino框架。 可能的步骤详细说明: - 安装VSCodeESP-IDF插件,配置开发环境。 - 创建新的ESP-IDF项目,添加MQTT配置。 - 使用ESP-MQTT库编写连接代码。 - 编译并烧录到ESP32设备。 - 使用MQTTX连接同一代理,测试通信。 此外,需要提供代码示例,展示如何在ESP-IDF中使用ESP-MQTT。同时,可能涉及MQTTX的设置步骤,比如安装、配置代理地址、主题等。 还要注意引用中的资源,如引用[3]提到的Board Manager URL可能帮助安装必要的库,但用户使用的是ESP-IDF,可能需要通过idf.py组件管理来添加ESP-MQTT。 需要验证ESP-MQTT是否默认包含在ESP-IDF中,或者是否需要作为组件添加。根据ESP-IDF文档,ESP-MQTT是官方支持的组件,位于components/mqtt下。因此,用户可以直接包含头文件并使用。 可能的代码结构: ```c #include "mqtt_client.h" void app_main() { esp_mqtt_client_config_t mqtt_cfg = { .uri = "mqtt://broker.hivemq.com", }; esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); esp_mqtt_client_start(client); } ``` 然后,用户可以使用MQTTX连接到同一代理(如broker.hivemq.com),订阅相应主题,测试消息收发。 最后,生成相关问题,帮助用户深入理解,比如配置安全连接、处理消息回调、QoS设置等。</think>### 如何在ESP-IDFVSCode中使用MQTTX #### 1. **环境配置** - **安装VSCode ESP-IDF插件** 在VSCode中安装官方插件“Espressif IDF”,用于ESP-IDF项目的开发、编译和调试[^3]。 - **设置ESP-IDF版本** 确保ESP-IDF版本与项目兼容(如v4.4或更高),可通过插件配置或命令行工具`idf.py set-target esp32`选择目标芯片。 #### 2. **集成ESP-MQTT库** ESP-IDF已内置`esp-mqtt`组件,无需额外安装。在代码中直接调用以下头文件: ```c #include "mqtt_client.h" ``` #### 3. **编写MQTT客户端代码** 示例代码(`main.c`): ```c void app_main() { esp_mqtt_client_config_t mqtt_config = { .broker.address.uri = "mqtt://broker.hivemq.com", // 公共MQTT代理 }; esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_config); esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); esp_mqtt_client_start(client); } // 事件处理函数 static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) { esp_mqtt_event_handle_t event = event_data; switch (event->event_id) { case MQTT_EVENT_CONNECTED: esp_mqtt_client_subscribe(client, "test/topic", 0); break; case MQTT_EVENT_DATA: printf("Received: %.*s\n", event->data_len, event->data); break; } } ``` #### 4. **使用MQTTX测试通信** 1. **安装MQTTX** 从[MQTTX官网](https://mqttx.app/)下载并安装客户端。 2. **连接代理** 在MQTTX中添加新连接,填写与代码相同的代理地址(如`broker.hivemq.com`)。 3. **订阅/发布消息** - 订阅主题`test/topic`,接收ESP32发送的消息。 - 发布消息到`test/topic`,观察ESP32是否成功接收。 #### 5. **调试与优化** - **安全连接** 若需TLS加密,将URI改为`mqtts://`,并配置证书: ```c .broker.address.uri = "mqtts://broker.example.com", .broker.verification.certificate = "-----BEGIN CERTIFICATE-----\n..." ``` - **QoS设置** 在`esp_mqtt_client_subscribe`中指定QoS等级(0/1/2)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值