经过前面的折腾,设计好了自己的测试开发板 搭建好了开发环境,
然后正式开始进行功能测试了,测试顺序先从简单的开始吧,一步一步来
前言
接下来的ESP32-C3 功能测试都是基于自己设计的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)
开发环境是乐鑫官方的 ESP-IDF, 基于VScode插件搭建好的:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF)
1、ADC采样示例测试
新建一个ADC采样的工程,当然是基于官方的ADC示例代码建立的,建立工程的方式在上面开发环境搭建的示例测试章节有图文说明:
1.1 DMA连续采样
示例代码有2个函数,单次检测 和 DMA连续检测,分别接在如下通道上面:
在开发板上面,我们只预留了一个ADC接口,就是ADC1_CHANNEL_0,连接的是一个光敏电阻: 所以需要对示例进行稍微修改,主要是对读取函数,只设置 ADC1_CHANNEL_0 ,如下图:
在主函数中只调用continuous_read(NULL); 函数,测试结果如下:
1.2 单次采样
单次采样比较简单,也是直接在上面的样例中修改,下面直接上修改后的测试代码:
static void single_read(void *arg)
{
int adc1_reading[1] = {0xcc};
float vout;
const char TAG_CH[1][10] = {"ADC1_CH0"};
adc1_config_width(ADC_WIDTH_BIT_DEFAULT);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
while (1) {
adc1_reading[0] = adc1_get_raw(ADC1_CHANNEL_0);
vout = (adc1_reading[0] * 2500.00)/4095.00;
ESP_LOGI(TAG_CH[0], "%x vout mv is %f", adc1_reading[0],vout);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
single_read(NULL);
}
测试效果如下:
1.3 测试源码
上一份自己稍微修改的最后测试的adc_dma_example_main.c 源码
- 针对自己的板子只有一个 ADC 接口进行代码精简
- 增加实际电压值的计算输出
- LED切换表示采样一次
- 注释部分为了避免警告需要自行去掉,使用单次模式注释连续采样代码,反之一样
#include <string.h>
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "esp_log.h"
#include "driver/adc.h"
#include "driver/gpio.h"
#define TIMES 256
static void single_read(void *arg)
{
int adc1_reading[1] = {0xcc};
uint32_t etc = 2;
float vout;
const char TAG_CH[1][10] = {"ADC1_CH0"};
gpio_set_direction(1, GPIO_MODE_OUTPUT);
adc1_config_width(ADC_WIDTH_BIT_DEFAULT);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
while (1) {
adc1_reading[0] = adc1_get_raw(ADC1_CHANNEL_0);
vout = (adc1_reading[0] * 2500.00)/4095.00;
ESP_LOGI(TAG_CH[0], "%x vout mv is %f", adc1_reading[0],vout);
ret = adc2_get_raw(ADC2_CHANNEL_0, ADC_WIDTH_BIT_12, &adc2_reading[0]);
vTaskDelay(500 / portTICK_PERIOD_MS);
etc++;
if(etc%2){
gpio_set_level(1,1);
}
else
gpio_set_level(1,0);
if(etc > 60000) etc = 2;
}
}
void app_main(void)
{
single_read(NULL);
}
2、 ESP32-C3 ADC相关介绍
对于ESP32-C3 ADC的介绍,在乐鑫的官网有很详细的说明,官方链接如下:
乐鑫官方ESP32-C3 ADC部分说明
2.1 实际电压的计算
对于实际电压的计算,有如下计算公式: 其中 Vmax 中的 ADC Attenuation 在官方文档中如下介绍: 在 SDK 的库函数中 使用枚举类型定义的,如下(数值上有一点区别): 在示例中根据公式测试电压值的计算: 在库函数中也有关于电压转换的函数esp_adc_cal_get_voltage ,其中调用了esp_adc_cal_raw_to_voltage 进行计算: 源码如下:
esp_err_t esp_adc_cal_get_voltage(adc_channel_t channel,
const esp_adc_cal_characteristics_t *chars,
uint32_t *voltage)
{
ADC_CALIB_CHECK(chars != NULL, "No characteristic input.", ESP_ERR_INVALID_ARG);
ADC_CALIB_CHECK(voltage != NULL, "No output buffer.", ESP_ERR_INVALID_ARG);
int adc_reading;
if (chars->adc_num == ADC_UNIT_1) {
ADC_CALIB_CHECK((adc1_channel_t)channel < ADC1_CHANNEL_MAX, "Invalid channel", ESP_ERR_INVALID_ARG);
adc_reading = adc1_get_raw(channel);
} else {
ADC_CALIB_CHECK((adc2_channel_t)channel < ADC2_CHANNEL_MAX, "Invalid channel", ESP_ERR_INVALID_ARG);
if (adc2_get_raw(channel, chars->bit_width, &adc_reading) != ESP_OK) {
return ESP_ERR_TIMEOUT;
}
}
*voltage = esp_adc_cal_raw_to_voltage((uint32_t)adc_reading, chars);
return ESP_OK;
}
2.2 连续采样步骤
官方的连续采样步骤说明: 根据说明我们对比一下示例代码:
2.3 单步采样步骤
根据说明我们对比一下示例代码:
2.4 ADC使用注意事项
还是官方手册,简单说明一下:
- ADC2模块也被 WI-FI 组件使用了,所以在
esp_err_t esp_wifi_start(void) 和esp_err_t esp_wifi_stop(void) 函数之间进行 ADC2 读取,不一定能够获得正确的值,其实这点我们在使用中尽量避免就可以 - 一个特定的ADC模块在同一时间只能工作在一种工作模式下(单次和连续模式)
- ADC1和ADC2不能同时在单读模式下工作。其中一个会被阻塞,直到另一个完成。
- 对于连续(DMA)模式,ADC采样频率应该在
SOC_ADC_SAMPLE_FREQ_THRES_LOW 和SOC_ADC_SAMPLE_FREQ_THRES_HIGH 范围内。
|