ESP32-C3入门教程 基础篇(一、ADC采样)

2023-11-11

经过前面的折腾,设计好了自己的测试开发板 搭建好了开发环境,
然后正式开始进行功能测试了,测试顺序先从简单的开始吧,一步一步来

前言

接下来的ESP32-C3 功能测试都是基于自己设计的开发板:

自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

开发环境是乐鑫官方的 ESP-IDF, 基于VScode插件搭建好的:

ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

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)
{
    // esp_err_t ret;
    // int adc1_reading[3] = {0xcc};
    int adc1_reading[1] = {0xcc};
    // int adc2_reading[1] = {0xcc};
    float vout;
    // const char TAG_CH[][10] = {"ADC1_CH2", "ADC1_CH3","ADC1_CH4", "ADC2_CH0"};
    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);
    // adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_6);
    // adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_0);
    // adc2_config_channel_atten(ADC2_CHANNEL_0, ADC_ATTEN_DB_0);
    
    // int n = 20;
    // while (n--) {
    while (1) {

        adc1_reading[0] = adc1_get_raw(ADC1_CHANNEL_0);
        // adc1_reading[1] = adc1_get_raw(ADC1_CHANNEL_3);
        // adc1_reading[2] = adc1_get_raw(ADC1_CHANNEL_4);
        vout = (adc1_reading[0] * 2500.00)/4095.00;
        ESP_LOGI(TAG_CH[0], "%x vout mv is %f", adc1_reading[0],vout);

        
        // for (int i = 0; i < 3; i++) {
        //     ESP_LOGI(TAG_CH[i], "%x", adc1_reading[i]);
        // }
        // ret = adc2_get_raw(ADC2_CHANNEL_0, ADC_WIDTH_BIT_12, &adc2_reading[0]);
        // assert(ret == ESP_OK);
        // ESP_LOGI(TAG_CH[3], "%x", adc2_reading[0]);
        vTaskDelay(500 / portTICK_PERIOD_MS);
    }
}

void app_main(void)
{
    single_read(NULL);
    //continuous_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 continuous_adc_init(uint16_t adc1_chan_mask, uint16_t adc2_chan_mask, adc_channel_t *channel, uint8_t channel_num)
// {
//     esp_err_t ret = ESP_OK;
//     assert(ret == ESP_OK);

//     adc_digi_init_config_t adc_dma_config = {
//         .max_store_buf_size = 1024,
//         .conv_num_each_intr = 256,
//         .adc1_chan_mask = adc1_chan_mask,
//         .adc2_chan_mask = adc2_chan_mask,
//     };
//     ret = adc_digi_initialize(&adc_dma_config);
//     assert(ret == ESP_OK);

//     adc_digi_pattern_table_t adc_pattern[10] = {0};

//     //Do not set the sampling frequency out of the range between `SOC_ADC_SAMPLE_FREQ_THRES_LOW` and `SOC_ADC_SAMPLE_FREQ_THRES_HIGH`
//     adc_digi_config_t dig_cfg = {
//         .conv_limit_en = 0,
//         .conv_limit_num = 250,
//         .sample_freq_hz = 620,
//     };

//     dig_cfg.adc_pattern_len = channel_num;
//     for (int i = 0; i < channel_num; i++) {
//         uint8_t unit = ((channel[i] >> 3) & 0x1);
//         uint8_t ch = channel[i] & 0x7;
//         adc_pattern[i].atten = ADC_ATTEN_DB_11;
//         adc_pattern[i].channel = ch;
//         adc_pattern[i].unit = unit;
//     }
//     dig_cfg.adc_pattern = adc_pattern;
//     ret = adc_digi_controller_config(&dig_cfg);
//     assert(ret == ESP_OK);
// }

// static bool check_valid_data(const adc_digi_output_data_t *data)
// {
//     const unsigned int unit = data->type2.unit;
//     if (unit > 2) return false;
//     if (data->type2.channel >= SOC_ADC_CHANNEL_NUM(unit)) return false;

//     return true;
// }

// static void continuous_read(void *arg)
// {
//     esp_err_t ret;
//     uint32_t ret_num = 0;
//     uint8_t result[TIMES] = {0};
//     memset(result, 0xcc, TIMES);
//     float vout;

//     // uint16_t adc1_chan_mask = BIT(0) | BIT(1);
//     uint16_t adc1_chan_mask = BIT(0);
//     uint16_t adc2_chan_mask = BIT(0);
//     // adc_channel_t channel[3] = {ADC1_CHANNEL_0, ADC1_CHANNEL_1, (ADC2_CHANNEL_0 | 1 << 3)};
//     adc_channel_t channel[1] = {ADC1_CHANNEL_0};

//     continuous_adc_init(adc1_chan_mask, adc2_chan_mask, channel, sizeof(channel) / sizeof(adc_channel_t));
//     adc_digi_start();
//     // int n = 20;
//     while(1) {
//         ret = adc_digi_read_bytes(result, TIMES, &ret_num, ADC_MAX_DELAY);
//         for (int i = 0; i < ret_num; i+=4) {
//             adc_digi_output_data_t *p = (void*)&result[i];
//             if (check_valid_data(p)) {
//                 vout = (p->type2.data * 2500.00)/4095.00;
//                 printf("ADC%d_CH%d: %x  voltage is %fmv\n", p->type2.unit+1, p->type2.channel, p->type2.data,vout);
//             } else {
//                 printf("Invalid data [%d_%d_%x]\n", p->type2.unit+1, p->type2.channel, p->type2.data);
//             }
//         }
//         vTaskDelay(1000 / portTICK_PERIOD_MS);
//         // If you see task WDT in this task, it means the conversion is too fast for the task to handle

//     }  
//     adc_digi_stop();
//     ret = adc_digi_deinitialize();
//     assert(ret == ESP_OK);
// }

static void single_read(void *arg)
{
    // esp_err_t ret;
    // int adc1_reading[3] = {0xcc};
    int adc1_reading[1] = {0xcc};    
    // int adc2_reading[1] = {0xcc};
    uint32_t etc = 2;
    float vout;
    // const char TAG_CH[][10] = {"ADC1_CH2", "ADC1_CH3","ADC1_CH4", "ADC2_CH0"};
    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);
    // adc1_config_channel_atten(ADC1_CHANNEL_3, ADC_ATTEN_DB_6);
    // adc1_config_channel_atten(ADC1_CHANNEL_4, ADC_ATTEN_DB_0);
    // adc2_config_channel_atten(ADC2_CHANNEL_0, ADC_ATTEN_DB_0);

    // int n = 20;
    // while (n--) {
    while (1) {
        adc1_reading[0] = adc1_get_raw(ADC1_CHANNEL_0);
        // adc1_reading[1] = adc1_get_raw(ADC1_CHANNEL_3);
        // adc1_reading[2] = adc1_get_raw(ADC1_CHANNEL_4);
        vout = (adc1_reading[0] * 2500.00)/4095.00;
        ESP_LOGI(TAG_CH[0], "%x vout mv is %f", adc1_reading[0],vout);

        
        // for (int i = 0; i < 3; i++) {
        //     ESP_LOGI(TAG_CH[i], "%x", adc1_reading[i]);
        // }
        ret = adc2_get_raw(ADC2_CHANNEL_0, ADC_WIDTH_BIT_12, &adc2_reading[0]);
        // assert(ret == ESP_OK);
        // ESP_LOGI(TAG_CH[3], "%x", 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);
    //continuous_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_adc_cal_characteristics_t 结构体如下
typedef struct {
    adc_unit_t adc_num;                     /**< ADC number
    adc_atten_t atten;                      /**< ADC attenuation
    adc_bits_width_t bit_width;             /**< ADC bit width 
    uint32_t coeff_a;                       /**< Gradient of ADC-Voltage curve
    uint32_t coeff_b;                       /**< Offset of ADC-Voltage curve
    uint32_t vref;                          /**< Vref used by lookup table
    const uint32_t *low_curve;              /**< Pointer to low Vref curve of lookup table (NULL if unused)
    const uint32_t *high_curve;             /**< Pointer to high Vref curve of lookup table (NULL if unused)
} esp_adc_cal_characteristics_t;

计算函数如下:
uint32_t esp_adc_cal_raw_to_voltage(uint32_t adc_reading, const esp_adc_cal_characteristics_t *chars)
{
    ADC_CALIB_CHECK(chars != NULL, "No characteristic input.", ESP_ERR_INVALID_ARG);

    return adc_reading * chars->coeff_a / coeff_a_scaling + chars->coeff_b / coeff_b_scaling;
}

*/
esp_err_t esp_adc_cal_get_voltage(adc_channel_t channel,
                                  const esp_adc_cal_characteristics_t *chars,
                                  uint32_t *voltage)
{
    // Check parameters
    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) {
        //Check if channel is valid on ADC1
        ADC_CALIB_CHECK((adc1_channel_t)channel < ADC1_CHANNEL_MAX, "Invalid channel", ESP_ERR_INVALID_ARG);
        adc_reading = adc1_get_raw(channel);
    } else {
        //Check if channel is valid on ADC2
        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;     //Timed out waiting for ADC2
        }
    }
    *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_LOWSOC_ADC_SAMPLE_FREQ_THRES_HIGH范围内。
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32-C3入门教程 基础篇(一、ADC采样) 的相关文章

  • RISCV核设计与Chisel语言入门资料

    RISCV SOC设计与Chisel语言入门资料 关于项目的一点说明 Rocket核与Chisel语言 关于项目的一点说明 今年三月 我和舍友一起参加了第四届全国集成电路设计大赛 选择了RISCV挑战杯的子赛题二网址 自二月份开始着手做该项
  • 吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

    Chisel项目构建 运行和测试 一 用sbt构建Chisel项目并运行 上一大部分介绍了Chisel的基础语法 但除了教程开始的Demo以外 我们还没有开始写Chisel代码 这对于学习编程语言来说是大忌 不过好在Chisel基础语法部分
  • unresolved dependency: edu.berkeley.cs#firrtl_2.12;1.2-SNAPSHOT: not found

    Machine Environment SBT sbt 1 1 1 Scala scala 2 12 4 IntelliJ IntelliJ IDEA 2018 2 5 Community Edition Build IC 182 4892
  • ESP32-C3入门教程 基础篇(五、RMT应用 — 控制SK6812全彩RGB 灯)

    测试第五课 本来是准备测试一下PWM驱动 SK6812 RGB灯 但是研究了一段时间 发现在ESP32 C3 有更好而且现成的方式 实现 SK6812 的控制 使用PWM也不是不可以 只是对于初学者 需要多花好多时间 所以本文还是先以ESP
  • 如何处理地址不对齐指令?

    连续不断是处理器取指的另一个目标 如果处理器在每一个时钟周期都能取一条指令 就可以源源不断的为处理器提供后续指令流 而不会出现空闲的时钟周期 地址不对齐导致问题 不管是从指令缓存 还是从ITCM中取指令 若处理器遇到了一条地址不对齐的指令
  • ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)

    测试第三课 ESP32 C3的串口通信测试 老样子 使用Enocean无线模块和ESP32 C3进行串口通信 目录 前言 1 UART示例测试 1 1 UART 基础测试 1 2 与Enocean无线模块串口通信测试 2 ESP32 C3
  • STM32—ADC多通道采集电压

    文章目录 ADC详解 程序说明 函数主体 引脚配置 ADC和DMA配置 主函数 ADC详解 前面的博客中详细介绍了STM32中ADC的相关信息 这篇博客是对ADC内容的一个总结提升 ADC的详细介绍 ADC详解 程序说明 为了使这次代码阅读
  • 高速模数转换器(ADC)的INL/DNL测量

    摘要 尽管积分非线性和微分非线性不是高速 高动态性能数据转换器最重要的参数 但在高分辨率成像应用中却具有重要意义 本文简要回顾了这两个参数的定义 并给出了两种不同但常用的测量高速模数转换器 ADC 的INL DNL的方法 近期 许多厂商推出
  • 和你一起从零开始写RISC-V处理器(2)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 上期回顾 一 正片开始 编写各个模块 pc reg模块 if模块 rom模块 if id模块 id模块 regs模块 id ex模块 ex模块 二 顶层模块搭建 三 测试文件
  • Chisel实验笔记(一)

    最近在学习Risc v 其中伯克利大学开源了一款兼容Risc v指令集的处理器Rocket 而Rocket处理器是采用Chisel编写的 所以要学习Chisel Chisel的简单介绍如下 Chisel Constructing Hardw
  • 从零开始设计CPU——DEILT_RISCV

    目录 前言 相关资料参考 Deilt RISC Introduction 1 feature 2 Architecture 3 工程目录文件说明 4 仿真编译环境及工具 进程 2023 03 01 2023 03 08 03 13 2023
  • 二、RISC-V SoC内核注解——译码 代码讲解

    tinyriscv这个SoC工程的内核cpu部分 采用经典的三级流水线结构进行设计 即大家所熟知的 取值 gt 译码 gt 执行三级流水线 另外 在最后一个章节中会上传额外添加详细注释的工程代码 完全开源 如有需要可自行下载 上一篇博文中注
  • 栅压自举采样电路(bootstrap技术)

    栅压自举采样电路 bootstrap技术 参考 CMOS模 数转换器设计与仿真 编著 张锋 陈铖颖 范军 文章目录 栅压自举采样电路 bootstrap技术 一 电路结构 二 工作原理 一 电路结构 二 工作原理
  • STM8的ADC的五种工作模式

    STM8的ADC的五种工作模式 STM8的ADC是10位的逐次比较型模拟数字转换器 多达16个多功能的输入通道 拥有5种转换模式 转换结束可产生中断 STM8 ADC的初始化顺序如下 1 AD输入通道对应的IO设置为上拉输入 2 配置AD参
  • 如何为 Risc-V(汇编语言)编写旋转操作 我们有像 8086 中那样的命令吗?

    我以前使用过8086的汇编语言 8086中的旋转操作只是一个命令 但我在 Risc V 汇编语言中找不到旋转操作的特定关键字 看起来扩展 B 最终应该定义这样的指令 在那之前你必须使用左移和右移来组合它 这是 MIPS32R2 rotrv
  • 使用 Clang 为 RISC-V 进行编译

    我正在尝试使用构建一个 hello world 程序Clang 版本 12 0 1 适用于 RISC V 架构 我已经安装了它LLVM 版本 12 0 1 具有以下设置 cmake G Unix Makefiles DLLVM ENABLE
  • RISC-V 使用 LUI 和 ADDI 构建 32 位常量

    LUI 加载立即数 用于构建32位常量并使用U型格式 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位 并用零填充最低 12 位 我在手册中找到了这个 但是如果我想将 0xffffffff 移动到寄存器 我需要的所有代码是 LUI
  • 为什么 RV64 为 32 位操作而不是 64 位操作引入新的操作码

    在浏览 RISC V 规范时 我注意到 64 位版本与 32 位版本的不同之处在于 它 将寄存器扩展至 64 位 更改了指令以作用于整个 64 位范围 添加了执行 32 位操作的新指令 这使得 RV32 代码与 RV64 不兼容 但是 如果
  • 裸机 RISC-V CPU - 处理器如何知道从哪个地址开始获取指令?

    我正在设计自己的 RISC V CPU 并且已经能够实现一些指令代码 我已经安装了 RV32I 版本的 GCC 编译器 所以我现在有了汇编器riscv32 unknown elf as可用的 我正在尝试仅用一条指令来汇编一个程序 simpl
  • 零/符号扩展是无操作的,为什么要为每种大小类型提供指令呢?

    对于 x86 和 x64 编译器生成类似的零 符号扩展 MOVSX 和 MOVZX 扩展本身并不是免费的 但允许处理器执行无序魔法加速 但在 RISC V 上 因此 无符号和有符号 32 位整数之间的转换是无操作 从有符号 32 位整数到有

随机推荐

  • 10.4 a.m.小结

    T1 问题 A Prime Distance 题目描述 给定两个整数 L R 求闭区间 L R 中相邻两个质数差值最小的数对与差值最大的数对 当存在多个时 输出靠前的素数对 输入 多组数据 每行两个数 L R 输出 详见输出样例 样例输入
  • ubuntu查看内存占用和查看cpu使用情况的2种方法

    简易方法1 top法 并且摁下数字1 1 使用terminal 输入命令行 top 2 如果希望看到cpu核数 并且知道相关占用率等情况信息 此时按下数字 1 即可 3 摁下 q 退出 快捷方法2 使用htop 2 安装htop sudo
  • 代理IP的高匿名,匿名和透明的区别

    如果从隐藏使用代理用户的级别上划分 代理可以分为三种 即高度匿名代理 普通匿名代理和透明代理 1 高度匿名代理不改变客户机的请求 这样在服务器看来就像有个真正的客户浏览器在访问它 这时客户的真实IP是隐藏的 服务器端不会认为我们使用了代理
  • Latex 中插入 Matlab 代码

    这篇文章将介绍如何在 Latex 排版过程中添加 Matlab 代码 功能效果 主要有如下排版功能 语法高亮 自动添加边框 自动添加行号 先上图 大家感受一下效果 而实现这些只需要一行代码加一个包 插入代码块 usepackage list
  • Unity Hub导入项目“静夜思”报错error CS0619: ‘GUIText‘ is obsolete: ‘GUIText has been removed. Use UI.Text inst

    报错 问题 按照控制台报错位置 找到Assets Standard Assets Utility FPSCounter cs文件 根据提示 GUIText is obsolete GUIText has been removed Use U
  • RFID医药供应链管理系统解决方案——铨顺宏FUWIT

    1 社会背景 根据世界卫生组织的报告 全球假药比例已经超过10 中国医学会数据显示 我们每年至少有20万人死于假药与用药不当 国际上已经对医疗产品的跟踪十分重视 美国FDA已经通过立法 加强在药物运输 销售 访问 追溯体系的应用 目前医疗领
  • qt5+osg多线程的解决方案

    问题描述 Cannot make QOpenGLContext current in a different thread 解决思路 在主线程中将qt窗体中的QOpenglContext moveToThread到窗体线程中 这样窗体线程在
  • 知识存储-cypher查询语句基础(1)

    1 概述 我们在进行关系型数据库操作的时候使用sql 在使用其他数据库时使用sparsql 在操作neo4j时使用cypher语法 这是一种非常简单的查询语法 方便我们掌握 1 neo4j中的相关概念 节点 节点是图数据库中的一个基本元素
  • 安装neo4j出现的问题

    安装步骤 1 jdk安装 下载地址 https www oracle com java technologies javase downloads html jdk使用11以上版本 点击安装 设置环境变量 全部路径 bin 2 neo4j安
  • 高斯滤波的快速实现

    http www cnblogs com ImageVision archive 2012 06 11 2545555 html 二維高斯函數具有旋轉對稱性 處理後不會對哪一個方向上的邊緣進行了過多的濾波 因此相對其他濾波器 具有無法比擬的
  • python PyQt5事件监听机制

    1 事件监听机制实际上应该是事件循环机制 搜这个搜到的结果更多更详细 2 qt的事件循环实际上不是多线程实现的 实现机制实际上是事件循环和消息队列 随便打开一个QT编写的程序 运行ProcessExplorer等待一段时间后查看进程后发现内
  • idea中java程序打jar包的两种方式(超详细)

    java程序打成的jar包有两种类型 一种是可直接执行的runnable jar文件 另一种是包含多个主类 运行时需要指定主类全类名的jar包 下面我们细说在idea中两种jar包的打包方法及执行jar包时的命令 第一种 含多个主类的jar
  • 【机器学习】最优化方法:梯度下降法

    1 概念 梯度下降法 Gradient Descent 又称最速下降法 Steepest descent 是一种常用的一阶优化方法 是一种用于求解无约束最优化问题的最常用的方法 它选取适当的初始值 并不断向负梯度方向迭代更新 实现目标函数的
  • 颜色空间YCrCb

    YCrCb即YUV 主要用于优化彩色视频信号的传输 使其向后相容老式黑白电视 与RGB视频信号传输相比 它最大的优点在于只需占用极少的频宽 RGB要求三个独立的视频信号同时传输 其中 Y 表示明亮度 Luminance或Luma 也就是灰阶
  • 深度学习网络__tensorflow__第四讲__神经网络优化

    本文为转载北京大学 人工智能实践 Tensorflow笔记 课程 链接 https www icourse163 org course PKU 1002536002 Tensorflow 笔记 第四讲 神经网络优化 4 1 神经元模型 用数
  • VirtualBox的下载与安装

    文章来源 http sh qihoo com pc 91c30d12ff6bd60e9 cota 4 tj url xz sign 360 e39369d1 refer scene so 1 1 下载VirtualBox VirtualBo
  • 2.4.10 Profile HEA参数

    最后更新2021 07 23 HEA有两种使用方式 第一种是独立作为虚拟以太网支持卡使用 第二种是作为普通网卡 性能更高 无论哪一种方式都需要对HEA做一些特殊的初始化设置 并且是互斥的 我们先来看看系统中HEA的状态 操作如 lt 图 2
  • vulhub安装时的问题

    在安装vulhub时 出现cannot import transport或者是无法导入其他的模块 从网上找到的方法都尝试之后均不行 这个文件夹明明存在 但是他就是说找不到 解决方法 在使用pip进行安装的时候 网上找的他们都是直接默认安装的
  • python __doc__方法

    doc 方法是python的内置方法之一 该方法通常会输出指定对象中的注释部分 NB 注意 后面的部分表示输出结果 代码如下 class Debug This is a class for debugging def init self T
  • ESP32-C3入门教程 基础篇(一、ADC采样)

    经过前面的折腾 设计好了自己的测试开发板 搭建好了开发环境 然后正式开始进行功能测试了 测试顺序先从简单的开始吧 一步一步来 目录 前言 1 ADC采样示例测试 1 1 DMA连续采样 1 2 单次采样 1 3 测试源码 2 ESP32 C