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:UNJLJL(i)=sum(x1(1:i));
endx2=MCZS.*PJBC;
JLSJ=zeros(1,UN);               %积累时间,微秒
for i=1:UNJLSJ(i)=sum(x2(1:i));
endfigure(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博客

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

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

相关文章

【Unity自制手册】基于Unity中物体移动相关方法和API集锦(动图详解)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

IPEmotion数据采集软件功能介绍

IPEmotion作为IPETRONIK的软件产品&#xff0c;主要应用于车辆测试和不同的实验室测试系统&#xff0c;能够满足各种测量需求。通过专业化的数据采集软件IPEmotion&#xff0c;我们可实现完整的数据采集过程&#xff0c;包括&#xff1a;配置数据采集设备&#xff1b;使用不同的…

SD-WAN企业组网的核心要点

随着企业网络需求的不断演进和全球化业务的扩张&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;作为一种先进的网络架构技术&#xff0c;逐渐成为企业组网的首选方案。SD-WAN通过提供更灵活、高效和安全的网络连接&#xff0c;帮助企业轻松应对不同地区和业务需求。…

计算机毕业设计---ssm+mysql+jsp实现的校园二手市场交易平台源码

项目介绍 本系统主要实现的功能有&#xff1a; 前台&#xff1a;&#xff08;1&#xff09;二手物品信息查看、搜索。 &#xff08;2&#xff09;学生注册登录、个人信息修改。 &#xff08;3&#xff09;二手物品信息发布、编辑。 &#xff08;4&#xff09;二手物品评论、回…

【Unity细节】为什么按下移动键之后,物体还是会滑行一段距离(阻力都无穷大了)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 &#x1f636;‍&#x1f32b;️收录于专栏&#xff1a;unity细节和bug &#x1f636;‍&#x1f32b;️优质专栏 ⭐【…

内存满了无法开机(Ubuntu)

文章目录 在开机界面长按“shift”进入进入shell命令模式详细步骤选择Recovery Menu删除不需要的文件 在开机界面长按“shift”进入 进入shell命令模式详细步骤 选择Recovery Menu 删除不需要的文件 自己看着办吧

STM32 IIC开发学习

1IIC总线时序图 ① 起始信号 当 SCL 为高电平期间&#xff0c;SDA 由高到低的跳变。起始信号是一种电平跳变时序信号&#xff0c;而不是 一个电平信号。该信号由主机发出&#xff0c;在起始信号产生后&#xff0c;总线就会处于被占用状态&#xff0c;准备数据 传输。 ② 停止信…

Android 8.1 设置USB传输文件模式(MTP)

项目需求&#xff0c;需要在电脑端adb发送通知手机端接收指令&#xff0c;将USB的仅充电模式更改成传输文件&#xff08;MTP&#xff09;模式&#xff0c;便捷用户在我的电脑里操作内存文件&#xff0c;下面是我们的常见的修改方式 1、android12以下、android21以上是这种方式…

腾讯云轻量应用主机与云服务器功能、性能区别对比总结

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

事务的简介

一、什么是事务 事务是一组数据库的操作序列&#xff0c;包含一个或多个sql操作命令&#xff08;增删改&#xff09;&#xff0c;事务将所有的操作命令看做一个不可分割的整体&#xff0c;向数据库系统提交或撤销操作&#xff0c;所有操作要么执行要么不执行。 ●事务是一种机…

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

进程间通信-匿名管道

一 什么是通信 就是进程间的数据交换&#xff0c;进程间由于具有独立性&#xff0c;需要操作系统提供能让进程间交换信息&#xff0c;也就是数据的方法。 二 如何做到 让不同进程看到同一份资源(这不是很简单的事吗)&#xff0c;我在父进程定义一个变量&#xff0c;子进程不就…

庙算兵棋推演AI开发初探(2-编写策略(上))

开始研读step()函数的编写方法。 这个是图灵网提供了一些基础的ai代码下载&#xff08;浏览需要注册&#xff0c;下载需要审批&#xff09;。 AI开发中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/ai_center/show 一、代码研读(BaseAgent类) 1.step函数 这段代码定…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际&#xff0c;本周&#xff0c;传统汽车巨头丰田公司宣布&#xff0c;将出售部分电装&#xff08;Denso&#xff09;公司股份&#xff0c;资金用于投入电动化、智能驾驶等新技术研发。 按照计划&#xff0c;丰田汽车拟出售超过…

私有部署ELK,搭建自己的日志中心(二)-- filebeat的介绍与安装

一、背景 在搭建ELK系统之前&#xff0c;你有必要去了解下&#xff0c;为何大家在agent端普遍青睐filebeat&#xff0c;而把logstash放置于更加靠后端。 轻量级的filebeat&#xff0c;作为agent角色&#xff0c;是安装在每台虚拟机上。 filebeat的学习分为两大部分&#xff1…

【Java基础系列】body参数前后端不一致

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言&#xff1a;定时器TIM的详细知识点见我的博文&#xff1a;11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释&#xff1a; ARR&#xff08;TIM_Period&#xff09;&#xff1a;自动重装载值&#xff0c;是定时器溢出前的计数值 PSC&#xff08;TIM_Prescaler&…

Docker自建文件快递柜系统

Docker自建文件快递柜系统。 软件特色&#xff1a; 轻量简洁&#xff1a;FastapiSqlite3Vue2ElementUI 轻松上传&#xff1a;复制粘贴&#xff0c;拖拽选择 多种类型&#xff1a;文本&#xff0c;文件 防止爆破&#xff1a;错误次数限制 防止滥用&#xff1a;IP限制上传次数…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

软件测试/测试开发丨学习笔记之Python控制流-分支、循环

分支判断 什么是分支判断 一条一条语句顺序执行叫做顺序结构分支结构就是在某个判断条件后&#xff0c;选择一条分支去执行 1. IF if condition_1:statement_block_1 elif condition_2:statement_block_2 else:statement_block_32. if 嵌套 在嵌套 if 语句中&#xff0c;可…