STM32DAC输出可调电压、三角波、正弦波

STM32DAC输出可调电压、三角波、正弦波

  • DAC简介
  • 输出可调电压
  • 输出正弦波
  • 输出三角波

本期内容我们将学习stm32DAC的原理和使用方法

DAC简介

DAC,全称:Digital-to-Analog Converter,指数字/模拟转换器。可以将数字量转换为模拟量进行输出,原理与ADC相反。由于stm32F411RCT6上面未搭载DAC模块,所以我们本期内容以f103RCT6做演示。

stm32F103RCT6上只有一个DAC,但是有两个输出通道(分别对应PA4、PA5),可以同时工作并输出,并带有输出缓存功能,可用来降低输出阻抗并在不增加外部运算放大器的情况下直接驱动外部负载。

不知道什么是DAC的可以看看 蓝桥杯单片机学习11——PCF8591A/D&D/A转换芯片

下面是DAC的一些重要知识

1.主要特性

  • 两个 DAC 转换器:各对应一个输出通道
  • 12 位模式下数据采用左对齐或右对齐
  • 同步更新功能
  • 生成噪声波
  • 生成三角波
  • DAC 双通道单独或同时转换
  • 每个通道都具有 DMA 功能
  • DMA 下溢错误检测
  • 通过外部触发信号进行转换
  • 输入参考电压 VREF+

2.DAC时钟频率

  • F1系列为36MHz
  • F4系列为42MHz(挂在APB1)或45MHz(挂在APB2上)
  • F7系列为54MHz
  • H7系列为120MHz

3.建立时间

  • 建立时间表示将一个数字量转换为稳定模拟信号所需的时间
  • F1、4、7系列都是3us
  • H7系列建立时间为1.7us

4.输出电压计算

  • DAC输出电压
  • DAC输出电压 = ( DORX / 2^ n) * (Vref+ - Vref-)

其中:DORX为DAC的数字量 ,n为DAC的分辨率,Vref为参考电压

输出可调电压

1.打开CubeMX,进入DAC选项,进行如下配置
在这里插入图片描述

其他部分配置,这里不做介绍

在main函数中添加以下代码

int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t i=0;          //计数变量
    uint16_t DAC_Data=0;  //DAC数字量
    float DAC_Val=0;      //DAC输出电压
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
      for(i=0;i<10;i++)
      {
         
       HAL_DAC_SetValue(&hdac,DAC_CHANNEL_1,DAC_ALIGN_12B_R,i*4096/10);  //设置DAC输出电压 = 0.33*i
           DAC_Data = HAL_DAC_GetValue(&hdac,DAC_CHANNEL_1);             //读取DAC的数字量
          printf("DAC_Data = %d  ",DAC_Data);                            //打印数字量
          DAC_Val = (float)DAC_Data/4096*3.3;                           //计算应该输出的电压值
          printf("DAC_Val = %f   ",DAC_Val);                            //打印电压值
          printf("\r\n");                                               //换行
          HAL_Delay(1000);                                              //延时1s
      }
      

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

得到输出结果:

在这里插入图片描述

输出正弦波

stm32的DAC是没有直接输出正弦波的功能,所以我们只能模拟一个正弦波,并且进行输出,具体思路如下:

正弦函数是一个连续变化的函数,想要输出一个正弦函数的波形,我们通常会将一个周期以时间间隔t进行很多次的等分,并计算出每个时间节点对应的输出电压值,这样我们只需要在每一个时间节点,输出对应的电压(写入对应的数字量),就可以实现正弦函数波形输出,当然,如果时间间隔t越小,即等分的次数越多,输出的波形越接近正弦函数,随之而来的,单片机的CPU占用率就越大。

在这里插入图片描述

当然,我们也可以提前对输出的波形进行等分,计算出对应的数字量,再通过数组定义,可以减轻CPU的负担。
或者在单片机上电就开始计算对应的电压值,并存放到数组中。

下面我们来看具体应用:

  1. CubeMX配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

其他部分配置,这里不做介绍

//正弦波数字量数组,这里进行512等分,适用于12为分辨率的情况

uint16_t Sin_512_bit[512] ={
2073,
2098,
2123,
2148,
2173,
2198,
2223,
2248,
2273,
2298,
2323,
2348,
2373,
2398,
2422,
2447,
2472,
2496,
2521,
2545,
2569,
2594,
2618,
2642,
2666,
2690,
2714,
2737,
2761,
2785,
2808,
2831,
2854,
2877,
2900,
2923,
2946,
2968,
2991,
3013,
3035,
3057,
3079,
3100,
3122,
3143,
3164,
3185,
3206,
3227,
3247,
3267,
3288,
3307,
3327,
3347,
3366,
3385,
3404,
3423,
3441,
3460,
3478,
3496,
3513,
3531,
3548,
3565,
3582,
3598,
3615,
3631,
3646,
3662,
3677,
3692,
3707,
3722,
3736,
3750,
3764,
3778,
3791,
3804,
3817,
3829,
3842,
3854,
3865,
3877,
3888,
3899,
3909,
3920,
3930,
3940,
3949,
3958,
3967,
3976,
3984,
3992,
4000,
4007,
4014,
4021,
4028,
4034,
4040,
4046,
4051,
4056,
4061,
4065,
4069,
4073,
4077,
4080,
4083,
4086,
4088,
4090,
4092,
4093,
4094,
4095,
4095,
4095,
4095,
4095,
4094,
4093,
4092,
4090,
4088,
4086,
4083,
4080,
4077,
4073,
4069,
4065,
4061,
4056,
4051,
4046,
4040,
4034,
4028,
4021,
4014,
4007,
4000,
3992,
3984,
3976,
3967,
3958,
3949,
3940,
3930,
3920,
3909,
3899,
3888,
3877,
3865,
3854,
3842,
3829,
3817,
3804,
3791,
3778,
3764,
3750,
3736,
3722,
3707,
3692,
3677,
3662,
3646,
3631,
3615,
3598,
3582,
3565,
3548,
3531,
3513,
3496,
3478,
3460,
3441,
3423,
3404,
3385,
3366,
3347,
3327,
3307,
3288,
3267,
3247,
3227,
3206,
3185,
3164,
3143,
3122,
3100,
3079,
3057,
3035,
3013,
2991,
2968,
2946,
2923,
2900,
2877,
2854,
2831,
2808,
2785,
2761,
2737,
2714,
2690,
2666,
2642,
2618,
2594,
2569,
2545,
2521,
2496,
2472,
2447,
2422,
2398,
2373,
2348,
2323,
2298,
2273,
2248,
2223,
2198,
2173,
2148,
2123,
2098,
2073,
2047,
2022,
1997,
1972,
1947,
1922,
1897,
1872,
1847,
1822,
1797,
1772,
1747,
1722,
1697,
1673,
1648,
1623,
1599,
1574,
1550,
1526,
1501,
1477,
1453,
1429,
1405,
1381,
1358,
1334,
1310,
1287,
1264,
1241,
1218,
1195,
1172,
1149,
1127,
1104,
1082,
1060,
1038,
1016,
995,
973,
952,
931,
910,
889,
868,
848,
828,
807,
788,
768,
748,
729,
710,
691,
672,
654,
635,
617,
599,
582,
564,
547,
530,
513,
497,
480,
464,
449,
433,
418,
403,
388,
373,
359,
345,
331,
317,
304,
291,
278,
266,
253,
241,
230,
218,
207,
196,
186,
175,
165,
155,
146,
137,
128,
119,
111,
103,
95 ,
88 ,
81 ,
74 ,
67 ,
61 ,
55 ,
49 ,
44 ,
39 ,
34 ,
30 ,
26 ,
22 ,
18 ,
15 ,
12 ,
9  ,
7  ,
5  ,
3  ,
2  ,
1  ,
0  ,
0  ,
0  ,
0  ,
0  ,
1  ,
2  ,
3  ,
5  ,
7  ,
9  ,
12 ,
15 ,
18 ,
22 ,
26 ,
30 ,
34 ,
39 ,
44 ,
49 ,
55 ,
61 ,
67 ,
74 ,
81 ,
88 ,
95 ,
103,
111,
119,
128,
137,
146,
155,
165,
175,
186,
196,
207,
218,
230,
241,
253,
266,
278,
291,
304,
317,
331,
345,
359,
373,
388,
403,
418,
433,
449,
464,
480,
497,
513,
530,
547,
564,
582,
599,
617,
635,
654,
672,
691,
710,
729,
748,
768,
788,
807,
828,
848,
868,
889,
910,
931,
952,
973,
995,
1016,
1038,
1060,
1082,
1104,
1127,
1149,
1172,
1195,
1218,
1241,
1264,
1287,
1310,
1334,
1358,
1381,
1405,
1429,
1453,
1477,
1501,
1526,
1550,
1574,
1599,
1623,
1648,
1673,
1697,
1722,
1747,
1772,
1797,
1822,
1847,
1872,
1897,
1922,
1947,
1972,
1997,
2022,
2047,
};
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_DAC_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
    HAL_TIM_Base_Start(&htim2);         //开启定时器2
  HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t *)Sin_512_bit, 512, DAC_ALIGN_12B_R); //通过DMA开启DAC转换
  /* USER CODE END 2 */           //顶上去2每溢出一次,就会从Sin_512_bit搬运一次数据到DAC进行转换输出

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

这里我们采样的是提前计算出DAC转换数字量的方式,因为要输出的波形越好看,等分数量会越多,单片机计算量也会随之增加,为了减轻单片机负担和代码运行效率,我们选择提前计算。

演示效果如下:

在这里插入图片描述
这里讲一下生成波形的频率计算:

我们配置定时器2时,选择时钟不分频,计数值最大值为19,也就是说定时器每次产生更新事件频率为:
72MHz/(0+1)* (19+1)= 3.6MHz

一个波形被平均分为512等分,也就是所一个周期内包含512个更新事件:
那么产生波形的频率 = 3.6MHz / 512 = 7031.25Hz,与图中7.04KHz相近

//,这里进行512等分,适用于12为分辨率的情况

正弦波数字量数组可以借助工具Excel生成,我就是这么干的,网上有教程,也可以问问万能的GPT,或者在系统上电前计算出。代码如下:

  • g_dac_sin_buf是存放DAC正弦波数字量的数组,长度可自己定义
  • 代码来自正点原子官方提供代码,亲测好用
/**
 * @brief       产生正弦波序列函数
 *   @note      需保证: maxval > samples/2
 * @param       maxval : 最大值(0 < maxval < 2048)
 * @param       samples: 采样点的个数
 * @retval      无
 */
void dac_creat_sin_buf(uint16_t maxval, uint16_t samples)
{
    uint8_t i;
    float outdata = 0;                     /* 存放计算后的数字量 */
    float inc = (2 * 3.1415962) / samples; /* 计算相邻两个点的x轴间隔 */

    if(maxval <= (samples / 2))return ;	   /* 数据不合法 */

    for (i = 0; i < samples; i++)
    {
        /* 
         * 正弦波函数解析式:y = Asin(ωx + φ)+ b
         * 计算每个点的y值,将峰值放大maxval倍,并将曲线向上偏移maxval到正数区域
         * 注意:DAC无法输出负电压,所以需要将曲线向上偏移一个峰值的量,让整个曲线都落在正数区域
         */
        outdata = maxval * sin(inc * i) + maxval;
        if (outdata > 4095)
            outdata = 4095; /* 上限限定 */
        //printf("%f\r\n",outdata);
        g_dac_sin_buf[i] = outdata;
    }
}

具体原理如下:、
在这里插入图片描述

讲完正弦波,我们来讲讲三角波。

输出三角波

三角波理论上可以通过正弦波的方式产生,这里就不做解释了,给大家提供一个DAC产生三角波的数组量数组吧

适用于12位分辨率情况下输出,等分次数为256

/*三角波数组,256个元素*/
uint16_t SanJiao_256_bit[256] = {
	2048, 2080, 2112, 2144, 2176, 2208, 2240, 2272,
    2304, 2336, 2368, 2400, 2432, 2464, 2496, 2528,
    2560, 2592, 2624, 2656, 2688, 2720, 2752, 2784,
    2816, 2848, 2880, 2912, 2944, 2976, 3008, 3040,
    3072, 3104, 3136, 3168, 3200, 3232, 3264, 3296,
    3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552,
    3584, 3616, 3648, 3680, 3712, 3744, 3776, 3808,
    3840, 3872, 3904, 3936, 3968, 4000, 4032, 4064,
    4095, 4063, 4031, 3999, 3967, 3935, 3903, 3871,
    3839, 3807, 3775, 3743, 3711, 3679, 3647, 3615,
    3583, 3551, 3519, 3487, 3455, 3423, 3391, 3359,
    3327, 3295, 3263, 3231, 3199, 3167, 3135, 3103,
    3071, 3039, 3007, 2975, 2943, 2911, 2879, 2847,
    2815, 2783, 2751, 2719, 2687, 2655, 2623, 2591,
    2559, 2527, 2495, 2463, 2431, 2399, 2367, 2335,
    2303, 2271, 2239, 2207, 2175, 2143, 2111, 2079,
    2047, 2015, 1983, 1951, 1919, 1887, 1855, 1823,
    1791, 1759, 1727, 1695, 1663, 1631, 1599, 1567,
    1535, 1503, 1471, 1439, 1407, 1375, 1343, 1311,
    1279, 1247, 1215, 1183, 1151, 1119, 1087, 1055,
    1023, 991, 959, 927, 895, 863, 831, 799,
    767, 735, 703, 671, 639, 607, 575, 543,
    511, 479, 447, 415, 383, 351, 319, 287,
    255, 223, 191, 159, 127, 95, 63, 31,
    0, 32, 64, 96, 128, 160, 192, 224,
    256, 288, 320, 352, 384, 416, 448, 480,
    512, 544, 576, 608, 640, 672, 704, 736,
    768, 800, 832, 864, 896, 928, 960, 992,
    1024, 1056, 1088, 1120, 1152, 1184, 1216, 1248,
    1280, 1312, 1344, 1376, 1408, 1440, 1472, 1504,
    1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760,
    1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016,

};

前面提到DAC有输出三角波功能 接下来我们讲解DAC的三角波输出功能

  1. CubeMX配置

在这里插入图片描述
在这里插入图片描述

其他部分配置,这里不做介绍

代码如下;

int main(void)
{
  /* USER CODE BEGIN 1 */
   uint16_t i=0;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DAC_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start(&htim2);           //开启定时器2
  HAL_DAC_Start(&hdac,DAC_CHANNEL_1);   //开启DAC转换
  HAL_DACEx_TriangleWaveGenerate(&hdac,DAC_CHANNEL_1,DAC_TRIANGLEAMPLITUDE_2047); //设置幅值为1.65V,进行2047*2等分
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
     
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

运行结果如下:
请添加图片描述

如图,输出三角波频率为481Hz ,幅值1.65V

计算推导如下:

三角波频率 = 72Mhz/36/(2*2047) = 488Hz,与结果相近。

当然你也可以通过以下代码产生三角波:

  • 代码同样来源与正点原子
/**
 * @brief       设置DAC_OUT1输出三角波
 *   @note      输出频率 ≈ 1000 / (dt * samples) Khz, 不过在dt较小的时候,比如小于5us时, 由于delay_us
 *              本身就不准了(调用函数,计算等都需要时间,延时很小的时候,这些时间会影响到延时), 频率会偏小.
 * 
 * @param       maxval : 最大值(0 < maxval < 4096), (maxval + 1)必须大于等于samples/2
 * @param       dt     : 每个采样点的延时时间(单位: us)
 * @param       samples: 采样点的个数, samples必须小于等于(maxval + 1) * 2 , 且maxval不能等于0
 * @param       n      : 输出波形个数,0~65535
 *
 * @retval      无
 */
void dac_triangular_wave(uint16_t maxval, uint16_t dt, uint16_t samples, uint16_t n)
{
    uint16_t i, j;
    float incval;                               /* 递增量 */
    float Curval;                               /* 当前值 */
    
    if(samples > ((maxval + 1) * 2))return ;    /* 数据不合法 */
        
    incval = (maxval + 1) / (samples / 2);      /* 计算递增量 */
    
    for(j = 0; j < n; j++)
    { 
        Curval = 0;
        HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);    /* 先输出0 */
        for(i = 0; i < (samples / 2); i++)      /* 输出上升沿 */
        {
            Curval  +=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        }
        for(i = 0; i < (samples / 2); i++)      /* 输出下降沿 */
        {
            Curval  -=  incval;                 /* 新的输出值 */
            HAL_DAC_SetValue(&g_dac_handle, DAC_CHANNEL_1, DAC_ALIGN_12B_R, Curval);
            delay_us(dt);
        }
    }
}

不过,这个函数需要一直执行才能输出三角波,CPU占用率高达100%,不是很建议使用。具体原理如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/211654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入了解Vue.js:构建现代、响应式的前端应用

文章目录 1. Vue.js简介1.1 安装Vue.js 2. Vue的核心概念2.1 数据驱动2.2 组件化2.3 生命周期钩子 3. Vue的特性3.1 响应式数据3.2 模板语法3.3 组件通信 4. 示例项目结语 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1…

2023 如何下载最干净的 win10 win11 微软官方原版系统镜像(详细图文)

前言 不会吧不会吧&#xff0c;不会到现在还有人不会下载原版系统镜像吧 开始 win10官方下载工具下载地址&#xff1a;https://www.microsoft.com/zh-cn/software-download/windows10 win11官方下载工具下载地址&#xff1a;https://www.microsoft.com/zh-cn/software-downl…

java实验:数据库应用(idea+mysql+php)

设计用户注册和登录界面&#xff0c;实现用户注册和登录操作。 设计用户注册/登录界面;使用工具在MySQL中创建user表&#xff0c;包括学号、姓名、密码、专业、班级&#xff1b;实现注册操作&#xff1a;在user表中插入一条新纪录&#xff0c;但学号不能重复&#xff1b;实现登…

Mybatis 操作续集2(结合上文)

Mybatis 是一个持久层框架,用于简化数据库的操作,和Spring 没有任何关系,我们现在能使用它是因为 Spring Boot 把Mybatis 的依赖给引入进来了,在 pom.xml 里面 Mybatis 如何进行重命名? 看最后两行代码,这样就能重命名了 package com.example.mybatisdemo.mapper;import com…

最大单词数算法分析

题目描述&#xff1a; 算法一&#xff1a; 代码实现&#xff1a; # include<stdio.h> # include<string.h>int main(){//char text[100]"leet code";//char brokenLetters[26]"lt";char text[100]"hello world";char brokenLetters…

代码随想录第二十二天(一刷C语言)|组合总数电话号码的字母组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、组合总数 思路&#xff1a;参考carl文档和视频 1、需要一维数组path来存放符合条件的结果&#xff0c;二维数组result来存放结果集。 2、targetSum 目标和&#xff0c;也就是题目中的…

AD7124-4 实测热电偶数据读取,电压精度到稳定到±1uV, 电压波动260nV, 温度精度到±0.01℃

AD7124-4 实测热电偶数据读取&#xff0c;电压精度到稳定到1uV, 电压波动260nV, 温度精度到0.01℃ AD7124_STM32_ADI官网例程使用stm32 和ad7124做温控调试&#xff0c;发现效果还是不错的&#xff0c;至少比ads1256的效果好多啦&#xff01;Chapter1 AD7124-4 实测热电偶数据读…

OpenSSH 漏洞修复升级最新版本

Centos7系统ssh默认版本一般是OpenSSH7.4左右&#xff0c;低版本是有漏洞的而且是高危漏洞&#xff0c;在软件交付和安全扫描上是过不了关的&#xff0c;一般情况需要升级OpenSSH的最新版本 今天详细说下升级最新版本的处理过程&#xff08;认真看会发现操作很简单&#xff0c…

springboot 整合 Spring Security 上篇

1.创建springBoot 项目工程(spring6.0的底层、JDK17) 1.添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>配置完成启动访问controller会出现登录…

P5 链表 尾部插入新节点(不是指定点)

目录 前言 01 链表数据插入之直接在链表尾插入&#xff08;不是指定点&#xff09; 02 尾插创建链表优化 示例代码 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C》✨✨✨ &#x1f525; 推荐专栏2: 《 Linux C应用编程&#xff08;概念…

JS逆向-mytoken之code参数

前言 本文是该专栏的第60篇,后面会持续分享python爬虫干货知识,记得关注。 本文以mytoken为例,通过js逆向获取其code参数的生成规律。具体的“逆向”思路逻辑,笔者将会详细介绍每个步骤,并且将在正文结合“完整代码”进行详细说明。 接下来,跟着笔者直接往下看正文详细…

Halcon参考手册目标检测和实例分割知识总结

1.1 目标检测原理介 目标检测&#xff1a;我们希望找到图像中的不同实例并将它们分配给某一个类别。实例可以部分重叠&#xff0c;但仍然可以区分为不同的实例。如图(1)所示&#xff0c;在输入图像中找到三个实例并将其分配给某一个类别。 图(1)目标检测示例 实例分割是目标检…

轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MaskTextureEffect.ts 当前示例运行效果: 两层材质效果: 三层材质效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export c…

笔记-基于CH579M模块通过网线直连电脑进行数据收发(无需网络)

刚学习&#xff0c;做个记录。 基于CH579M模块通过网线直连电脑进行数据收发(无需网络) 目录 一、工具1、CH579模块2、 网线3、电脑以及网络调试工具 二、操作步骤1、TCP/UDP等程序下载以及设置以太网IP2、网络断开3、检查以太网是否正常显示并稳定4、打开网络调试助手进行测试…

643. 子数组最大平均数 I

子数组最大平均数 I 描述 : 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 题目 : LeetCode 643.子数组最大平均数 :: 643. 子数…

Mybatis 分页查询的三种实现

Mybatis 分页查询 1. 直接在 sql 中使用 limit2. 使用 RowBounds3. 使用 Mybatis 提供的拦截器机制3.1 创建一个自定义拦截器类实现 Interceptor3.2 创建分页查询函数 与 sql3.3 编写拦截逻辑3.4 注册 PageInterceptor 到 Mybatis 拦截器链中3.5 测试 准备一个分页查询类 Data…

优彩云采集器最新版免费下载,优彩云采集器免费

随着网络时代的发展&#xff0c;SEO&#xff08;Search Engine Optimization&#xff0c;搜索引擎优化&#xff09;已经成为网站推广和营销的关键一环。在SEO的世界里&#xff0c;原创内容的重要性愈发凸显。想要做到每天更新大量原创文章&#xff0c;并不是一件轻松的事情。优…

NIO网络编程

Netty学习之NIO基础 - Nyimas Blog 1、阻塞 阻塞模式下&#xff0c;相关方法都会导致线程暂停 ServerSocketChannel.accept 会在没有连接建立时让线程暂停SocketChannel.read 会在通道中没有数据可读时让线程暂停阻塞的表现其实就是线程暂停了&#xff0c;暂停期间不会占用 c…

开源软件license介绍与检测

开源License介绍 通俗来讲&#xff0c;开源许可证就是一种允许软件使用者在一定条件内按照需要自由使用和修改软件及其源代码的的法律条款。借此条款&#xff0c;软件作者可以将这些权利许可给使用者&#xff0c;并告知使用限制。这些许可条款可以由个人、商业公司或非赢利组织…

mediapipe+opencv实现保存图像中的人脸,抹去其他信息

mediapipeopencv MediaPipe本身不提供图像处理功能&#xff0c;它主要用于检测和跟踪人脸、手势、姿势等。如果您想要从图像中仅提取人脸主要信息并去除其他信息. # codingutf-8 """project: teatAuthor&#xff1a;念卿 刘file&#xff1a; test.pydate&…