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

掌握步进电机控制算法:提升自动化精度的关键(代码示例)

引言

步进电机因其高精度定位、良好的控制性能和简单的驱动方式,广泛应用于各类自动化设备中,如3D打印机、数控机床和机器人等。为了实现对步进电机的精确控制,采用合适的控制算法至关重要。本文将详细介绍几种常见的步进电机控制算法,包括其原理、实现步骤、代码示例及相关公式,力求内容详实且图文并茂,帮助读者深入理解步进电机控制的核心技术。

1. 步进电机简介

步进电机是一种将电能转化为机械能的设备,其转动是通过将电流施加到绕组上,产生恒定的转矩,从而实现分步前进。步进电机通常具有以下特点:

  • 离散控制:步进电机的转动是分步的,通常以每步固定的角度旋转。

  • 高精度:步进电机的步距角通常很小,可以实现高精度的定位控制。

  • 开环控制:在许多应用中,步进电机可以在没有反馈的情况下工作。

1.1 步进电机的基本原理

步进电机通过电流的变化来控制转子的位置。转子由多个磁极组成,每个磁极对应一个电流通路,通过控制这些电流的通断,实现对电机转动的精确控制。

2. 步进电机控制算法概述

步进电机的控制算法主要有以下几种:

  1. 全步进控制

  2. 半步进控制

  3. 微步进控制

  4. 动态控制算法(加减速控制)

  5. 位置反馈控制

2.1 全步进控制

全步进控制是最简单的步进电机控制方式,每次驱动电机一个完整的步距角。

2.1.1 算法原理

在全步进控制中,每个步进的电流切换只涉及两个相邻的绕组,确保电机在每个正交位置间转换。假设步距角为θ,步数为N,则有以下关系:

N = \frac{360°}{θ}

2.1.2 实现步骤
  1. 初始化步进电机的端口。

  2. 设置电流顺序,如A相、B相依次通电。

  3. 循环输出控制信号,使电机逐步旋转。

2.1.3 代码示例

以下是Arduino平台的全步进控制代码示例:

const int motorPin1 = 8;  // A相
const int motorPin2 = 9;  // B相
const int motorPin3 = 10; // C相
const int motorPin4 = 11; // D相void setup() {pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(motorPin3, OUTPUT);pinMode(motorPin4, OUTPUT);
}void loop() {// 全步进控制顺序digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);delay(100); // 控制速度digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, HIGH);delay(100);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, HIGH);delay(100);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, HIGH);delay(100);digitalWrite(motorPin4, LOW);digitalWrite(motorPin1, HIGH);delay(100);
}

2.1.4 控制图示

步进
旋转1步
旋转1步
旋转1步
旋转1步
电流信号
绕组A
绕组B
绕组C
绕组D

2.2 半步进控制

半步进控制是对全步进控制的改进,通过在每个完整的步进之间增加一个额外的电流状态,使电机的步距角减半,从而提高分辨率和控制精度。

2.2.1 算法原理

在半步进控制中,每个完整的步进由两个状态组成:全通电状态与部分通电状态。通过这种方法,步距角被减小为原始值的一半。假设步距角为θ,则半步进的步距角为:

\theta_{half} = \frac{\theta}{2}

对于一个完整的转动,步数变为:

N_{half} = \frac{360°}{\theta_{half}} = \frac{720°}{\theta}

2.2.2 实现步骤

  1. 初始化步进电机的端口。

  2. 设置电流顺序,包括全通电和部分通电状态。

  3. 循环输出控制信号,使电机以半步方式旋转。

2.2.3 代码示例

下面是Arduino平台的半步进控制代码示例:

const int motorPin1 = 8;  // A相
const int motorPin2 = 9;  // B相
const int motorPin3 = 10; // C相
const int motorPin4 = 11; // D相void setup() {pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(motorPin3, OUTPUT);pinMode(motorPin4, OUTPUT);
}void loop() {// 半步进控制顺序// 第1步digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);delay(100);// 第2步digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, HIGH);delay(100);// 第3步digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, HIGH);delay(100);// 第4步digitalWrite(motorPin2, HIGH);digitalWrite(motorPin3, HIGH);delay(100);// 第5步digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, HIGH);delay(100);// 第6步digitalWrite(motorPin3, HIGH);digitalWrite(motorPin4, HIGH);delay(100);// 第7步digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, HIGH);delay(100);// 第8步digitalWrite(motorPin4, LOW);digitalWrite(motorPin1, HIGH);delay(100);
}

2.2.4 控制图示

步进
部分通电1
步进
部分通电2
步进
部分通电3
步进
部分通电4
电流信号
绕组A
绕组A+B
绕组B
绕组B+C
绕组C
绕组C+D
绕组D
绕组D+A

2.3 微步进控制

微步进控制是步进电机控制中最精细的控制方式,能够将步距角进一步细分,通常用于需要高精度和高平滑度的应用场景。

2.3.1 算法原理

微步进控制通过调整电流的大小和相位,使得电机在每个完整的步进之间可以分出多个微小的步进。例如,如果将一个步距角为1.8°的电机细分为16个微步,则每个微步的角度为:

\theta_{micro} = \frac{\theta}{16} = \frac{1.8°}{16} = 0.1125°

2.3.2 实现步骤

  1. 初始化步进电机的端口。

  2. 通过PWM信号控制电流大小,实现对每个微步的精确

  3. 通过PWM信号控制电流大小,实现对每个微步的精确控制。

  4. 设定微步的电流顺序,以确保电机按照微步方式旋转。

2.3.3 代码示例

以下是Arduino平台的微步进控制代码示例。为了实现微步进控制,需要使用PWM(脉宽调制)信号来调节电流:

const int motorPin1 = 8;  // A相
const int motorPin2 = 9;  // B相
const int motorPin3 = 10; // C相
const int motorPin4 = 11; // D相void setup() {pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(motorPin3, OUTPUT);pinMode(motorPin4, OUTPUT);
}void loop() {// 微步进控制顺序// 微步1analogWrite(motorPin1, 128); // 50% Duty CycleanalogWrite(motorPin2, 0);delay(10);// 微步2analogWrite(motorPin1, 64);  // 25% Duty CycleanalogWrite(motorPin2, 64);  // 25% Duty Cycledelay(10);// 微步3analogWrite(motorPin1, 0);analogWrite(motorPin2, 128); // 50% Duty Cycledelay(10);// 微步4analogWrite(motorPin2, 64);analogWrite(motorPin3, 64);delay(10);// 微步5analogWrite(motorPin2, 0);analogWrite(motorPin3, 128); // 50% Duty Cycledelay(10);// 微步6analogWrite(motorPin3, 64);analogWrite(motorPin4, 64);delay(10);// 微步7analogWrite(motorPin3, 0);analogWrite(motorPin4, 128); // 50% Duty Cycledelay(10);// 微步8analogWrite(motorPin4, 64);analogWrite(motorPin1, 64);delay(10);
}

2.3.4 控制图示

微步1
微步2
微步3
微步4
微步5
微步6
微步7
微步8
电流信号
绕组A
绕组A+B
绕组B
绕组B+C
绕组C
绕组C+D
绕组D
绕组D+A

2.4 动态控制算法(加减速控制)

动态控制算法主要用于步进电机的加减速控制,能够减少由于突变导致的振动和噪音,提高电机的运行平稳性和精度。

2.4.1 算法原理

在电机加速和减速过程中,可以通过调整电机的步进频率来实现平滑的加速和减速。加速阶段逐步增加每次步进的时间,减速阶段逐步减少,以避免电机突然启动或停止。

2.4.2 实现步骤

  1. 设定初始速度和目标速度。

  2. 计算加速和减速所需的步骤。

  3. 在加速阶段逐步增加步进延时,在减速阶段逐步减少步进延时。

2.4.3 代码示例

以下是一个简单的动态控制算法示例,使用Arduino进行加减速控制:

const int motorPin1 = 8;  // A相
const int motorPin2 = 9;  // B相
const int motorPin3 = 10; // C相
const int motorPin4 = 11; // D相int stepDelay = 100; // 初始延时
int targetDelay = 10; // 目标延时
int steps = 200; // 总步数void setup() {pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(motorPin3, OUTPUT);pinMode(motorPin4, OUTPUT);
}void loop() {// 加速阶段for (int i = 0; i < steps; i++) {// 控制电机的步进stepMotor(i % 4);// 增加延时,实现加速if (stepDelay > targetDelay) {stepDelay -= 1; // 每次减少1毫秒}delay(stepDelay);}// 减速阶段for (int i = steps; i > 0; i--) {// 控制电机的步进stepMotor(i % 4);// 减少延时,实现减速if (stepDelay < 100) {stepDelay += 1; // 每次增加1毫秒}delay(stepDelay);}
}// 控制电机步进的函数
void stepMotor(int step) {switch (step) {case 0:digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);break;case 1:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, HIGH);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);break;case 2:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, HIGH);digitalWrite(motorPin4, LOW);break;case 3:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, HIGH);break;}
}

2.4.4 控制图示

加速阶段
逐步增加步进时间
电流信号
电机逐步加速
目标速度
减速阶段
逐步减少步进时间
电机逐步减速
停止

2.5 位置反馈控制

位置反馈控制结合了传感器反馈和控制算法,用于高精度的步进电机控制。它可以通过反馈机制实时校正电机的位置,确保其准确性。

2.5.1 算法原理

在位置反馈控制中,使用传感器(如编码器)实时监测电机的位置,并将测得的位置与目标位置进行比较。根据偏差调整电机的步进,以实现精确定位。

2.5.2 实现步骤

  1. 初始化传感器和电机控制模块。

  2. 设定目标位置。

  3. 实时读取传感器数据,并与目标位置进行比较。

  4. 根据偏差调整电机的步进,直到达到目标位置。

2.5.3 代码示例

以下是结合位置反馈控制的代码示例,假设使用一个编码器来监测电机位置:

const int motorPin1 = 8;  // A相
const int motorPin2 = 9;  // B相
const int motorPin3 = 10; // C相
const int motorPin4 = 11; // D相volatile int position = 0; // 当前电机位置
int targetPosition = 200; // 目标位置void setup() {pinMode(motorPin1, OUTPUT);pinMode(motorPin2, OUTPUT);pinMode(motorPin3, OUTPUT);pinMode(motorPin4, OUTPUT);// 假设有编码器的中断设置attachInterrupt(digitalPinToInterrupt(2), updatePosition, CHANGE);
}void loop() {// 位置反馈控制while (position != targetPosition) {if (position < targetPosition) {stepMotor(0); // 向前一步position++;} else {stepMotor(3); // 向后一步position--;}delay(10); // 步进间隔}
}// 更新电机位置的函数
void updatePosition() {// 这里需要根据编码器的具体情况更新位置// 假设编码器每转一步,位置加1或减1if (digitalRead(2) == HIGH) {position++; // 正向旋转} else {position--; // 反向旋转}
}// 控制电机步进的函数
void stepMotor(int step) {switch (step) {case 0:digitalWrite(motorPin1, HIGH);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);break;case 1:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, HIGH);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, LOW);break;case 2:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, HIGH);digitalWrite(motorPin4, LOW);break;case 3:digitalWrite(motorPin1, LOW);digitalWrite(motorPin2, LOW);digitalWrite(motorPin3, LOW);digitalWrite(motorPin4, HIGH);break;}
}

2.5.4 控制图示

偏差正
偏差负
目标位置设定
读取当前电机位置
位置偏差
向前步进
向后步进
达到目标位置

3. 步进电机控制算法的比较

在不同的应用场景中,选择合适的控制算法非常重要。下面对常用的步进电机控制算法进行比较:

算法类型优点缺点使用场景
全步进控制实现简单,控制逻辑清晰精度低,噪音大精度要求不高的场合
半步进控制精度适中,控制相对简单仍然存在噪音,精度有限需要适中精度的应用
微步进控制高精度,平滑运行实现复杂,需要较高的控制精度高精度的定位和控制,如3D打印机、激光切割机
动态控制算法可以有效减少振动,提升稳定性需要较为复杂的控制逻辑需要高平稳运行的场合
位置反馈控制实现高精度控制,实时反馈硬件要求高,需要额外的传感器高精度定位的自动化设备

4. 实际应用案例分析

4.1 3D打印机中的步进电机控制

在3D打印机中,步进电机用于控制喷头和平台的精确定位。通常采用微步进控制算法,以实现高精度的打印效果。通过实时监测喷头位置并进行适时调整,可以确保打印质量。

4.2 数控机床中的步进电机控制

数控机床广泛应用于零件加工和制造,步进电机用于控制刀具的移动。通常结合动态控制和位置反馈控制算法,以提高加工精度和效率。在数控机床中,步进电机的稳定性和精度直接影响加工质量。

4.3 机器人中的步进电机控制

在机器人领域,步进电机被广泛应用于关节、驱动轮等部位。根据机器人的运动需求,采用不同的控制算法。例如,对于需要快速响应的关节,可能使用动态控制算法;而对于静态姿态的保持,则可能采用位置反馈控制。

5. 总结

步进电机因其高精度、高稳定性和良好的控制性能,已成为自动化设备中不可或缺的重要组成部分。本文介绍了多种步进电机控制算法,包括全步进、半步进、微步进、动态控制和位置反馈控制。每种算法在不同应用场景下具有其特定的优缺点,选择合适的算法对于实现电机的高效控制至关重要。

通过深入的理解和应用这些算法,可以在实际项目中实现更高效的电机控制,

相关文章:

掌握步进电机控制算法:提升自动化精度的关键(代码示例)

引言 步进电机因其高精度定位、良好的控制性能和简单的驱动方式&#xff0c;广泛应用于各类自动化设备中&#xff0c;如3D打印机、数控机床和机器人等。为了实现对步进电机的精确控制&#xff0c;采用合适的控制算法至关重要。本文将详细介绍几种常见的步进电机控制算法&#…...

MySQL的源码安装及基本部署(基于RHEL7.9)

这里源码安装mysql的5.7.44版本 一、源码安装 1.下载并解压mysql , 进入目录: wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.44.tar.gz tar xf mysql-boost-5.7.44.tar.gz cd mysql-5.7.44/ 2.准备好mysql编译安装依赖: yum install cmake g…...

RUP-系统架构师(五十六)

1在RUP中采用“41”视图模型来描述软件系统的体系结构。在该模型中&#xff0c;最终用户侧重于&#xff08;&#xff09;&#xff0c;系统工程师侧重于&#xff08;&#xff09;。 问题1 问题2 A 实现视图 B 进程视图 C 逻辑视图 D 部署视图 解析&#xff1a; RUP有 逻辑…...

【大模型系列篇】人工智能与智能计算的发展

&#x1f525;&#x1f525;&#x1f525; 来自 中国工程院院士、中国科学院计算技术研究所研究员 孙凝晖 第十四届全国人大常委会专题讲座上的讲稿《人工智能与智能计算的发展》 “把新一代人工智能作为推动科技跨越发展、 产业优化升级、生产力整体跃升的驱动力量&#xff0c…...

C++ | Leetcode C++题解之第365题水壶问题

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canMeasureWater(int x, int y, int z) {if (x y < z) {return false;}if (x 0 || y 0) {return z 0 || x y z;}return z % gcd(x, y) 0;} };...

c++-类(中)

c-类&#xff08;中&#xff09; 一、类的默认成员函数1.1 什么是默认成员函数&#xff1f;1.2 默认成员函数有哪些&#xff1f; 二、构造函数2.1 什么是构造函数&#xff1f;2.2 构造函数的特点 三、析构函数3.1 什么是析构函数&#xff1f;3.2 析构函数的特点 四、拷贝构造函…...

在 Python 中查找列表中的重复元素

在 Python 中查找列表中的重复元素 在数据处理和分析中,查找重复元素是一个常见的任务。无论是在数据清洗、用户输入验证还是统计分析中,识别和处理重复数据都是至关重要的。在 Python 中,有多种方法可以查找列表中的重复元素。本文将详细介绍这些方法,包括示例代码、性能…...

Kafka【一】Windows下安装单节点Kafka

① 下载 下载软件安装包&#xff1a;kafka_2.12-3.6.1.tgz&#xff0c;下载地址&#xff1a;https://kafka.apache.org/downloads 这里的3.6.1&#xff0c;是Kafka软件的版本。截至到2023年12月24日&#xff0c;Kafka最新版本为3.6.1。2.12是对应的Scala开发语言版本。Scala2…...

基于深度学习的分子生成

基于深度学习的分子生成是一项结合化学、计算科学与人工智能的新兴领域&#xff0c;旨在利用深度学习模型来生成具有特定性质的分子结构。该技术在药物发现、材料科学和合成化学等领域具有广泛的应用前景。以下是详细的介绍&#xff1a; 1. 背景与动机 化学空间的广阔性&#…...

python——并行设计

在 Python 中&#xff0c;通过并行设计可以提高程序的效率&#xff0c;特别是在需要处理大量数据或进行耗时操作时。并行设计的基本思想是通过分配任务给多个线程或进程&#xff0c;利用多核 CPU 的计算能力&#xff0c;来同时执行多个任务&#xff0c;从而缩短总的执行时间。 …...

系统架构设计师——软件架构基本概念

基本概念 **软件架构是软件开发中的一个核心概念&#xff0c;它主要关注软件构件的结构、属性和交互作用。**以下是对软件架构的详细解读&#xff1a; 结构&#xff1a;软件架构定义了软件系统的基本结构&#xff0c;包括各个组件、模块和类的关系。这些元素如何组织和相互连…...

证书学习(二)搞懂 keystore、jks、p12、pfx、crt、csr、pem文件的区别

目录 一、背景二、文件格式的区分2.1 .keystore / .jks 文件2.2 .p12 / .pfx 文件2.3 .crt 文件2.4 csr 文件2.5 .pem 文件 三、总结 一、背景 我们在日常的开发过程中&#xff0c;经常会见到各种各样的证书相关类型的文件&#xff0c;错综复杂。 其实 keystore、jks、p12、p…...

基于python的在线自主评测系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…...

Centos安装Jenkins教程详解版(JDK8+Jenkins2.346.1)

本教程基于 JDK8 和 Jenkins2.346.1 JDK安装 下载OpenJDK8文件 wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u422b05.tar.gz解压到指定目录 # 创建目录 mkdir -p /usr/local/software# 解压文件到指定目录&#…...

聚类分析|距离与相似系数|层次聚类|K均值聚类|SPSS及Matlab

聚类分析问题描述 聚类分析问题描述 人类认识世界的方法之一就是将事物按照各种属性或特征分成若干类别。 物以类聚、人以群分。分类方法多种多样&#xff0c;简单直接的如高、矮、胖瘦。使用的信息量小&#xff0c;但对类别界限附近的案例&#xff0c;分类结果不一定合适。 …...

Linux中安装java和tomcat(保姆级教程)

java 篇 JDK是用于开发Java应用程序的软件开发工具包。它包含了编译器、调试器、运行时环境和其他一些开发工具&#xff0c;可以帮助开发人员创建、编译、调试和部署Java应用程序。JDK提供了Java编程语言的开发工具和运行时库&#xff0c;使开发人员能够编写和执行Java代码。 …...

Vue组件库Element和Vue路由

目录 一、Vue组件库Element&#xff08;学会怎么CV&#xff09; 快速入门 ElementUI的常用组件 1.Table表格 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff09;组件属性详解 2.Pagination分页 &#xff08;1&#xff09;组件演示 &#xff08;2&#xff0…...

网络编程,网络协议,UDP编程

网络&#xff1a; 1.协议&#xff1a;通信双方约定的一套标准 2.国际网络通信协议标准&#xff1a; 1.OSI协议&#xff1a; 应用层 发送的数据内容 表示层 数据是否加密 会话层 是否建立会话连接 传输层 …...

通过访存地址获取主存数据的过程

目录 1.根据访存地址在Cache中查找数据 2.如果在Cache中命中 3.如果没有命中 4.数据送CPU 5.做几道题&#xff1a; 主要厘清思路&#xff0c;中间细节需自行补充! 1.根据访存地址在Cache中查找数据 ① 访存地址的结构会根据Cache和主存之间的映射方式不同而改变。映射方式…...

sqlite3交叉编译问题(对‘fcntl64@GLIBC_2.28’未定义的引用)

使用rk3568的编译器交叉编译程序&#xff0c;报如下错误&#xff1a; libsqlite3.so&#xff1a;对‘fcntl64GLIBC_2.28’未定义的引用 libsqlite3.so&#xff1a;对‘logGLIBC_2.29’未定义的引用在网上查了下这个问题的原因可能是在GLIBC库2.28版本中&#xff0c; "fcn…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...