Arduino中手写脉冲控制步进电机-2

目录

1、前言

2、时间-位移关系计算

3、Matlab计算时间和位置数据

(1)Matlab程序

(2)Arduino程序

4、Matlab生成Arduino电机正反转程序语句

(1)Arduino程序

(2)Matlab 命令行方式生成Arduino步进电机正反转程序语句

①正转命令行

②反转命令行

(3)Matlab GUI方式生成Arduino步进电机正反转程序语句

5、下载链接


1、前言

Arduino中手写脉冲控制步进电机-1-CSDN博客 接上一节继续。上一节是实现步进电机恒速运转,要实现电机变速运动需要对脉冲延时函数进行调整。本节主要讲解电机固定位置往复运动、速度以曲线方式运行。

2、时间-位移关系计算

步进电机时间-位移关系拟合三角函数。从Cos函数曲线上采样、取很多个点,取样点越细电机运行就越圆滑。

思路:对于一个 时间-位移 三角函数,每隔相同的时长(称为单元时长)取一次位移值,计算相邻

两次位移的距离(的绝对值),再计算对应的脉冲步数的delay时长

1、距离固定后,脉冲步数固定。

2、由于单元时长固定,因此每步的脉冲时长(脉冲频率)也是固定的。但是不同单元的脉冲频率不同

3、即固定单元时长,但不固定单元内步数,因此单元的脉冲频率也不固定

类似于这样,然后使电机的时间-位移关系,满足相邻红星时间-位移关系即可。

3、Matlab计算时间和位置数据

(1)Matlab程序

运行的.m脚本程序

%% 1.步进电机PWM计算代码
clc
clear
close all
%% 原始值
A=40.64;                    %振幅*2,两倍振幅,即伸缩杆的移动范围。电机1600脉冲转一圈,40.64=1600*。0.254
MBJL=0.0254;                %每步距离,电机固定参数(与细分数有关)
T=2;                        %三角函数的周期2秒,即2秒执行完给定的脉冲数
T=T*1000*1000;              %换算为微秒
SN=A/MBJL;                  %StepNumber,三角函数一个周期内的脉冲步数,振幅固定后SN即固定
TPSN=T/SN;                  %TimePerStep,每步的时长的平均值
UN=20;                      %UnitNumber,一个周期平均分割的单元总数
%函数
x=2*pi/SN:2*pi/SN:2*pi;     %自变量
y=func(x,A);                %函数

% %函数:脉冲数-位移图
% figure(1)
% plot(1:SN,y,'b.','markersize',15,'LineWidth',1)
% xlabel('脉冲数')
% ylabel('位移/mm')
% ZT=30;%字体30号
% set(gca,'FontSize',ZT);
% aaa=2;
% set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
% set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);
% 
% %目标函数图(理想函数图)
% figure(2)
% plot((1:SN)*TPSN,y,'b.','markersize',15,'LineWidth',1)
% xlabel('时间/微秒')
% ylabel('位移/mm')
% ZT=30;%字体30号
% set(gca,'FontSize',ZT);
% aaa=2;
% set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
% set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);

%%
NN=1:SN/UN:SN;                  %平均分割的脉冲坐标
NN(length(NN)+1)=SN;
x0=zeros(1,length(NN));
for i=1:length(NN)
    x0(1,i)=x(NN(1,i));         %平均分割的脉冲坐标对应的x坐标
end
y0=func(x0,A);                  %x坐标对应的位移
y01=y0(1:(length(NN)-1));
y02=y0(2:(length(NN)));
y00=y02-y01;
%求解
MCZS=abs(y00/0.0254);            %一个单元内的脉冲总数
MCZS=round(MCZS);
PJBC=(T/UN)./MCZS;               %每单元的平均步长,微秒,脉冲总数需要四舍五入
PJBC=round(PJBC);

%结果
Result_mc=MCZS;
Result_bc=PJBC;
%% 还原函数图
MCZS000=y00/0.0254;             %一个单元内的脉冲总数
MCZS000=round(MCZS000);
x1=MCZS000*MBJL;
JLJL=zeros(1,UN);               %积累距离,mm
for i=1:UN
    JLJL(i)=sum(x1(1:i));
end

x2=MCZS.*PJBC;
JLSJ=zeros(1,UN);               %积累时间,微秒
for i=1:UN
    JLSJ(i)=sum(x2(1:i));
end

figure(3)
plot((1:SN)*TPSN,y,'b.-','markersize',5,'LineWidth',5)
hold on
plot(JLSJ,JLJL+abs(min(JLJL)),'r*-','markersize',10,'LineWidth',2)
xlabel('时间/微秒')
ylabel('位移/mm')
legend('理想时间位移函数','还原时间位移关系')

ZT=30;%字体30号
set(gca,'FontSize',ZT);
aaa=2;
set(gcf,'unit','centimeters','position',[2 2 16*aaa 9*aaa]);
set(gca,"FontName","宋体","FontSize",ZT,"LineWidth",2);

func函数。保存位func.m脚本程序。

function y=func(x,A)
y=A/2*cos(x)+A/2;

(2)计算结果

将计算的数据带到Arduino程序中

(2)Arduino程序



#define STEPPIN 7     //脉冲位为7
#define DIRPIN 6      //方向位为6
#define bushu 1600    //脉冲步数  1600个脉冲转一圈()

void setup() {
  pinMode(STEPPIN, OUTPUT);
  pinMode(DIRPIN, OUTPUT);
  Serial.begin(9600);


}

//循环 
void loop() 
{
//不论电机初始位置如何,使电机超量程运动,以达到复位效果
//1.正转一圈
  Serial.println("Forward Begins");     //串口监视器输出引号内容
  digitalWrite(DIRPIN, HIGH);           //方向引脚高电位,正转
  // 正向转(1001步)
  for (int x = 0; x < bushu+1; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(500);             //Microseconds是微秒
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(500);             //Microseconds是微秒
  }
  Serial.println("Forward Ends");       //串口监视器输出引号内容
  delay(1000);                          // 暂停1秒
  
//2.逆转1圈 
  Serial.println("Backward Begins");    //串口监视器输出引号内容
  digitalWrite(DIRPIN, LOW);            //方向引脚低电位,逆转
  // 反向转(bushu脉冲)
  for (int x = 0; x < bushu+1; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(500);             //Microseconds是微秒
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(500);             //Microseconds是微秒
  }
  Serial.println("Backward Ends");      //串口监视器输出引号内容
  delay(1000); //暂停1秒
  
//3.
  Serial.println("Forward Begins");     //串口监视器输出引号内容
  digitalWrite(DIRPIN, HIGH);           //方向引脚高电位,正转
  // 正向转
  for (int x = 0; x < 40; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(2500);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(2500);
  }
  for (int x = 0; x < 115; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(870);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(870);
  }
  for (int x = 0; x < 178; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(562);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(562);
  }
  for (int x = 0; x < 223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(448);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(448);
  }
  for (int x = 0; x < 247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(405);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(405);
  }
  for (int x = 0; x < 247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(405);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(405);
  }
  for (int x = 0; x < 223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(448);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(448);
  }
  for (int x = 0; x < 176; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(568);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(568);
  }
  for (int x = 0; x < 113; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(885);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(885);
  }
  for (int x = 0; x < 38; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(2632);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(2632);
  }
  delay(1000); //暂停1秒

//4.
  Serial.println("Backward Begins");//串口监视器输出引号内容
  digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转
 // 正向转
  for (int x = 0; x < 40; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(2500);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(2500);
  }
  for (int x = 0; x < 115; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(870);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(870);
  }
  for (int x = 0; x < 178; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(562);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(562);
  }
  for (int x = 0; x < 223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(448);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(448);
  }
  for (int x = 0; x < 247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(405);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(405);
  }
  for (int x = 0; x < 247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(405);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(405);
  }
  for (int x = 0; x < 223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(448);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(448);
  }
  for (int x = 0; x < 176; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(568);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(568);
  }
  for (int x = 0; x < 113; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(885);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(885);
  }
  for (int x = 0; x < 38; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(2632);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(2632);
  }
  delay(1000); //暂停1秒
}

4、Matlab生成Arduino电机正反转程序语句

(1)Arduino程序

循环程序中,1和2是恒速方式运行。3和4是曲线方式正反转,使用Matlab生成的语句和数据。Matlab生成的程序语句直接复制到3和4中。



#define STEPPIN 7     //脉冲位为7
#define DIRPIN 6      //方向位为6
#define bushu 1600    //脉冲步数  1600个脉冲转一圈()

void setup() {
  pinMode(STEPPIN, OUTPUT);
  pinMode(DIRPIN, OUTPUT);
  Serial.begin(9600);

}

//循环 
void loop() 
{
//不论电机初始位置如何,使电机超量程运动,以达到复位效果
//1.正转一圈
  Serial.println("Forward Begins");     //串口监视器输出引号内容
  digitalWrite(DIRPIN, HIGH);           //方向引脚高电位,正转
  // 正向转(1001步)
  for (int x = 0; x < bushu+1; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(500);             //Microseconds是微秒
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(500);             //Microseconds是微秒
  }
  Serial.println("Forward Ends");       //串口监视器输出引号内容
  delay(1000);                          // 暂停1秒
  
//2.逆转1圈 
  Serial.println("Backward Begins");    //串口监视器输出引号内容
  digitalWrite(DIRPIN, LOW);            //方向引脚低电位,逆转
  // 反向转(bushu脉冲)
  for (int x = 0; x < bushu+1; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(500);             //Microseconds是微秒
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(500);             //Microseconds是微秒
  }
  Serial.println("Backward Ends");      //串口监视器输出引号内容
  delay(1000); //暂停1秒
  
//3、曲线方式正转一圈
  Serial.println("Forward Begins");     //串口监视器输出引号内容
  digitalWrite(DIRPIN, HIGH);           //方向引脚高电位,正转
  // 正向转
  for (int x = 0; x <40; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(5000);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(5000);
  }
  for (int x = 0; x <115; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1739);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1739);
  }
  for (int x = 0; x <178; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1124);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1124);
  }
  for (int x = 0; x <223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(897);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(897);
  }
  for (int x = 0; x <247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(810);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(810);
  }
  for (int x = 0; x <247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(810);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(810);
  }
  for (int x = 0; x <223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(897);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(897);
  }
  for (int x = 0; x <176; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1136);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1136);
  }
  for (int x = 0; x <113; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1770);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1770);
  }
  for (int x = 0; x <38; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(5263);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(5263);
  }
  delay(1000); //鏆傚仠1绉?

//4、曲线方式正转一圈
  Serial.println("Backward Begins");//串口监视器输出引号内容
  digitalWrite(DIRPIN, LOW);//方向引脚低电位,逆转
   // 反向转
  for (int x = 0; x <40; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(5000);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(5000);
  }
  for (int x = 0; x <115; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1739);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1739);
  }
  for (int x = 0; x <178; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1124);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1124);
  }
  for (int x = 0; x <223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(897);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(897);
  }
  for (int x = 0; x <247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(810);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(810);
  }
  for (int x = 0; x <247; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(810);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(810);
  }
  for (int x = 0; x <223; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(897);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(897);
  }
  for (int x = 0; x <176; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1136);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1136);
  }
  for (int x = 0; x <113; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(1770);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(1770);
  }
  for (int x = 0; x <38; x ++) {
    digitalWrite(STEPPIN, HIGH);
    delayMicroseconds(5263);
    digitalWrite(STEPPIN, LOW);
    delayMicroseconds(5263);
  }
  delay(1000); //延时1秒?
}

(2)Matlab 命令行方式生成Arduino步进电机正反转程序语句

在前面Matlab程序计算出来时间、脉冲步数数据后,将计算结果一个一个写到程序语句中。这样操作非常的慢和低效,可以使用Matlab命令行来操作。

①正转命令行

%% 2.自动化语句生成代码(1)正向转
clc
Result_bc_str=num2str(Result_bc(1));
Result_mc_str=num2str(Result_mc(1));
%% 正向转
for iii=1:length(Result_bc)/2
    %记录步数
    s11='  for (int x = 0; x <';
    s21=num2str(Result_mc(iii));
    s31='; x ++) {';
    s1 = strcat(s11,s21,s31);
    %记录delay时长
    s12='    delayMicroseconds(';
    s22=num2str(Result_bc(iii));
    s32=');';
    s2 = strcat(s12,s22,s32);
    %合成语句
    disp([s1 newline '    digitalWrite(STEPPIN, HIGH);' newline s2 newline '    digitalWrite(STEPPIN, LOW);' newline s2 newline '  }'])
end
disp(['  delay(1000); //暂停1秒' newline

生成程序语句替换到Arduino第三段正转控制中

②反转命令行

%% 2.自动化语句生成代码(2)逆向转
clc
Result_bc_str=num2str(Result_bc(1));
Result_mc_str=num2str(Result_mc(1));
%% 正向转
for iii=length(Result_bc)/2+1:length(Result_bc)
    %记录步数
    s11='  for (int x = 0; x <';
    s21=num2str(Result_mc(iii));
    s31='; x ++) {';
    s1 = strcat(s11,s21,s31);
    %记录delay时长
    s12='    delayMicroseconds(';
    s22=num2str(Result_bc(iii));
    s32=');';
    s2 = strcat(s12,s22,s32);
    %合成语句
    disp([s1 newline '    digitalWrite(STEPPIN, HIGH);' newline s2 newline '    digitalWrite(STEPPIN, LOW);' newline s2 newline '  }'])
end
disp(['  delay(1000); //暂停1秒' newline])

生成的程序复制到Arduino中

(3)Matlab GUI方式生成Arduino步进电机正反转程序语句

GUI通过.m脚本程序运行生成。脚本程序见下载链接

5、下载链接

https://download.csdn.net/download/panjinliang066333/88670374

参考博客

【Arduino步进电机】【5.1】PWM代码(1)_arduino pwm 步进电机-CSDN博客

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

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

相关文章

21.仿简道云公式函数实战-数学函数-COS

1. COS函数 COS 函数可用于计算角度的余弦值&#xff0c;返回 -1 到 1 之间的数值。 2. 函数用法 COS(弧度) 3. 函数示例 如计算 COS(60) 的值&#xff0c;可设置公式为COS(RADIANS(60))&#xff0c;返回 0.5。 4. 代码实战 首先我们在function包下创建math包&#xff0…

【C++】开源:cpp-httplib HTTP协议库配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍cpp-httplib HTTP协议库配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&a…

Python入门学习篇(十一)——函数注释函数嵌套全局变量与局部变量

1 函数注释 1.1 使用说明 第一步 在函数体里面输入三个""" 第二步 回车1.2 示例代码 def quotient(divisor,dividend):""":param divisor: 除数:param dividend: 被除数:return: 商"""return divisor/dividendnum1int(input(&…

10. Opencv检测并截取图中二维码

1. 说明 在二维码扫描功能开发中,使用相机扫描图片时,往往图片中的信息比较多样,可能会造成二维码检测失败的问题。一种提高检测精度的方式就是把二维码在图片中单独抠出来,去除其它冗余信息,然后再去识别这张提取出来的二维码。本篇博客记录采用的一种实现二维码位置检测…

律师卷宗档案保存期限多久?律师档案卷宗如何整理?

律师卷宗档案的保存期限可以根据不同法律和法规进行调整&#xff0c;因此可能会有所不同。一般来说&#xff0c;律师卷宗档案的保存期限通常为10年以上。然而&#xff0c;具体的保存期限还会受到当地司法体系和律师协会规定的影响。建议您咨询所在地的律师协会或相关法律机构&a…

AGV智能搬运机器人-替代人工工位让物流行业降本增效

在当今快速发展的世界中&#xff0c;物流业面临着巨大的挑战&#xff0c;包括提高效率、降低成本和优化工作流程。为了应对这些挑战&#xff0c;一种新型的自动化设备——智能搬运机器人正在崭露头角。本文将通过一个具体的案例来展示富唯智能转运机器人在实际应用中的价值。 案…

【2023】通过docker安装hadoop以及常见报错

&#x1f4bb;目录 1、准备2、安装镜像2.1、创建centos-ssh的镜像2.2、创建hadoop的镜像 3、配置ssh网络3.1、搭建同一网段的网络3.2、配置host实现互相之间可以免密登陆3.3、查看是否成功 4、安装配置Hadoop4.1、添加存储文件夹4.2、添加指定配置4.3、同步数据 5、测试启动5.1…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

【新版Hi3536AV100性能果真强悍】

Hi3536AV100是针对多路高清/超高清&#xff08;1080p/4M/5M/4K&#xff09;智能NVR产品应用开发的新一代专业高端SoC芯片。 Hi3536AV100集成了ARM Cortex-A55八核处理器和性能强大的神经网络处理器&#xff0c;支持多种智能算法应用。 Hi3536AV100支持32路1080p多协议解码及4路…

js中深拷贝与浅拷贝的区别?如何实现一个深拷贝?(收藏好,用时好找)

文章目录 一、数据类型存储二、浅拷贝Object.assignslice()concat()拓展运算符 三、深拷贝_.cloneDeep()jQuery.extend()JSON.stringify()循环递归 四、区别小结 一、数据类型存储 前面文章我们讲到&#xff0c;JavaScript中存在两大数据类型&#xff1a; 基本类型引用类型 …

CorelCAD各版本安装指南

下载链接 https://pan.baidu.com/s/1v0VgYRaaRRUeAgJC__0rPw?pwd0531 1.鼠标右击【CorelCAD2023(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 CorelCAD2023(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【CorelCA…

Mybatis行为配置之Ⅱ—结果相关配置项说明

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL 文章目录 专栏精选引言摘要正文autoMappingBehaviorautoMappingU…

打开相机失败 出现错误的原因

如何解决&#xff1f; Debug中缺少DLL文件 以下参考周姐文档 相机调用步骤 学习相机第三方库的安装 https://blog.csdn.net/Qingshan_z/article/details/117257136书签&#xff1a;QT添加库&#xff08;静态库和动态库&#xff09;_Qingshan_z的博客-CSDN博客_qt添加库 添加文…

开发知识点-Weblogic

Weblogic 介绍CVE_2018_2628poc-yaml-weblogic-ssrfpoc-yaml-weblogic-cve-2017-10271poc-yaml-weblogic-cve-2019-2725poc-yaml-weblogic-cve-2019-2729-1poc-yaml-weblogic-cve-2019-2729-2poc-yaml-weblogic-cve-2020-14750poc-yaml-weblogic-local-cve-2022-21371-file-inc…

修改jenkins的目录(JENKINS_HOME)

默认JENKINS_HOME是/var/lib/jenkins/ 现要修改为/home/jenkins_data/jenkins 最开始 sudo cp -a /var/lib/jenkins/ /home/jenkins_data/ 然后如下操作&#xff1a; 1、首先 /etc/sysconfig/jenkins&#xff1a;jenkins配置文件&#xff0c;“端口”&#xff0c;“JENKIN…

数字 IC 笔试易混淆整理

signed 扩展 比较以下4段代码&#xff0c;给出W_DATA2的结果&#xff08;十进制或16进制或二进制&#xff09;&#xff1b; wire signed [3:0] W_DATA1 4b1000; wire signed [7:0] W_DATA2; assign W_DATA2 W_DATA1; wire [3:0] W_DATA1 4b1000; wire signed [7:0] W_DA…

JPEG的操作模式和数据

JPEG&#xff08;Joint Photographic Experts Group&#xff09;是一种广泛应用于图像压缩领域的标准。JPEG的操作模式和数据结构是实现图像压缩和解压缩的重要组成部分。本文将详细介绍JPEG的操作模式和数据结构&#xff0c;以及其在图像处理中的应用。 JPEG的操作模式主要包…

Jest 测试框架快速上手

目录 一、Jest 是什么 二、Jest 开始使用步骤 1. 初始化一个新的项目 2. 安装 3. 创建测试文件并编写测试用例 4. 运行测试 三、单元测试框架基本原理 1. test 2. expect 3. toBe 匹配器 四、匹配器及适用范围 1. 普通匹配器 2. 与真假有关的匹配器 3. 数字 4. …

搭建FTP服务器详细介绍

一.FTP简介 &#xff11;.&#xff11;什么是FTP &#xff11;.&#xff12;FTP服务器介绍 &#xff11;.&#xff13;FTP服务器优缺点 二.FTP服务器的搭建与配置 2.1 开启防火墙 2.2创建组 2.3创建用户 2.4安装FTP服务器 2.5配置FTP服务器 &#xff12;.&#xff…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照&#xff0c;把某一时刻数据和妆容以文件的形式写到磁盘上&#xff0c;也就是快照。 配置文件 如果是普通安装方式可以跳过&#xff0c;如果是docker安装&#xff0c;需要到官网下载redis.conf配置文件到本地&#xff0c;地址…