项目笔记| 基于Arduino和IR2101的无刷直流电机控制器

本文介绍如何使用 Arduino UNO 板构建无传感器无刷直流 (BLDC) 电机控制器或简单的 ESC(电子速度控制器)。

无刷直流电机有两种类型:有传感器和无传感器。有感无刷直流电机内置3个霍尔效应传感器,这些传感器检测无刷直流电机的转子位置。控制有传感器的BLDC电机很容易,因为我们知道转子的位置,就像在下面的项目中所做的那样:

在这里插入图片描述

项目电路原理图如下图所示。

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

/* Sensorless brushless DC (BLDC) motor control with Arduino UNO (Arduino DIY ESC).* This is a free software with NO WARRANTY.* http://simple-circuit.com/*/#define SPEED_UP          A0          // BLDC motor speed-up button
#define SPEED_DOWN        A1          // BLDC motor speed-down button
#define PWM_MAX_DUTY      255
#define PWM_MIN_DUTY      50
#define PWM_START_DUTY    100byte bldc_step = 0, motor_speed;
unsigned int i;
void setup() {DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputsPORTD  = 0x00;DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputsPORTB  = 0x31;// Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)TCCR1A = 0;TCCR1B = 0x01;// Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)TCCR2A = 0;TCCR2B = 0x01;// Analog comparator settingACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interruptpinMode(SPEED_UP,   INPUT_PULLUP);pinMode(SPEED_DOWN, INPUT_PULLUP);
}
// Analog comparator ISR
ISR (ANALOG_COMP_vect) {// BEMF debouncefor(i = 0; i < 10; i++) {if(bldc_step & 1){if(!(ACSR & 0x20)) i -= 1;}else {if((ACSR & 0x20))  i -= 1;}}bldc_move();bldc_step++;bldc_step %= 6;
}
void bldc_move(){        // BLDC motor commutation functionswitch(bldc_step){case 0:AH_BL();BEMF_C_RISING();break;case 1:AH_CL();BEMF_B_FALLING();break;case 2:BH_CL();BEMF_A_RISING();break;case 3:BH_AL();BEMF_C_FALLING();break;case 4:CH_AL();BEMF_B_RISING();break;case 5:CH_BL();BEMF_A_FALLING();break;}
}void loop() {SET_PWM_DUTY(PWM_START_DUTY);    // Setup starting PWM with duty cycle = PWM_START_DUTYi = 5000;// Motor startwhile(i > 100) {delayMicroseconds(i);bldc_move();bldc_step++;bldc_step %= 6;i = i - 20;}motor_speed = PWM_START_DUTY;ACSR |= 0x08;                    // Enable analog comparator interruptwhile(1) {while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY){motor_speed++;SET_PWM_DUTY(motor_speed);delay(100);}while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY){motor_speed--;SET_PWM_DUTY(motor_speed);delay(100);}}
}void BEMF_A_RISING(){ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative inputACSR |= 0x03;            // Set interrupt on rising edge
}
void BEMF_A_FALLING(){ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative inputACSR &= ~0x01;           // Set interrupt on falling edge
}
void BEMF_B_RISING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 2;              // Select analog channel 2 as comparator negative inputACSR |= 0x03;
}
void BEMF_B_FALLING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 2;              // Select analog channel 2 as comparator negative inputACSR &= ~0x01;
}
void BEMF_C_RISING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 3;              // Select analog channel 3 as comparator negative inputACSR |= 0x03;
}
void BEMF_C_FALLING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 3;              // Select analog channel 3 as comparator negative inputACSR &= ~0x01;
}void AH_BL(){PORTD &= ~0x28;PORTD |=  0x10;TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)TCCR2A =  0x81;         //
}
void AH_CL(){PORTD &= ~0x30;PORTD |=  0x08;TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)TCCR2A =  0x81;         //
}
void BH_CL(){PORTD &= ~0x30;PORTD |=  0x08;TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)TCCR1A =  0x21;         //
}
void BH_AL(){PORTD &= ~0x18;PORTD |=  0x20;TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)TCCR1A =  0x21;         //
}
void CH_AL(){PORTD &= ~0x18;PORTD |=  0x20;TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)TCCR1A =  0x81;         //
}
void CH_BL(){PORTD &= ~0x28;PORTD |=  0x10;TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)TCCR1A =  0x81;         //
}void SET_PWM_DUTY(byte duty){if(duty < PWM_MIN_DUTY)duty  = PWM_MIN_DUTY;if(duty > PWM_MAX_DUTY)duty  = PWM_MAX_DUTY;OCR1A  = duty;                   // Set pin 9  PWM duty cycleOCR1B  = duty;                   // Set pin 10 PWM duty cycleOCR2A  = duty;                   // Set pin 11 PWM duty cycle
}

传感器BLDC电机的换向是根据霍尔效应传感器状态完成的。

无传感器BLDC电机没有任何传感器来检测其转子位置,其换向基于定子绕组中产生的BEMF(反电动势)。

无传感器BLDC电机控制的主要优点是系统成本较低,主要缺点是电机必须以最小速率移动才能产生足够的BEMF来检测。

无传感器BLDC电机控制的主要优点是系统成本较低,主要缺点是电机必须以最小速率移动才能产生足够的BEMF来检测。

在这里插入图片描述

如上图所示,BEMF信号与霍尔效应传感器信号不同步(相移30°)。在每个通电序列中,两个绕组通电(一个连接到正极,另一个连接到负极),第三个绕组保持打开(浮动)。浮动绕组用于检测过零,因此,所有 3 个过零点的组合用于生成通电序列。我们总共有 6 个事件:

A阶段过零:从高到低,从低到高

B阶段过零:从高到低,从低到高

C阶段过零:从高到低,从低到高

如何检测过零事件?

检测过零事件的最简单方法是使用比较器。比较器有 3 个主端子:2 个输入(正负)和一个输出。如果正电压大于负电压,则比较器输出为逻辑高电平,如果正电压低于负电压,则逻辑低电平。

这个项目基本上需要 3 个比较器,连接如下图所示(B 阶段示例)。每个阶段都需要一个类似的电路。

在这里插入图片描述
所有 3 个比较器的虚拟自然点都是相同的,它是使用 3 个电阻器产生的。当浮动(开路)绕组中产生的BEMF越过零点向正侧时,比较器输出从低电平过渡到高电平。当浮动绕组中产生的BEMF越过零点向负侧时,比较器输出从高电平过渡到低电平。通过具有三个这样的比较器电路,每个相位上一个电路可产生三个数字信号,对应于绕组中的BEMF信号。这三个信号的组合用于推导换向序列。

在这里插入图片描述

项目电路原理图如下图所示:

在这里插入图片描述

请注意,所有接地端子都连接在一起。

在电路中有 2 个按钮,一个用于提高 BLDC 电机速度,第二个用于降低它。

前三个33k(连接到电机相位)和三个10k电阻用作分压器,因为我们不能为微控制器提供12V,其他三个33k电阻产生虚拟自然点。虚拟自然点连接到Arduino引脚6。

Arduino UNO板基于ATmega328P微控制器,该微控制器具有一个模拟比较器。该比较器的正输入位于 Arduino uno 引脚 6 (AIN0) 上,负输入可以是引脚 7 (AIN1)、A0 (ADC0)、A1 (ADC1)、A2 (ADC2)、A3 (ADC3)、A4 (ADC4) 或 A5 (ADC5)。因此,我将虚拟自然点连接到模拟比较器的正极引脚(引脚 6),将 A 相 BEMF 连接到引脚 7 (AIN1),将 B 相 BEMF 连接到引脚 A2,将 C 相 BEMF 连接到引脚 A3。每次比较器都会将虚拟点与一相的 BEMF 进行比较(这是在软件中完成的)。这最大限度地减少了所需的硬件并简化了电路。

IR2104S芯片用于控制每相的高端和低端MOSFET。高压侧和低压侧之间的切换是根据控制线IN和SD完成的。下图显示了输入和输出时序图:

在这里插入图片描述

三IR2104S的 SD 线分别连接到引脚 11、10 和 9,用于相 A、相 B 和相 C。Arduino UNO可以在该引脚上生成PWM信号,其中只有高侧MOSFET是PWM的。

使用Arduino代码的无传感器BLDC电机控制

下面的代码不使用任何 BLDC 电机库。

如上所述,Arduino 引脚 9、10 和 11 可以生成 PWM 信号,其中引脚 9 和引脚 10 与 Timer1 模块(OC1A 和 OC1B)相关,引脚 11 与 Timer2 模块 (OC2A) 相关。两个定时器模块都配置为生成频率约为 31KHz、分辨率为 8 位的 PWM 信号。当按下按钮时,PWM信号的占空比会通过写入其寄存器(OCR1A、OCR1B和OCR2A)来更新(加速或减速)。

模拟比较器将正输入AIN0(Arduino引脚6)与负输入(AIN1(引脚7)、ADC2(引脚A2)或ADC3(引脚A3))进行比较。当正引脚电压高于负引脚电压时,设置模拟比较器ACO的输出,当正引脚电压低于负引脚电压时,ACO被清除。

在这个项目中,我使用了模拟比较器中断,并在上升时使用中断(从低到高的转换)和下降时的中断(从高到低的转换),这使得过零事件中断微控制器。

要完全理解代码,请阅读 ATmega328 数据表!

/* Sensorless brushless DC (BLDC) motor control with Arduino UNO (Arduino DIY ESC).* This is a free software with NO WARRANTY.* https://simple-circuit.com/*/#define SPEED_UP          A0
#define SPEED_DOWN        A1
#define PWM_MAX_DUTY      255
#define PWM_MIN_DUTY      50
#define PWM_START_DUTY    100byte bldc_step = 0, motor_speed;
unsigned int i;
void setup() {DDRD  |= 0x38;           // Configure pins 3, 4 and 5 as outputsPORTD  = 0x00;DDRB  |= 0x0E;           // Configure pins 9, 10 and 11 as outputsPORTB  = 0x31;// Timer1 module setting: set clock source to clkI/O / 1 (no prescaling)TCCR1A = 0;TCCR1B = 0x01;// Timer2 module setting: set clock source to clkI/O / 1 (no prescaling)TCCR2A = 0;TCCR2B = 0x01;// Analog comparator settingACSR   = 0x10;           // Disable and clear (flag bit) analog comparator interruptpinMode(SPEED_UP,   INPUT_PULLUP);pinMode(SPEED_DOWN, INPUT_PULLUP);
}
// Analog comparator ISR
ISR (ANALOG_COMP_vect) {// BEMF debouncefor(i = 0; i < 10; i++) {if(bldc_step & 1){if(!(ACSR & 0x20)) i -= 1;}else {if((ACSR & 0x20))  i -= 1;}}bldc_move();bldc_step++;bldc_step %= 6;
}
void bldc_move(){        // BLDC motor commutation functionswitch(bldc_step){case 0:AH_BL();BEMF_C_RISING();break;case 1:AH_CL();BEMF_B_FALLING();break;case 2:BH_CL();BEMF_A_RISING();break;case 3:BH_AL();BEMF_C_FALLING();break;case 4:CH_AL();BEMF_B_RISING();break;case 5:CH_BL();BEMF_A_FALLING();break;}
}void loop() {SET_PWM_DUTY(PWM_START_DUTY);    // Setup starting PWM with duty cycle = PWM_START_DUTYi = 5000;// Motor startwhile(i > 100) {delayMicroseconds(i);bldc_move();bldc_step++;bldc_step %= 6;i = i - 20;}motor_speed = PWM_START_DUTY;ACSR |= 0x08;                    // Enable analog comparator interruptwhile(1) {while(!(digitalRead(SPEED_UP)) && motor_speed < PWM_MAX_DUTY){motor_speed++;SET_PWM_DUTY(motor_speed);delay(100);}while(!(digitalRead(SPEED_DOWN)) && motor_speed > PWM_MIN_DUTY){motor_speed--;SET_PWM_DUTY(motor_speed);delay(100);}}
}void BEMF_A_RISING(){ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative inputACSR |= 0x03;            // Set interrupt on rising edge
}
void BEMF_A_FALLING(){ADCSRB = (0 << ACME);    // Select AIN1 as comparator negative inputACSR &= ~0x01;           // Set interrupt on falling edge
}
void BEMF_B_RISING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 2;              // Select analog channel 2 as comparator negative inputACSR |= 0x03;
}
void BEMF_B_FALLING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 2;              // Select analog channel 2 as comparator negative inputACSR &= ~0x01;
}
void BEMF_C_RISING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 3;              // Select analog channel 3 as comparator negative inputACSR |= 0x03;
}
void BEMF_C_FALLING(){ADCSRA = (0 << ADEN);   // Disable the ADC moduleADCSRB = (1 << ACME);ADMUX = 3;              // Select analog channel 3 as comparator negative inputACSR &= ~0x01;
}void AH_BL(){PORTB  =  0x04;PORTD &= ~0x18;PORTD |=  0x20;TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)TCCR2A =  0x81;         //
}
void AH_CL(){PORTB  =  0x02;PORTD &= ~0x18;PORTD |=  0x20;TCCR1A =  0;            // Turn pin 11 (OC2A) PWM ON (pin 9 & pin 10 OFF)TCCR2A =  0x81;         //
}
void BH_CL(){PORTB  =  0x02;PORTD &= ~0x28;PORTD |=  0x10;TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)TCCR1A =  0x21;         //
}
void BH_AL(){PORTB  =  0x08;PORTD &= ~0x28;PORTD |=  0x10;TCCR2A =  0;            // Turn pin 10 (OC1B) PWM ON (pin 9 & pin 11 OFF)TCCR1A =  0x21;         //
}
void CH_AL(){PORTB  =  0x08;PORTD &= ~0x30;PORTD |=  0x08;TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)TCCR1A =  0x81;         //
}
void CH_BL(){PORTB  =  0x04;PORTD &= ~0x30;PORTD |=  0x08;TCCR2A =  0;            // Turn pin 9 (OC1A) PWM ON (pin 10 & pin 11 OFF)TCCR1A =  0x81;         //
}void SET_PWM_DUTY(byte duty){if(duty < PWM_MIN_DUTY)duty  = PWM_MIN_DUTY;if(duty > PWM_MAX_DUTY)duty  = PWM_MAX_DUTY;OCR1A  = duty;                   // Set pin 9  PWM duty cycleOCR1B  = duty;                   // Set pin 10 PWM duty cycleOCR2A  = duty;                   // Set pin 11 PWM duty cycle
}

参考资料

  • [1] 【YouTube@Hyperspace Pirate】Brushless DC Speed Controller
  • [2] 使用Arduino和IR2101的无刷直流电机控制器
  • [3] 使用Arduino的无传感器BLDC电机控制 – DIY ESC
  • [4] Sensorless brushless motor control with PIC16F887

MOSFETs: IRLZ44
Flyback Diodes: MUR120G
MOSFET Drivers: IR2101
5V Linear Regulator: LM7805
MOSFET Driver supply regulator: LM317

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MLIR的TOY教程学习笔记

MLIR TOY Language 文章目录 MLIR TOY Language如何编译该项目ch1: MLIR 前端IR解析ch2: 定义方言和算子 (ODS)1. 定义方言2. 定义OP3. OP相关操作4. 定义OP ODS (Operation Definition Specification)1. 基本定义2. 添加文档3. 验证OP4. 新增构造函数5. 定义打印OP的格式 ch3:…

【机器学习】超参数选择:解锁机器学习模型潜力的关键

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 超参数选择&#xff1a;解锁机器学习模型潜力的关键引言什么是超参数&#xff1…

计算机的错误计算(三十八)

摘要 计算机的错误计算&#xff08;十九&#xff09;指出&#xff1a;两个等价大数相减&#xff0c;差不是正确值0&#xff0c;而是一个大数。本节用 Python的 torch库中函数进行计算验证&#xff0c;进一步说明错误的一般性。 例1. 在Windows10&#xff0c;Python 3.12.4 下…

Android APP Camerax应用(02)预览流程

说明&#xff1a;camera子系统 系列文章针对Android12.0系统&#xff0c;主要针对 camerax API框架进行解读。 1 CameraX简介 1.1 CameraX 预览流程简要解读 CameraX 是 Android 上的一个 Jetpack 支持库&#xff0c;它提供了一套统一的 API 来处理相机功能&#xff0c;无论 …

【HarmonyOS NEXT】网络请求 - 分页加载

分页加载关键字&#xff1a;onReachEnd 一、申请网络权限 在 module.json5 文件中&#xff0c;添加网络权限&#xff1a; {"module": {..."requestPermissions": [{"name": "ohos.permission.INTERNET","usedScene": {&qu…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…

portainer教程-docker可视化管理工具

很多朋友刚接触docker 学习&#xff0c;就想问 docker有图形化界面吗 &#xff0c;答案是肯定的&#xff0c; 这里白眉大叔 给大家推荐 Docker可视化管理平台 -- Portainer 1- 运行Portainer&#xff1a; docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restarta…

【保姆级讲解C语言中的运算符的优先级!】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🪶C语言中的运算符的优先级 🪶C语言中的运算符的优先级决定了…

二、C#数据类型

本文是网页版《C# 12.0 本质论》第二章解读。欲完整跟踪本系列文章&#xff0c;请关注并订阅我的Essential C# 12.0解读专栏。 前言 数据类型&#xff08;Data Type&#xff09;是一个很恼人的话题。 似乎根本没必要对数据类型进行展开讲解&#xff0c;因为人人都懂。 但是…

grafana大坑,es找不到时间戳 | No date field named timestamp found

grafana大坑&#xff0c;es找不到时间戳。最近我这边的es重新装了一遍&#xff0c;结果发现grafana连不上elasticsearch了&#xff08;以下简称es&#xff09;&#xff0c;排查问题查了好久一直以为是es没有装成功或者两边的版本不兼容&#xff0c;最后才发现是数值类型问题 一…

浅聊 Three.js 屏幕空间反射SSR-SSRShader

浅聊 Three.js 屏幕空间反射SSR(2)-SSRShader 前置基础 渲染管线中的相机和屏幕示意图 -Z (相机朝向的方向)||| -------------- <- 屏幕/投影平面| | || | || | (f) | <- 焦距| | ||…

【BUG】已解决:error: legacy - install - failure

error: legacy - install - failure 目录 error: legacy - install - failure 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&…

51单片机14(独立按键实验)

一、按键介绍 1、按键是一种电子开关&#xff0c;使用的时候&#xff0c;只要轻轻的按下我们的这个按钮&#xff0c;按钮就可以使这个开关导通。 2、当松开这个手的时候&#xff0c;我们的这个开关&#xff0c;就断开开发板上使用的这个按键&#xff0c;它的内部结构&#xff…

免费分享:2021年度全国城乡划分代码(附下载方法)

《关于统计上划分城乡的规定》指出&#xff1a;“本规定作为统计上划分城乡的依据&#xff0c;不改变现有的行政区划、隶属关系、管理权限和机构编制&#xff0c;以及土地规划、城乡规划等有关规定”。统计用区划代码和城乡划分代码用于统计工作&#xff0c;需要在其他工作中使…

回溯题目的套路总结

前言 昨天写完了LeeCode的7&#xff0c;8道回溯算法的题目&#xff0c;写一下总结&#xff0c;这类题目的共同特点就是暴力搜索问题&#xff0c;排列组合或者递归&#xff0c;枚举出所有可能的答案&#xff0c;思路很简单&#xff0c;实现起来的套路也很通用&#xff0c;一…

java题目之抽奖以及优化方式

public class Main9 {public static void main(String[] args) {int[]arr{ 2,588,888,1000,10000};int [] newArrnew int[arr.length];//3.抽奖Random rnew Random();//因为有5个奖项,所以这里循环五次for (int i 0; i <5 ; ) {//获取随机索引int randomIndexr.nextInt(arr…

前端-模拟请求数据mook第三方插件 json-server的使用

大纲 第一步下载第二配置mook的数据源第三配置启动命令第四运行模拟服务第五测试接口如果要进行更复杂的操作 第一步下载 npm install json-server -D"devDependencies": {"json-server": "^1.0.0-beta.1"}第二配置mook的数据源 在项目的根目录…

图纸为什么需要加密?2024超好用的图纸加密软件推荐

图纸通常包含产品的设计细节、规格和技术信息&#xff0c;这些都是公司的核心知识产权。加密可以防止未经授权的访问和复制&#xff0c;避免知识产权被盗用或侵权。 图纸加密软件对于保护企业的知识产权和商业秘密至关重要&#xff0c;特别是在CAD&#xff08;计算机辅助设计&…

内网安全:各类密码的抓取

Mimikatz在线读取SAM文件 离线读取SAM文件 在线读取lsass进程 离线读取lsass进程 BrowserGhost浏览器密码抓取 Sharp-HackBrowserData浏览器密码抓取 SharpDecryptPwd数据库密码抓取 LaZagne各类密码的抓取 Windows其他类型抓NTLM Hash工具 sam文件和lsass进程就是Wind…

谷粒商城-商品上架

1.sku在es中的存储模型分析(spring整和es) es中所有数据存在内存中,内存产品贵,能节省就节省,只保存有用的信息 两种保存方法:(空间换时间,时间换空间): 我们选空间换时间 ES中放这些东西: "mappings": { "properties": { "skuId"…