当前位置: 首页 > news >正文

STM32 HAL库 L298N电机驱动模块实现

一、引言

在机器人、自动化设备等众多应用场景中,电机驱动是一个关键的部分。L298N 是一款常用的电机驱动模块,它可以驱动两个直流电机或一个步进电机。STM32F407 是一款高性能的 ARM Cortex-M4 内核微控制器,结合 HAL 库可以方便地实现对 L298N 电机驱动模块的控制。本文将详细介绍如何使用 STM32F407 的 HAL 库来实现对 L298N 电机驱动模块的控制。

二、L298N 电机驱动模块介绍

2.1 基本原理

L298N 是一种双 H 桥电机驱动芯片,H 桥电路是一种常用于控制直流电机正反转和调速的电路结构。通过控制 H 桥电路中各个开关管的导通和截止状态,可以改变电机两端的电压极性,从而实现电机的正反转。同时,通过调节输入信号的占空比,可以实现对电机转速的控制。

2.2 引脚说明

L298N 模块通常有以下主要引脚:

  • 电源引脚:包括电源输入(VCC)、接地(GND)和电机电源输入(+12V)。
  • 控制引脚:用于控制电机的正反转和调速,通常有 4 个输入引脚(IN1 - IN4)和 2 个使能引脚(ENA 和 ENB)。
  • 电机输出引脚:用于连接电机,有 4 个输出引脚(OUT1 - OUT4),分别对应两个电机。

三、STM32F407 开发环境搭建

3.1 硬件准备
  • STM32F407 开发板
  • L298N 电机驱动模块
  • 直流电机
  • 杜邦线若干
3.2 软件准备
  • Keil MDK-ARM 开发环境
  • STM32CubeMX 图形化配置工具
3.3 配置 STM32CubeMX
  1. 创建新项目:打开 STM32CubeMX,选择对应的 STM32F407 芯片型号,创建一个新的项目。
  2. 配置时钟:在 RCC 选项中,选择外部高速时钟(HSE),并配置系统时钟为 168MHz。
  3. 配置 GPIO:选择需要连接到 L298N 模块的 GPIO 引脚,将其配置为推挽输出模式。
  4. 配置定时器(可选):如果需要实现电机调速功能,可以配置一个定时器用于产生 PWM 信号。选择一个合适的定时器,配置其时钟源、预分频器和自动重载值,使其产生所需的 PWM 频率。
3.4 生成代码

完成配置后,点击 “Generate Code” 按钮,生成 Keil MDK 项目代码。

四、代码实现

4.1 初始化 GPIO 引脚

在生成的代码中,找到 main.c 文件,添加以下代码来初始化连接到 L298N 模块的 GPIO 引脚:

#include "main.h"
#include "stm32f4xx_hal.h"// 定义连接到 L298N 模块的 GPIO 引脚
#define IN1_PIN GPIO_PIN_0
#define IN1_PORT GPIOA
#define IN2_PIN GPIO_PIN_1
#define IN2_PORT GPIOA
#define ENA_PIN GPIO_PIN_2
#define ENA_PORT GPIOAvoid SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){// 主循环代码}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** 初始化 RCC 振荡器 */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 7;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** 初始化 RCC 时钟 */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pins : IN1_PIN IN2_PIN ENA_PIN */GPIO_InitStruct.Pin = IN1_PIN|IN2_PIN|ENA_PIN;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}void Error_Handler(void)
{while(1){}
}
4.2 控制电机正反转

在 main 函数的主循环中,添加以下代码来控制电机的正反转:

int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();while (1){// 电机正转HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_SET);HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_RESET);HAL_GPIO_WritePin(ENA_PORT, ENA_PIN, GPIO_PIN_SET);HAL_Delay(2000);// 电机反转HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_RESET);HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_SET);HAL_GPIO_WritePin(ENA_PORT, ENA_PIN, GPIO_PIN_SET);HAL_Delay(2000);// 电机停止HAL_GPIO_WritePin(ENA_PORT, ENA_PIN, GPIO_PIN_RESET);HAL_Delay(2000);}
}
4.3 实现电机调速(使用 PWM)

如果需要实现电机调速功能,可以使用定时器产生 PWM 信号来控制电机的转速。以下是一个简单的示例代码:

#include "main.h"
#include "stm32f4xx_hal.h"// 定义连接到 L298N 模块的 GPIO 引脚
// IN1 引脚用于控制电机正反转的逻辑输入,此处使用 GPIOA 的第 0 号引脚
#define IN1_PIN GPIO_PIN_0
// IN1 引脚所在的 GPIO 端口为 GPIOA
#define IN1_PORT GPIOA
// IN2 引脚用于控制电机正反转的逻辑输入,此处使用 GPIOA 的第 1 号引脚
#define IN2_PIN GPIO_PIN_1
// IN2 引脚所在的 GPIO 端口为 GPIOA
#define IN2_PORT GPIOA
// ENA 引脚用于使能电机,控制电机的启动和停止,此处使用 GPIOA 的第 2 号引脚
#define ENA_PIN GPIO_PIN_2
// ENA 引脚所在的 GPIO 端口为 GPIOA
#define ENA_PORT GPIOA// 定义定时器句柄,用于操作 TIM3 定时器
TIM_HandleTypeDef htim3;// 函数声明:配置系统时钟
void SystemClock_Config(void);
// 函数声明:初始化 GPIO 引脚
static void MX_GPIO_Init(void);
// 函数声明:初始化 TIM3 定时器
static void MX_TIM3_Init(void);// 主函数,程序的入口点
int main(void)
{// 初始化 HAL 库,为后续使用 HAL 库函数做准备HAL_Init();// 配置系统时钟,使系统以合适的时钟频率运行SystemClock_Config();// 初始化连接到 L298N 模块的 GPIO 引脚MX_GPIO_Init();// 初始化 TIM3 定时器,用于产生 PWM 信号控制电机转速MX_TIM3_Init();// 启动 TIM3 定时器的通道 1 的 PWM 输出HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);// 主循环,程序将在此循环中不断执行while (1){// 电机正转,不同转速// 设置 IN1 引脚为高电平,IN2 引脚为低电平,使电机正转HAL_GPIO_WritePin(IN1_PORT, IN1_PIN, GPIO_PIN_SET);HAL_GPIO_WritePin(IN2_PORT, IN2_PIN, GPIO_PIN_RESET);// 低转速// 设置 TIM3 定时器通道 1 的比较值为 200,从而改变 PWM 信号的占空比,实现低转速控制__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 200);// 延时 2000 毫秒,让电机以低转速运行一段时间HAL_Delay(2000);// 中转速// 设置 TIM3 定时器通道 1 的比较值为 500,改变 PWM 信号的占空比,实现中转速控制__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);// 延时 2000 毫秒,让电机以中转速运行一段时间HAL_Delay(2000);// 高转速// 设置 TIM3 定时器通道 1 的比较值为 800,改变 PWM 信号的占空比,实现高转速控制__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 800);// 延时 2000 毫秒,让电机以高转速运行一段时间HAL_Delay(2000);// 电机停止// 设置 ENA 引脚为低电平,使电机停止转动HAL_GPIO_WritePin(ENA_PORT, ENA_PIN, GPIO_PIN_RESET);// 延时 2000 毫秒,让电机停止一段时间HAL_Delay(2000);}
}// 配置系统时钟的函数
void SystemClock_Config(void)
{// 定义 RCC 振荡器初始化结构体RCC_OscInitTypeDef RCC_OscInitStruct = {0};// 定义 RCC 时钟初始化结构体RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** 初始化 RCC 振荡器 */// 设置振荡器类型为外部高速时钟(HSE)RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;// 使能外部高速时钟RCC_OscInitStruct.HSEState = RCC_HSE_ON;// 使能 PLL(锁相环)RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;// 设置 PLL 的时钟源为外部高速时钟RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;// 设置 PLL 的 M 分频系数RCC_OscInitStruct.PLL.PLLM = 8;// 设置 PLL 的 N 倍频系数RCC_OscInitStruct.PLL.PLLN = 336;// 设置 PLL 的 P 分频系数RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;// 设置 PLL 的 Q 分频系数RCC_OscInitStruct.PLL.PLLQ = 7;// 配置 RCC 振荡器,如果配置失败则调用错误处理函数if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** 初始化 RCC 时钟 */// 设置要配置的时钟类型,包括 HCLK、SYSCLK、PCLK1 和 PCLK2RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;// 设置系统时钟源为 PLL 时钟RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;// 设置 AHB 总线时钟分频系数为 1RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;// 设置 APB1 总线时钟分频系数为 4RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;// 设置 APB2 总线时钟分频系数为 2RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;// 配置 RCC 时钟,如果配置失败则调用错误处理函数if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}// 初始化 TIM3 定时器的函数
static void MX_TIM3_Init(void)
{// 定义定时器时钟配置结构体TIM_ClockConfigTypeDef sClockSourceConfig = {0};// 定义定时器主模式配置结构体TIM_MasterConfigTypeDef sMasterConfig = {0};// 定义定时器输出比较配置结构体TIM_OC_InitTypeDef sConfigOC = {0};// 指定要初始化的定时器为 TIM3htim3.Instance = TIM3;// 设置定时器的预分频器值为 83,用于对时钟进行分频htim3.Init.Prescaler = 83;// 设置定时器的计数模式为向上计数htim3.Init.CounterMode = TIM_COUNTERMODE_UP;// 设置定时器的自动重载值为 999,决定定时器的计数周期htim3.Init.Period = 999;// 设置定时器的时钟分频系数为 1htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;// 禁用自动重载预装载功能htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 初始化定时器的基本参数,如果初始化失败则调用错误处理函数if (HAL_TIM_Base_Init(&htim3) != HAL_OK){Error_Handler();}// 设置定时器的时钟源为内部时钟sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;// 配置定时器的时钟源,如果配置失败则调用错误处理函数if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){Error_Handler();}// 初始化定时器的 PWM 模式,如果初始化失败则调用错误处理函数if (HAL_TIM_PWM_Init(&htim3) != HAL_OK){Error_Handler();}// 设置定时器的主输出触发为复位状态sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;// 禁用定时器的主从模式sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;// 配置定时器的主模式同步,如果配置失败则调用错误处理函数if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){Error_Handler();}// 设置定时器的输出比较模式为 PWM 模式 1sConfigOC.OCMode = TIM_OCMODE_PWM1;// 设置定时器的脉冲值为 0,即初始占空比为 0sConfigOC.Pulse = 0;// 设置定时器输出比较的极性为高电平有效sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;// 禁用定时器的快速模式sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;// 配置定时器的 PWM 通道 1,如果配置失败则调用错误处理函数if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}// 定时器的 MSP 后初始化函数,通常用于配置定时器的 GPIO 引脚等HAL_TIM_MspPostInit(&htim3);
}// 初始化 GPIO 引脚的函数
static void MX_GPIO_Init(void)
{// 定义 GPIO 初始化结构体GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能 GPIOA 端口的时钟,以便可以对 GPIOA 端口的引脚进行操作__HAL_RCC_GPIOA_CLK_ENABLE();// 配置 GPIO 引脚:IN1_PIN、IN2_PIN 和 ENA_PIN// 指定要配置的引脚为 IN1_PIN、IN2_PIN 和 ENA_PINGPIO_InitStruct.Pin = IN1_PIN|IN2_PIN|ENA_PIN;// 设置引脚的工作模式为推挽输出模式GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;// 不使用上拉或下拉电阻GPIO_InitStruct.Pull = GPIO_NOPULL;// 设置引脚的输出速度为低频GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 初始化 GPIOA 端口的指定引脚HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}// 错误处理函数,当出现错误时,程序将进入此函数的无限循环
void Error_Handler(void)
{while(1){}
}

五、代码解释

5.1 初始化 GPIO 引脚

在 MX_GPIO_Init 函数中,将连接到 L298N 模块的 GPIO 引脚配置为推挽输出模式。这样可以方便地控制引脚的电平状态,从而控制电机的正反转和调速。

5.2 控制电机正反转

通过设置 IN1 和 IN2 引脚的电平状态,可以控制电机的正反转。当 IN1 为高电平,IN2 为低电平时,电机正转;当 IN1 为低电平,IN2 为高电平时,电机反转。通过设置 ENA 引脚的电平状态,可以控制电机的启动和停止。

5.3 实现电机调速(使用 PWM)

使用定时器产生 PWM 信号来控制电机的转速。通过调整 PWM 信号的占空比,可以改变电机的平均电压,从而实现电机的调速。在代码中,使用 __HAL_TIM_SET_COMPARE 函数来设置 PWM 信号的占空比。

六、注意事项

  • 电源问题:L298N 模块需要外接电源,确保电源的电压和电流能够满足电机的需求。同时,要注意电源的极性,避免接反导致模块损坏。
  • 引脚连接:在连接 STM32F407 开发板和 L298N 模块时,要确保引脚连接正确,避免短路或引脚冲突。
  • 散热问题:L298N 模块在工作时会产生一定的热量,特别是在驱动大功率电机时,要注意散热,避免模块过热损坏。

七、总结

通过使用 STM32F407 的 HAL 库,我们可以方便地实现对 L298N 电机驱动模块的控制。本文详细介绍了 L298N 模块的基本原理、引脚说明,以及如何搭建 STM32F407 开发环境、配置 GPIO 引脚和定时器,最后给出了控制电机正反转和调速的代码示例。希望本文能够帮助你快速掌握使用 STM32F407 控制 L298N 电机驱动模块的方法。

相关文章:

STM32 HAL库 L298N电机驱动模块实现

一、引言 在机器人、自动化设备等众多应用场景中,电机驱动是一个关键的部分。L298N 是一款常用的电机驱动模块,它可以驱动两个直流电机或一个步进电机。STM32F407 是一款高性能的 ARM Cortex-M4 内核微控制器,结合 HAL 库可以方便地实现对 L…...

Redis的Key的过期策略

我们都知道Redis的键值对是可以设置过期时间的,那么就会涉及到一个问题,Redis到底是如何做到响应快的同时有能快速地释放掉过期的键值对的呢?不卖关子了,直接说答案,那就是Redis两个策略:定期删除和惰性删除…...

ubuntu桌面版使用root账号进行登录

这里写自定义目录标题 第一步:给root账户设置密码,并切换至root账户第二步:注释gdm-autologin文件内的相关内容第三步:注释gdm-password文件内的相关内容第四步:重启系统即可使用root账户登录 第一步:给roo…...

贪心算法(18)(java)距离相等的条形码

在一个仓库里,有一排条形码,其中第 i 个条形码为 barcodes[i]。 请你重新排列这些条形码,使其中任意两个相邻的条形码不能相等。 你可以返回任何满足该要求的答案,此题保证存在答案。 示例 1: 输入:barco…...

CentOS服务器能ping通却无法yum install:指定镜像源解决

文章目录 前言一、问题记录二、解决过程1.修改DNS无效2.指定镜像源 总结 前言 今天有一个项目现场要在一个远程centos服务器上部署产品服务,发现能ping通百度,但是无法yum install 安装基础软件包,开始以为DNS服务器的问题,结果配…...

WebSocket与MQTT

在物联网(IoT)领域,​WebSocket和MQTT确实都可以实现实时通信,但它们的核心设计目标、适用场景和角色存在显著差异。以下是两者的对比分析: ​1. 协议设计初衷​ ​WebSocket​ ​目标​:提供浏览器与服务器…...

【论文解读】MSVM-UNet: Multi-Scale Vision Mamba UNet for Medical Image Segmentation

MSVM-UNet: Multi-Scale Vision Mamba UNet for Medical Image Segmentation 论文链接: https://arxiv.org/abs/2408.13735 Code: https://github.com/gndlwch2w/msvm-unet 来源: 2024 IEEE International Conference on Bioinformatics an…...

Vue表单组件el-form校验规则rules,条件判断rules表单验证显示必填或非必填

在使用 Element UI&#xff08;一个基于 Vue 的前端框架&#xff09;的表单验证功能时&#xff0c;你可能想要实现一个规则&#xff0c;使得某些字段在特定条件下成为必填项&#xff0c;或者在满足某些条件时不允许为空。这通常通过自定义校验规则来实现。 <template>&l…...

手动关闭ArcGIS与ArcGIS Online连接的方法

【关闭软件启动时ArcGIS与ArcGIS Online连接方法】 打开C盘找到文件夹“C:\Program Files (x86)\Common Files\ArcGIS\bin”&#xff0c;如下图&#xff0c;删除“ArcGISConnection.exe”与“ArcGISConnectionTest.exe”文件&#xff0c;软件下次启动的时候就不会建立与ArcGIS …...

(二十五)安卓开发一个完整的登录页面-支持密码登录和手机验证码登录

下面将详细讲解如何在 Android 中开发一个完整的登录页面&#xff0c;支持密码登录和手机验证码登录。以下是实现过程的详细步骤&#xff0c;从布局设计到逻辑实现&#xff0c;再到用户体验优化&#xff0c;逐步展开。 1. 设计登录页面布局 首先&#xff0c;我们需要设计一个用…...

【过程控制系统】PID算式实现,控制系统分类,工程应用中控制系统应该注意的问题

目录 1-1 试简述过程控制的发展概况及各个阶段的主要特点。 1-2 与其它自动控制相比&#xff0c;过程控制有哪些优点&#xff1f;为什么说过程控制的控制过程多属慢过程&#xff1f; 1-3 什么是过程控制系统&#xff0c;其基本分类是什么&#xff1f; 1-4 何为集散控制系统…...

测试第三课-------自动化测试相关

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

关于数据清洗和数据处理实践学习笔记

一些可能想要知道的&#xff1a; pandas是一个模板&#xff0c;它读取的数据都是dataframe的格式&#xff0c;即df Matplotlib是一个用于数据可视化的Python库&#xff0c;能够生成各种静态、动态和交互式图表 pyplot&#xff1a;Matplotlib 的核心接口模块&#xff0c;提供类…...

ubuntu学习day2

linux常用命令 3.文件查看及处理命令 3.1查看文件内容 cat[选项][文件] -b 对非空输出行编号 -E 在每行结束处显示$ -n 对输出的所有行编号 -s 不输出多行空行 标准输入、标准输出和标准错误 在 Linux 中&#xff0c;每个进程默认有三个文件描述符&#xff1a; 标准输入&…...

JavaScript `new Date()` 方法移动端 `兼容 ios`,ios环境new Date()返回NaN

在 iOS 环境下&#xff0c;new Date() 方法会返回 NaN&#xff0c;这通常是由于时间字符串的格式问题。iOS 的 Date 构造函数对时间字符串的格式要求比其他平台更严格。 原因&#xff1a;ios端不兼容“-”为连接符的时间。 解决办法&#xff1a; 替换时间格式 IOS 不支持某…...

考研408参考用书:计算机组成原理(唐朔飞)介绍,附pdf

我用夸克网盘分享了「《计算机组成原理》第2,3版 唐朔飞」&#xff0c; 链接&#xff1a;https://pan.quark.cn/s/6a87d10274a3 1. 书籍定位与适用对象 定位&#xff1a;计算机组成原理是计算机科学与技术、软件工程等专业的核心基础课程&#xff0c;涉及计算机硬件的底层工作原…...

案例-索引对于并发Insert性能优化测试

前言 最近因业务并发量上升&#xff0c;开发反馈对订单表Insert性能降低。应开发要求对涉及Insert的表进行分析并提供优化方案。   一般对Insert 影响基本都在索引&#xff0c;涉及表已按创建日期做了分区表&#xff0c;索引全部为普通索引未做分区索引。 优化建议&#xff…...

@Async 为什么要自定义线程池,使用默认线程池风险

为什么要自定义线程池而非使用默认线程池 使用Spring的Async注解时&#xff0c;如果不自定义线程池而使用默认线程池&#xff0c;可能会带来一些风险和问题。以下是主要原因&#xff1a; 默认线程池的风险 无限制的资源消耗 默认线程池使用SimpleAsyncTaskExecutor&#xff0…...

Spark-SQL简介与编程

1. Spark-SQL是什么 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。 Hadoop与Spark的对比 Hadoop的局限性 Hadoop无法处理结构化数据&#xff0c;导致一些项目无法推进。 例如&#xff0c;MySQL中的数据是结构化的&#xff0c;Hadoop无法直接处理。…...

如何分析 JVM OOM 内存溢出 Dump 快照日志

文章目录 1、需求背景2、OOM 触发3、Dump 日志分析 1、需求背景 企业开发过程中&#xff0c;如果系统服务客户量比较大&#xff0c;偶尔会出现OOM内存溢出问题&#xff0c;导致服务发生宕机&#xff0c;停止对外提供访问。 这种情况就需要排查定位内存溢出的原因&#xff08;…...

系统监控 | 简易多个内网服务器的CPU和内存使用率监控 system_moniter

效果图 原理 一台主机A上运行mysql数据库&#xff0c;接收数据。 其他主机设置定时任务&#xff0c;每6分钟发送一次自己的CPU和内存使用百分数到主机A。 主机A上提供flask为后台的可视化网页&#xff0c;见上图。 源码库 https://github.com/BioMooc/system_moniterhttps:/…...

【神经网络】python实现神经网络(四)——误差反向传播的基础理论

一.反向传播 本章将介绍能够高效计算权重参数的梯度的方法——误差反向传播法,这里简单介绍一下什么是反向传播,加入有个函数y = f(x),那么它的反向传播为图下这个样子: 反向传播的计算顺序是,将输入信号E乘以节点的局部导数,然后将结果传递给下一个节点。这里所…...

Django 开发服务器

$ python manage.py runserver $ python manage.py runserver 666 # 用 666 端口 $ python manage.py runserver 0.0.0.0:8000 # 让局域网内其他客户端也可访问 $ python manage.py runserver --skip-checks # 跳过检查自动检查 $ python manage.py runserver --…...

嵌入式基础(二)ARM基础

嵌入式基础&#xff08;二&#xff09;ARM基础 1.精简指令集和复杂指令集的区别⭐⭐⭐ 精简指令集 (RISC) 精简指令集 (Reduced Instruction Set Computing) 具有简洁、精简的指令集&#xff0c;每条指令执行的操作都很基础&#xff0c;使得处理器设计更简单。RISC 处理器通…...

RNA免疫共沉淀测序(RIP-seq)

技术简介 RNA免疫共沉淀测序&#xff08;RNA Immunoprecipitation Sequencing, RIP-seq&#xff09;是一种将RNA免疫共沉淀&#xff08;RIP&#xff09;与二代测序技术&#xff08;NGS&#xff09;相结合&#xff0c;用于研究细胞内RNA与蛋白相互作用的技术。 技术原理 利用目…...

期指跌对股市的影响是什么?

国内股指期货对大盘的影响&#xff0c;这种一般就是不想再买这种指数&#xff0c;大多数都在蓝筹股方面&#xff0c;题材股很少&#xff0c;股指期货是保证金交易&#xff0c;一手大概在15-18W&#xff0c;它的价格是根据指数&#xff08;如上证指数、深证成指&#xff09;来确…...

基于Python的​​LSTM、CNN中文情感分析系统

大家好&#xff0c;我是徐师兄&#xff0c;一个有着7年大厂经验的程序员&#xff0c;也是一名热衷于分享干货的技术爱好者。平时我在 CSDN、掘金、华为云、阿里云和 InfoQ 等平台分享我的心得体会。 &#x1f345;文末获取源码联系&#x1f345; 2025年最全的计算机软件毕业设计…...

Neovim安装及lazy配置

安装neovim 官网下载 配置lazy插件总成 lazy官网 一般在C盘里会有一个nvim-data&#xff0c;然后用官网里的命令会生成一个nvim 安装C编译器 参考此文 插件都放在目录’C:\Users\wnlea\AppData\Local\nvim\lua\plugins’中&#xff0c;所以新建一个插件&#xff0c;起名为vi…...

什么叫“架构”

我们学硬件架构的时候常常被一些名词和概念绕晕&#xff0c;这篇就来讲一讲“架构”这个概念&#xff0c;一种“架构”指的是什么&#xff0c;如何去学习一种新的架构。 1.架构&#xff1a;硬件设计与指令集的统一体 这里放上我大二下的手写笔记&#xff1a; 就是说硬件设计…...

【Python浅拷贝与深拷贝详解】

目录 前言&#xff1a;技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现&#xff08;10个案例&#xff09;案例1&#xff1a;列表嵌套列表案例2&#xff1a;字典嵌套列表案例3…...

numpy.ma.masked_where:屏蔽满足条件的数组

1.函数功能 屏蔽满足条件的数组内容&#xff0c;返回值为掩码数组 2.语法结构 np.ma.masked_where(condition, a, copyTrue)3. 参数 参数含义condition屏蔽条件a要操作的数组copy布尔值&#xff0c;取值为True时&#xff0c;结果复制数组(原始数据不变)&#xff0c;否则返回…...

力扣hot100_技巧_python版本

一、136. 只出现一次的数字 思路&#xff1a; 任何数和 0 做异或运算&#xff0c;结果仍然是原来的数&#xff0c;即 a⊕0a。任何数和其自身做异或运算&#xff0c;结果是 0&#xff0c;即 a⊕a0。异或运算满足交换律和结合律&#xff0c;即 a⊕b⊕ab⊕a⊕ab⊕(a⊕a)b⊕0b。 代…...

用队列实现栈

队列实现栈 用队列实现栈一、队列数据结构的基础定义与操作&#xff08;一&#xff09;队列节点与队列结构体定义&#xff08;二&#xff09;队列大小计算函数&#xff08;三&#xff09;队列初始化函数&#xff08;四&#xff09;队列销毁函数&#xff08;五&#xff09;队列元…...

Android WebView深度性能优化方案

一、启动阶段优化 预初始化策略 冷启动优化&#xff1a;在Application或后台线程提前初始化WebView new Thread(() -> {WebView preloadWebView new WebView(getApplicationContext());preloadWebView.loadUrl("about:blank"); }).start();WebView复用池 private…...

国标GB28181视频平台EasyCVR打造线下零售平台视频+AI全流程监管坚实防线

一、背景概述 在全球经济增长放缓、电商崛起、经营成本攀升的形势下&#xff0c;零售行业正经历深刻变革。数字化转型成为新零售发展的必由之路&#xff0c;但多数零售企业在信息化建设上困难重重&#xff0c;既缺乏足够重视&#xff0c;又因过高投入而犹豫。 随着大数据、人工…...

QML中打印Item的坐标

在 QML 中&#xff0c;你可以通过多种方式获取和打印 Item 的坐标信息。以下是几种常见的方法&#xff1a; 1. 打印相对坐标&#xff08;相对于父项&#xff09; qml Item {id: myItemx: 50y: 100width: 200height: 200Component.onCompleted: {// 打印相对于父项的坐标cons…...

基于【Lang Chain】构建智能问答系统的实战指南

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是Lang Chain 2、LangChain在问答系统中的核心优…...

Vue使用axios实现:上传文件、下载文件

Vue 使用 axios 框架,系列文章: 《Vue使用axios实现Ajax请求》 《Vue使用axios二次封装、解决跨域问题》 《Vue使用axios实现:上传文件、下载文件》 在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。Axios 提供了一些方便…...

泊松分布详解:从理论基础到实际应用的全面剖析

泊松分布详解&#xff1a;从理论基础到实际应用的全面剖析 目录 引言&#xff1a;事件的罕见性与随机计数泊松分布的历史源流泊松分布的数学定义与性质 概率质量函数 (PMF)累积分布函数 (CDF)期望、方差与其他矩矩生成函数 (MGF) 与特征函数 (CF) 泊松分布的严格推导 极限推导…...

PHP爬虫教程:使用cURL和Simple HTML DOM Parser

一个关于如何使用PHP的cURL和HTML解析器来创建爬虫的教程&#xff0c;特别是处理代理信息的部分。首先&#xff0c;我需要确定用户的需求是什么。可能他们想从某个网站抓取数据&#xff0c;但遇到了反爬措施&#xff0c;需要使用代理来避免被封IP。不过用户没有提到具体的目标网…...

# 更换手机热点后secureCRT无法连接centOS7系统

更换手机热点后secureCRT无法连接centOS7系统 一、问题描述 某些情况下&#xff0c;我们可能使用手机共享热点而给电脑联网。本来用一个手机热点共享网络时&#xff0c;SecureCRT可以正常连接到CentOS 7虚拟机&#xff0c;当更换一个手机热点时&#xff0c;突然发现SecureCR…...

【集成电路版图设计学习笔记】2. 基本绘制的layer层和电路失效机制

一、基本的版图层次 1. 金属层&#xff08;Metal Layers&#xff09; 金属层主要起到互连的作用&#xff0c;完成基本电路器件的连接金属线的材质通常是铝或者铜&#xff0c;一般在线条比较粗的情况下&#xff0c;即特征尺寸比较粗的&#xff0c;一般是用铝制作的。在先进工艺…...

SQL学习笔记-聚合查询

非聚合查询和聚合查询的概念及差别 1. 非聚合查询 非聚合查询&#xff08;Non-Aggregate Query&#xff09;是指不使用聚合函数的查询。这类查询通常用于从表中检索具体的行和列数据&#xff0c;返回的结果是表中的原始数据。 示例 假设有一个名为 employees 的表&#xff…...

Profibus DP主站转modbusTCP网关与dp从站通讯案例

Profibus DP主站转modbusTCP网关与dp从站通讯案例 在当前工业自动化的浪潮中&#xff0c;不同协议之间的通讯转换成为了提升生产效率和实现设备互联的关键。Profibus DP作为一种广泛应用的现场总线技术&#xff0c;与Modbus TCP的结合&#xff0c;为工业自动化系统的集成带来了…...

【Linux】41.网络基础(2.3)

文章目录 2.3 TCP协议2.3.5 理解TIME_WAIT状态2.3.6 解决TIME_WAIT状态引起的bind失败的方法(作业)2.3.7 理解 CLOSE_WAIT 状态2.3.8 滑动窗口2.3.9 流量控制 2.3 TCP协议 2.3.5 理解TIME_WAIT状态 现在做一个测试,首先启动server,然后启动client,然后用Ctrl-C使server终止,这…...

C++多态知识点梳理

多态 多态的概念&#xff1a; 多态就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 比如构成多态的俩个父子类&#xff0c;我们调用同一个函数&#xff0c;可能会产生不同的行为&#xff0c;比如普通人买票全价&…...

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …...

计算机网络分层模型:架构与原理

前言 计算机网络通过不同的层次结构来实现通信和数据传输&#xff0c;这种分层设计不仅使得网络更加模块化和灵活&#xff0c;也使得不同类型的通信能够顺利进行。在网络协议和通信体系中&#xff0c;最广为人知的分层模型有 OSI模型 和 TCP/IP模型。这两种模型分别定义了计算…...

算法-mysql笔记

寻找用户推荐人 mysql判断数据是空 IS null 非空 IS NOT null 584. 寻找用户推荐人 - 力扣&#xff08;LeetCode&#xff09; # Write your MySQL query statement below SELECTname FROMCustomer WHEREreferee_id ! 2 OR referee_id IS null 文章概览 当查询到有多…...

销售易CRM:技术架构与安全性能的深度解析

一、技术架构&#xff1a;云计算与微服务的完美结合 销售易CRM基于云计算架构&#xff0c;采用微服务设计理念&#xff0c;确保系统的高可用性和扩展性。这种架构不仅提高了系统的性能和稳定性&#xff0c;还为企业提供了灵活的定制化能力。 云计算架构的优势 高可用性&…...