51单片机嵌入式开发:16、STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作

STC89C52RC 嵌入式之 步进电机28BYJ48、四拍八拍操作

  • STC89C52RC 之 步进电机28BYJ48操作
  • 1 概述
    • 1.1 步进电机概述
    • 1.2 28BYJ48概述
  • 2 步进电机工作原理
    • 2.1 基本原理
    • 2.2 28BYJ48工作原理
    • 2.3 28BYJ48控制原理
  • 3 电路及软件代码实现
  • 4 步进电机市场价值


STC89C52RC 之 步进电机28BYJ48操作

在这里插入图片描述

1 概述

1.1 步进电机概述

步进电机是一种电动机类型,用于将电脉冲信号转换为精确的旋转运动。与传统的直流电机相比,步进电机具有以下特点:
(1)精确控制:步进电机可以按照给定的电脉冲信号进行精确的步进运动,每个脉冲对应一个固定的角度移动,从而实现精确的定位和控制。
(2)分步运动:步进电机的运动是通过逐步驱动电机的转子来实现的。每个电脉冲信号引起电机转子旋转一个固定的步距角,从而实现分步运动。
(3)简单控制:步进电机的控制相对简单,只需提供适当的脉冲信号即可控制电机的旋转角度和速度。可以使用计数器、控制器或微处理器来生成脉冲信号,实现精确的步进运动。
(4)高扭矩低速度:步进电机通常具有较高的静态和动态扭矩,适用于需要高力矩输出但速度较低的应用。
(5)不需要反馈:步进电机在运行时不需要位置反馈装置,因为每个脉冲信号对应一个固定的角度移动,电机的位置可以通过计数脉冲数来确定。
步进电机广泛应用于各种自动化和控制系统中,例如机器人、打印机、数控机床、电子仪器、精密仪器等。其精确的控制和定位能力使其成为许多应用中的理想选择。不同类型的步进电机包括单相步进电机、双相步进电机、混合式步进电机等,每种类型的步进电机具有不同的特性和应用场景。

1.2 28BYJ48概述

28BYJ-48是一种步进电机,常用于各种控制和自动化应用中。
28:步进电机的有效最大外径尺寸是28毫米
B:表示是步进式电机
Y:表示是永磁式型号
J:表示是减速型(减速比1:64)
48:可以四拍、八拍运行

在这里插入图片描述

以下是28BYJ-48步进电机的一些常见用途:
机器人运动控制:28BYJ-48步进电机可以用作机器人的关节控制,实现精确的运动和定位,例如机械臂、舵机等。
打印机和扫描仪:步进电机可以用于控制打印机和扫描仪中的进纸、打印头位置和扫描仪移动等功能。
自动门和窗帘控制:步进电机可用于自动门、窗帘等的开启和关闭控制,实现自动化的开关操作。
3D打印机:28BYJ-48步进电机可以用于3D打印机中的X、Y、Z轴的精确定位和运动控制。
绘图仪和CNC机床:步进电机可用于绘图仪和CNC机床中的精确运动和定位控制,实现绘图和切割等操作。
汽车零部件控制:步进电机可用于汽车零部件的控制,如车窗升降、后视镜调节等。
电子设备中的调节和定位控制:步进电机可用于电子设备中的机械臂、摄像头调节、焦距调节等功能。
电子仪器中的精确测量:步进电机可用于电子仪器中的精确测量和定位需求,如显微镜、精密仪器等。
这些只是28BYJ-48步进电机的一些常见用途,实际应用还可以根据需求进行定制和扩展。步进电机的精确控制和定位能力使其成为许多自动化和控制系统中的重要组成部分。

2 步进电机工作原理

2.1 基本原理

步进电机的工作原理基于磁场相互作用和电磁感应的原理,它将电脉冲信号转换为旋转运动。以下是步进电机的一般工作原理:
(1)基本结构:
步进电机通常由定子和转子两部分组成。定子包含电磁线圈,而转子则是带有磁性极性的部分。
(2)磁极排列:
定子上的电磁线圈通常被分成多个相位,每个相位上都有一个磁极。磁极的数目决定了电机的步距角度。
(3)磁场交互作用:
当电磁线圈通电时,产生的磁场与转子上的磁极相互作用,导致转子发生旋转。
(4)相序控制:
为了使步进电机按预期的方向和步距运动,需要正确控制电磁线圈的电流顺序。这称为相序控制。
通过改变电磁线圈的电流顺序,可以使电机按顺时针或逆时针方向旋转,并控制每次步进的角度。
(5)脉冲驱动:
步进电机的旋转运动是通过给定一系列脉冲信号来驱动的。每个脉冲信号对应电机的一个步距角,电机按照脉冲信号的频率和顺序进行步进运动。
(6)步距角度:
步进电机的步距角度取决于电机的结构和磁极的数量。例如,一个4相2线程的步进电机,每个步距角度为360度除以磁极数量。
需要注意的是,步进电机的精确性受到许多因素的影响,如电机的设计、驱动电路的性能、脉冲信号的频率和准确性等。因此,在实际应用中,需要综合考虑这些因素并进行适当的调试和控制,以实现所需的精确控制和定位效果。

2.2 28BYJ48工作原理

(1)28BYJ-48是一种常见的小型步进电机。它是一种四相、八拍驱动的步进电机,采用了无心式转子结构。以下是28BYJ-48步进电机的工作原理:

在这里插入图片描述

(2)28BYJ-48步进电机的内部结构示意图如下所示。转子上有6个齿,分别标注为0至5,每个齿上都带有一块永磁体。

在这里插入图片描述

定子与电机的外壳固定在一起,定子上有8个齿,每个齿上都缠绕着一个线圈绕组。相对的两个齿上的绕组串联在一起,在图中分别标注为A、B、C、D,形成了4相的概念。这意味着这两个绕组总是同时导通或同时断开。
(3)28BYJ-48主要技术参数:

在这里插入图片描述

(4)步进电机的主要特性如下:
驱动方式:
步进电机需要外部驱动才能运转,驱动信号必须是脉冲信号。当没有脉冲信号输入时,步进电机处于静止状态。通过适当的脉冲信号输入,步进电机会按照一定的角度(称为步角)旋转,其转动速度与脉冲信号的频率成正比。
A:28BYJ-48步进电机特性:
28BYJ-48是一种4相5线的减速步进电机,其减速比为1:64,步进角为5.625度/64。若需使其转动一圈,需要4096个脉冲信号(360度/5.625度 × 64)。
B:瞬间启动和急速停止:
步进电机具有瞬间启动和急速停止的优越特性。一旦脉冲信号输入,步进电机能够立即启动,并且可以迅速停止旋转。
C:方向控制:
通过改变脉冲信号的顺序,可以方便地改变步进电机的转动方向。这使得步进电机在许多应用中具有灵活性和可控性。
因此,步进电机目前广泛应用于打印机、绘图仪、机器人等设备中,成为它们的动力核心。

2.3 28BYJ48控制原理

所采用的是5V步进电机,其额定耗电流约为200mA。驱动采用ULN2003,驱动端口分别为P1.0(A)、P1.1(B)、P1.2©和P1.3(D)。
28BYJ48有三种控制原理

在这里插入图片描述

(1)单4拍控制方式
脉冲电平循环发送的方式控制:

unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000
unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010

(2)双4拍控制方式
AC互补,BD互补的方式进行控制:
脉冲电平循环发送的方式控制:

unsigned char code F_Rotation[4]={0x09,0x03,0x06,0x0C}; //正转表格
unsigned char code B_Rotation[4]={0x0C,0x06,0x03,0x09}; //反转表格

(3)8拍控制方式

//正转的步进次序如下:AB组 → BC组 → CD组 → DA组(每个脉冲使电机正转5.625/64度)。
//反转的步进次序如下:AB组 → AD组 → CD组 → CB组(每个脉冲使电机正转5.625/64度)。
unsigned char code F_Rotation[4]={0x03,0x06,0x0c, 0x09}; //正转表格
unsigned char code B_Rotation[4]={0x03,0x09,0x0c,0x06};//反转表格

P1端口变化请参考下表:
正转表:

在这里插入图片描述

反转表:

在这里插入图片描述

3 电路及软件代码实现

将P1端口跳线接到左边位置处,ABCD对应位置,将步进电机的排母接到右边位置,红色引线为VCC。

在这里插入图片描述

软件代码如下:

(1)单四拍代码

//main.c文件#include "includes.h"/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}//(1)单4拍控制方式
//脉冲电平循环发送的方式控制:
unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000
unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010(2)双4拍控制方式
AC互补,BD互补的方式进行控制:
脉冲电平循环发送的方式控制:
//unsigned char code F_Rotation[4]={0x09,0x03,0x06,0x0C}; //正转表格
//unsigned char code B_Rotation[4]={0x0C,0x06,0x03,0x09}; //反转表格(3)8拍控制方式
正转的步进次序如下:AB组 → BC组 → CD组 → DA组(每个脉冲使电机正转5.625/64度)。
反转的步进次序如下:AB组 → AD组 → CD组 → CB组(每个脉冲使电机正转5.625/64度)。
//unsigned char code F_Rotation[4]={0x03,0x06,0x0c, 0x09}; //正转表格
//unsigned char code B_Rotation[4]={0x03,0x09,0x0c,0x06};//反转表格/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
void main(void)
{unsigned char i;while(1){for(i=0;i<4;i++)      //4相{P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大}}
}

(2)双四拍代码

//main.c文件#include "includes.h"/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}(1)单4拍控制方式
脉冲电平循环发送的方式控制:
//unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000
//unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010//(2)双4拍控制方式
//AC互补,BD互补的方式进行控制:
//脉冲电平循环发送的方式控制:
unsigned char code F_Rotation[4]={0x09,0x03,0x06,0x0C}; //正转表格
unsigned char code B_Rotation[4]={0x0C,0x06,0x03,0x09}; //反转表格(3)8拍控制方式
正转的步进次序如下:AB组 → BC组 → CD组 → DA组(每个脉冲使电机正转5.625/64度)。
反转的步进次序如下:AB组 → AD组 → CD组 → CB组(每个脉冲使电机正转5.625/64度)。
//unsigned char code F_Rotation[4]={0x03,0x06,0x0c, 0x09}; //正转表格
//unsigned char code B_Rotation[4]={0x03,0x09,0x0c,0x06};//反转表格/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
void main(void)
{unsigned char i;while(1){for(i=0;i<4;i++)      //4相{P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大}}
}

(3)八拍代码

//main.c文件#include "includes.h"/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{while(us--){}
}/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{while(Ms--){delay_us(100);}
}/*------------------------------------------------延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{while(--cnt);
}(1)单4拍控制方式
脉冲电平循环发送的方式控制:
//unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10}; //正转表格,换算成二进制 0000 0010,0000 0100,0000 1000,0001 0000
//unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02}; //反转表格,换算成二进制 0001 0000,0000 1000,0000 0100,0000 0010(2)双4拍控制方式
AC互补,BD互补的方式进行控制:
脉冲电平循环发送的方式控制:
//unsigned char code F_Rotation[4]={0x09,0x03,0x06,0x0C}; //正转表格
//unsigned char code B_Rotation[4]={0x0C,0x06,0x03,0x09}; //反转表格//(3)8拍控制方式
//正转的步进次序如下:AB组 → BC组 → CD组 → DA组(每个脉冲使电机正转5.625/64度)。
//反转的步进次序如下:AB组 → AD组 → CD组 → CB组(每个脉冲使电机正转5.625/64度)。
unsigned char code F_Rotation[4]={0x03,0x06,0x0c, 0x09}; //正转表格
unsigned char code B_Rotation[4]={0x03,0x09,0x0c,0x06};//反转表格/******************************************************************/
/*                   主函数                                       */
/******************************************************************/
void main(void)
{unsigned char i;while(1){for(i=0;i<4;i++)      //4相{P1=F_Rotation[i];  //输出对应的相 可以自行换成反转表格delay(500);        //改变这个参数可以调整电机转速 ,数字越小,转速越大}}
}

4 步进电机市场价值

步进电机在市场上具有广泛的应用和价值。以下是步进电机在市场上的一些主要价值:

  1. 精准定位和控制:步进电机能够以精确的步距角度旋转,使其在许多应用中成为精确定位和控制的理想选择。例如,打印机、CNC机床、精密仪器等领域需要精准位置控制的设备都广泛采用步进电机。
  2. 高可靠性和低噪音:步进电机由于其简单的结构和无刷设计,具有较高的可靠性和寿命。此外,步进电机的运行通常非常平稳,产生的噪音较低,使其在要求低噪音操作的应用中得到广泛应用,如医疗设备、摄影器材等。
  3. 高扭矩和低速控制:步进电机通常具有较高的静态和动态扭矩输出能力,使其适用于需要较大输出力矩和低速控制的应用,例如自动门、机器人关节等。
  4. 成本效益:步进电机相对于其他类型的电机来说,通常具有较低的成本。这使得步进电机成为许多消费电子产品、家用电器和工业自动化设备中的经济选择。
  5. 可编程性和灵活性:步进电机可以通过调整驱动信号的频率和顺序来实现不同的运动模式和速度控制。这种可编程性和灵活性使得步进电机适用于各种应用,从简单的开关控制到复杂的运动序列控制。
    综上所述,步进电机在市场上具有重要的价值,其广泛应用于许多领域,包括工业自动化、电子设备、医疗器械、汽车、航空航天等,推动了步进电机市场的增长和发展。

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

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

相关文章

使用约束布局该如何设置哪个视图(UILabel)的内容优先被压缩?

引言 在实际项目开发中&#xff0c;约束布局给我们带来了很大的便利&#xff0c;可以帮助我们创建灵活且响应迅速的用户界面。通常情况下&#xff0c;它都能很好地工作&#xff0c;但在一些包含许多UILabel的场景中&#xff0c;比如会话列表的UI&#xff0c;哪个视图会被优先压…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

2024论文精读:利用大语言模型(GPT)增强上下文学习去做关系抽取任务

文章目录 1. 前置知识2. 文章通过什么来引出他要解决的问题3. 作者通过什么提出RE任务存在上面所提出的那几个问题3.1 问题一&#xff1a;ICL检索到的**示范**中实体个关系的相关性很低。3.2 问题二&#xff1a;示范中缺乏解释输入-标签映射导致ICL效果不佳。 4. 作者为了解决上…

【Git】(基础篇七)—— IntelliJIDEA集成Git

InteliJ IDEA集成Git 现在有很多的集成工具帮助我们写代码&#xff0c;使用这些工具可以帮助我们加速写代码&#xff0c;很多工具也可以集成git&#xff0c;使用图形工具管理git&#xff0c;相信了解了底层运行逻辑的你能够很快地上手使用这些工具&#xff0c;本文以InteliJ I…

7 Vue3

相比 Vue2 1. 优点 vue3支持vue2的大多数特性&#xff0c;实现对vue2的兼容vue3对比vue2具有明显的性能提升 打包大小减少41%初次渲染快55%&#xff0c;更新快133%内存使用减少54% 更好的支持TypeScript使用Proxy代替defineProperty实现响应式数据 2. 性能提升的原因 静态标…

jmeter-beanshell学习11-从文件获取指定数据

参数文件里的参数可能过段时间就不能用了&#xff0c;需要用新的参数。如果有多个交易&#xff0c;读不同的参数文件&#xff0c;但是数据还是一套&#xff0c;就要改多个参数文件。或者只想执行参数文件的某一行数据&#xff0c;又不想调整参数文件顺序。 第一个问题目前想到…

Ant Design Vue中日期选择器快捷选择 presets 用法

ant写文档的纯懒狗 返回的是一个day.js对象 范围选择时可接受一个数组 具体参考 操作 Day.js 话不多说 直接上代码 <a-range-pickerv-model:value"formData.datePick"valueFormat"YYYY-MM-DD HH:mm:ss"showTime:presets"presets"change&quo…

(前缀和) LeetCode 238. 除自身以外数组的乘积

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

WebRTC通话原理(SDP、STUN、 TURN、 信令服务器)

文章目录 1.媒体协商SDP简介 2.网络协商STUN的工作原理TURN工作原理 3.信令服务器信令服务器的主要功能信令服务器的实现方式 1.媒体协商 比如下面这个例子 A端与B端要想通信 A端视频采用VP8做解码&#xff0c;然后发送给B端&#xff0c;B端怎么解码&#xff1f; B端视频采用…

【论文共读】【翻译】ShuffleNet v1:一种用于移动设备的极其高效的卷积神经网络

[原文地址] https://arxiv.org/pdf/1707.01083 [翻译] 0. 摘要 我们介绍了一种计算效率极高的CNN架构&#xff0c;称为ShuffleNet&#xff0c;该架构专为计算能力非常有限的移动设备&#xff08;例如&#xff0c;10-150 MFLOPs&#xff09;而设计。新架构利用了两个新操作&am…

Ubuntu 22.04.4 LTS (linux) Tomcat 下载 安装配置详细教程

1 官网下载 下载链接 2 ubuntu 服务器安装 #下载 wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.91/bin/apache-tomcat-9.0.91.tar.gz #解压 tar zxvf apache-tomcat-9.0.91.tar.gz sudo mv apache-tomcat-9.0.91/ /data/tomcat #配置环境变量 sudo vi /etc/profil…

WebGoC题解(13) 狐猬编程:GoC L4 结业测试 第4题 找木柴

题目描述 小明今天找了n跟木柴&#xff0c;但是木柴太多了&#xff0c;小明只能拿走m根木柴&#xff0c;小明希望拿走的木柴都是剩下的木柴中最长的&#xff0c;小明还画出以下图形 例如 输入 5 3 10 20 30 40 50 小明要拿走30 40 50 这3根木柴 从大到小画出以下图形 矩形的宽…

linux cpu 占用超100% 分析。

感谢: https://www.cnblogs.com/wolfstark/p/16450131.html 总结&#xff1a; 查看进程中各个线程占用百分比 top -H -p <pid> 某线程100%了 说明 任务处理不过来 会卡 但是永远不可能超100% 系统监视器里面看到的是 所有线程占用的 总和会超100%。 所以最好的情况是&…

MATLAB基础:字符串、元胞数组

今天我们继续学习MATLAB中的字符串、元胞和结构 字符串 由于MATLAB是面向矩阵的&#xff0c;所以字符串的处理可以用矩阵的形式实现 字符串的赋值与引用 假设变量a&#xff0c;将用单引号引起来的字符串赋值给它&#xff0c; a清心明目, b(a[4;-1;1]) 在这里&#xff0c;…

如何检查我的网站是否支持HTTPS

HTTPS是一种用于安全通信的协议&#xff0c;是HTTP的安全版本。HTTPS的主要作用在于为互联网上的数据传输提供安全性和隐私保护。通常是需要在网站安装部署SSL证书来实现网络数据加密传输&#xff0c;安全加密功能。 那么如果要检查你的网站是否支持HTTPS&#xff0c;可以看下…

云计算实训11——web服务器的搭建、nfs服务器的搭建、备份静态文件、基于linux和windows实现文件共享

一、搭建web服务器 1.关闭firewall和selinux 关闭防火墙 systemctl stop firewalld systemctl disable firewalld 停用selinux setenforce 0 配置文件中让sellinux不再启动 vim /etc/selinux/config SELINUXpermissive 2.编辑dns配置文件 vim /etc/resolv.conf nameserver 114.…

Go基础编程 - 11 - 函数(func)

接口&#xff08;interface&#xff09; 函数1. 函数定义1.1. 函数名1.2. 参数列表1.3. 返回值列表 2. 匿名函数3. 闭包、递归3.1 闭包3.1.1 函数、引用环境3.1.2 闭包的延迟绑定3.1.3 goroutine 的延迟绑定 3.2 递归函数 4. 延迟调用&#xff08;defer&#xff09;4.1 defer特…

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

微软蓝屏事件:网络安全与系统稳定性的反思与前瞻

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

javascript 的执行上下文与作用域

目录 1. 初步了解 上下文&#xff08;context&#xff09;2. 全局上下文(global context)3. 上下文栈 (context stack)4. 作用域链( scope chain)5. 作用域(scope)6. 作用域链增强7. 变量声明7.1 var 声明变量7.2 let 声明变量7.3 const 常量声明 1. 初步了解 上下文&#xff0…