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

PLL 的 verilog 实现

  锁相环(PLL)是一种常用的频率、相位追踪算法,在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍,随后给出 verilog 实现及仿真。

PLL 锁相原理

  锁相环结构如下图所示,主要由鉴相器、环路滤波器、压控振荡器等构成

在这里插入图片描述

其中鉴相器是一个乘法器,设参考信号 u i u_i ui 、本地信号 u o u_o uo 均为正弦信号
u i ( t ) = c o s ( ω 1 t + φ 1 ) u_i(t)=cos(\omega_1 t+\varphi_1) ui(t)=cos(ω1t+φ1)

u o ( t ) = c o s ( ω 2 t + φ 2 ) u_o(t)=cos(\omega_2 t+\varphi_2) uo(t)=cos(ω2t+φ2)

  根据积化和差公式, u i u_i ui u o u_o uo 的乘积将包含 ω 1 + ω 2 \omega_1+\omega_2 ω1+ω2 ω 1 − ω 2 \omega_1-\omega_2 ω1ω2 两个频率分量,经过 LF 低通滤波后,将仅剩两者的差频信号
u c = c o s [ ( ω 1 − ω 2 ) t + ( φ 1 − φ 2 ) ] = c o s [ 2 π ( f 1 − f 2 ) t + ( φ 1 − φ 2 ) ] \begin{aligned} u_c&=cos[(\omega_1-\omega_2)t+(\varphi_1-\varphi_2)]\\ &=cos[2\pi(f_1-f_2)t+(\varphi_1-\varphi_2)] \end{aligned} uc=cos[(ω1ω2)t+(φ1φ2)]=cos[2π(f1f2)t+(φ1φ2)]
使用 f 2 = f 0 + K 0 u c f_2=f_0+K_0 u_c f2=f0+K0uc 控制压控振荡器(数字式的一般用 DDS 技术生成)的频率,即可完成锁相。

  假设输入信号相对于基准频率 f 0 f_0 f0 存在 Δ f \Delta f Δf 的频率偏差,则完成锁相后两信号将具有固定的相位偏差 Δ φ \Delta \varphi Δφ,关系如下
Δ f = K 0 c o s ( Δ φ ) \Delta f=K_0cos(\Delta \varphi) Δf=K0cos(Δφ)
当然也应当注意到这里的 Δ φ \Delta \varphi Δφ 符号无法被确定。

verilog 实现

  PLL 模块主程序如下

/* * file			: ADPLL.v* author		: 今朝无言* lab		    : WHU-EIS-LMSWE* date			: 2023-08-03* version		: v1.0* description	: 锁相环* Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.*/
module ADPLL(
input						clk,
input						rst_n,input		signed	[15:0]	A,		//参考信号
input		signed	[15:0]	B,		//本地信号output		signed	[15:0]	df		//频偏
);parameter	CLK_FREQ	= 1_000_000;	//采样频率reg signed	[15:0]	df	= 16'd0;//-----------------------multi---------------------------------
reg	signed	[31:0]	multi	= 32'd0;always @(posedge clk) beginif(~rst_n) beginmulti	<= 32'd0;endelse beginmulti	<= A*B;end
end//------------------------FIR---------------------------------
wire	signed	[15:0]	multi_filt  [1:3];localparam	FIR_N = 20;	//FIR阶数wire	[16*(FIR_N+1)-1:0]	FIR_params;FIR_params_0d1 FIR_params_inst(.params		(FIR_params)
);wire    clk_div10;
wire    clk_div100;clkdiv #(.N(10)) clkdiv10(.clk_in     (clk),.clk_out    (clk_div10)
);clkdiv #(.N(100)) clkdiv100(.clk_in     (clk),.clk_out    (clk_div100)
);//低通滤波						多级低通滤波,中间穿插下采样
FIR_filter #(.N(FIR_N + 1))
FIR_filter_inst1(.clk			(clk),.rst_n			(rst_n),.filter_params	(FIR_params),.data_in		(multi[31:16]),.data_out		(multi_filt[1])
);//低通滤波
FIR_filter #(.N(FIR_N + 1))
FIR_filter_inst2(.clk			(clk_div10),.rst_n			(rst_n),.filter_params	(FIR_params),.data_in		(multi_filt[1]),.data_out		(multi_filt[2])
);//低通滤波
FIR_filter #(.N(FIR_N + 1))
FIR_filter_inst3(.clk			(clk_div100),.rst_n			(rst_n),.filter_params	(FIR_params),.data_in		(multi_filt[2]),.data_out		(multi_filt[3])
);//---------------------control---------------------------------
always @(posedge clk_div100) begindf	<= multi_filt[3];		//  df=K*multi_filt,此处省略鉴相灵敏度K,外部请自行设置合理的K值s
endendmodule

  低通滤波器及其参数代码如下

/* * file         : FIR_filter.v* author       : 今朝无言* lab		    : WHU-EIS-LMSWE* date		    : 2023-07-03* version      : v1.0* description  : FIR 滤波器*/
module FIR_filter(
input							clk,
input							rst_n,input				[16*N-1:0]	filter_params,input		signed	[15:0]		data_in,
output	reg	signed	[15:0]		data_out
);parameter	N		= 32;	//滤波器参数个数
parameter	div_N	= 16;	//sum结果除 2^div_N,作为 filter 的输出//FIR 滤波器参数
reg	signed	[15:0] b[0:N-1];integer	m;
always @(*) beginfor(m=0; m<N; m=m+1) beginb[m]	<= filter_params[(m << 4) +: 16];end
endreg	signed	[15:0]	shift_reg[0:N-1];integer	i;
always @(posedge clk) beginif(~rst_n) beginfor(i=N-1; i>=0; i=i-1) beginshift_reg[i]	<= 16'd0;endendelse beginfor(i=N-1; i>0; i=i-1) beginshift_reg[i]	<= shift_reg[i-1];endshift_reg[0]		<= data_in;end
endreg		signed	[31:0]	multi[0:N-1];integer	j;
always @(*) beginfor(j=0; j<N; j=j+1) beginmulti[j]	<= shift_reg[j] * b[j];//这里可以考虑使用multiplier IP核,使用LUT搭建(而这里直接乘使用的是DSP资源,一般的FPGA芯片只有几百个)end
endreg		signed	[47:0]	sum;integer	k;
always @(*) beginsum		= 0;for(k=0; k<N; k=k+1) beginsum	= sum + multi[k];end
endalways @(posedge clk) begindata_out	<= sum[47-div_N : 32-div_N];
endendmodule
/* * file			: FIR_params.v* author		: 今朝无言* lab			: WHU-EIS-LMSWE* date			: 2023-08-04* version		: v1.0* description	: FIR 滤波器    lowpass   N=20   fc=0.1 fs*/
module FIR_params_0d1(
output	[335:0]	params
);assign	params[15:0]	= 16'h0000;
assign	params[31:16]	= 16'h0057;
assign	params[47:32]	= 16'h0131;
assign	params[63:48]	= 16'h0302;
assign	params[79:64]	= 16'h0616;
assign	params[95:80]	= 16'h0A6D;
assign	params[111:96]	= 16'h0FA8;
assign	params[127:112]	= 16'h1518;
assign	params[143:128]	= 16'h19E1;
assign	params[159:144]	= 16'h1D28;
assign	params[175:160]	= 16'h1E53;
assign	params[191:176]	= 16'h1D28;
assign	params[207:192]	= 16'h19E1;
assign	params[223:208]	= 16'h1518;
assign	params[239:224]	= 16'h0FA8;
assign	params[255:240]	= 16'h0A6D;
assign	params[271:256]	= 16'h0616;
assign	params[287:272]	= 16'h0302;
assign	params[303:288]	= 16'h0131;
assign	params[319:304]	= 16'h0057;
assign	params[335:320]	= 16'h0000;endmodule

关于 FIR 滤波器这部分可以参考我之前的博文。

仿真

  仿真测试代码如下

`timescale 100ns/1nsmodule PLL_tb();reg		clk_1M	= 1'b1;
always #5 beginclk_1M	<= ~clk_1M;
endreg		rst_n	= 1'b1;//---------------------参考信号A-------------------------------
wire			[15:0]	A_out_tmp;
wire	signed	[15:0]	A_out;		//参考信号localparam	f0	= 24'd10_000;
localparam	df	= -24'd9;		//频率偏差DDS #(.Freq(1_000_000)
)
DDS_inst1(.clk		(clk_1M),.rst_n		(rst_n),.fout		(f0+df),.phase0		(16'd0),.sin_out	(A_out_tmp)
);assign	A_out	= A_out_tmp - 16'd32768;//---------------------本地信号B-------------------------------
wire			[15:0]	B_out_tmp;
wire	signed	[15:0]	B_out;wire	signed	[23:0]	df2;		//控制本地信号的频偏DDS #(.Freq		(1_000_000)
)
DDS_inst2(.clk		(clk_1M),.rst_n		(rst_n),.fout		(f0+df2),.phase0		(16'd0),.sin_out	(B_out_tmp)
);assign	B_out	= B_out_tmp - 16'd32768;//-----------------------PLL---------------------------------
wire	signed	[15:0]	df_PLL;ADPLL #(.Freq		(1_000_000)
)
PLL_inst(.clk		(clk_1M),.rst_n		(rst_n),.A			(A_out),		//参考信号.B			(B_out),		//本地信号.df			(df_PLL)		//频偏
);assign	df2	= df_PLL/64;//-----------------------tb---------------------------------
initial beginrst_n	<= 1'b0;#5000;rst_n	<= 1'b1;#100;#1000000;$stop;
endendmodule

  DDS 代码如下

/* * file			: DDS.v* author		: 今朝无言* Lab			: WHU-EIS-LMSWE* date			: 2023-05-17* version		: v1.0* description	: 根据给定频率输出正弦信号* Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.*/
module DDS(
input			clk,
input			rst_n,input	[23:0]	fout,		//输出正弦波的频率  1k-10M 要24位
input	[15:0]	phase0,		//初相output	[15:0]	sin_out
);parameter	Freq	= 100_000_000;		//clk频率,Hz//-----------------相位累加器-----------------------
reg		[47:0]	int_f_16	= 48'd0;	//相位累加器,x-16定点数
wire	[55:0]	dphi_16;				//相位步进//dphi*Freq=fout*T, T=65536
assign	dphi_16	= (fout << 32)/Freq;always @(posedge clk or negedge rst_n) beginif(~rst_n) beginint_f_16	<= 48'd0;endelse beginint_f_16	<= int_f_16 + dphi_16;end
end//-----------------正弦查找表-----------------------
wire	[15:0]	phase;sin_gen sin_gen_inst(.clk		(clk),.phase		(phase),		//相位.sin_out	(sin_out)
);assign phase	= phase0 + (int_f_16 >> 16);endmodule

相应的正弦查找表如下(该模块使用线性插值的方法,在仅少量增加资源消耗的情况下,将量化误差缩小了两个数量级;这部分也可详见我之前的博文)

/* * file			: sin_gen.v* author		: 今朝无言* Lab			: WHU-EIS-LMSWE* date			: 2023-05-17* version		: v1.0* description	: 根据给定相位输出正弦信号* Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.*/
module sin_gen(
input			clk,input	[15:0]	phase,		//相位,0~65535对应[0~2pi)
output	[15:0]	sin_out
);//---------------------正弦查找表-------------------------
wire	[7:0]	addr1;
wire	[7:0]	addr2;
wire	[15:0]	sin_dat1;
wire	[15:0]	sin_dat2;//sin rom, 16bit, 256 depth
sin_rom sin_rom_inst1(.clka	(clk),.addra	(addr1),.douta	(sin_dat1)
);sin_rom sin_rom_inst2(.clka	(clk),.addra	(addr2),.douta	(sin_dat2)
);//-----------线性插值获取更精确的相位分辨率-------------------
assign	addr1	= (phase>>8);
assign	addr2	= (phase>>8)+1;wire	[15:0]	phase1;
wire	[15:0]	phase2;assign	phase1	= addr1<<8;
assign	phase2	= addr2<<8;reg		[15:0]	phase_d0;
reg		[15:0]	phase_d1;	//由于rom数据2拍后才给出,因此phase需要与之同步
reg		[15:0]	phase1_d0;
reg		[15:0]	phase1_d1;always @(posedge clk) beginphase_d0	<= phase;phase_d1	<= phase_d0;phase1_d0	<= phase1;phase1_d1	<= phase1_d0;
endwire	[31:0]	multi;
assign	multi	= (sin_dat2 > sin_dat1)? (sin_dat2 - sin_dat1)*(phase_d1 - phase1_d1) : (sin_dat1 - sin_dat2)*(phase_d1 - phase1_d1);assign	sin_out	= (sin_dat2 > sin_dat1)? sin_dat1 + (multi >> 8) : sin_dat1 - (multi >> 8);endmodule

  仿真结果如下

在这里插入图片描述

相关文章:

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…...

【Hystrix技术指南】(1)基本使用和配置说明

这世间许多事物皆因相信而存在&#xff0c;所以人们亲手捏出了泥菩萨&#xff0c;却选择坚定的去信仰它。 分布式系统的规模和复杂度不断增加&#xff0c;随着而来的是对分布式系统可用性的要求越来越高。在各种高可用设计模式中&#xff0c;【熔断、隔离、降级、限流】是经常被…...

Oracle EBS OM客制化调用API创建销售订单非常慢(FND_FLEX_HASH死锁)

业务场景 由于Oracle EBS标准功的公司间关联交易操作涉及业务节点环节多,需要多个业务部门参考操作完成,浪费人力和花费时间。随着国内集团公司通过业务整合优化,大幅度减少间中很多环节的人为操作,如国内公司间贸易通过类似于客制化出货单申请方式,跨国公司间贸易通过类似…...

【leetcode】394. 字符串解码

题目链接&#xff1a;力扣 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b;输入字符串中没…...

系统架构设计高级技能 · 系统质量属性与架构评估(二)【系统架构设计师】

系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA&#xff08;一&#xff09;【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估&#xff08;二&#xff09;【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...

魅族Pandaer手机壳

Pandaer的设计真是非常好看啊&#xff01;像是手机壳的花样就特别多&#xff0c;还分出来很多系列&#xff0c;我比较喜欢它的亮面设计&#xff0c;入手了一款iPhone的&#xff0c;花色叫做“失控街头”&#xff0c;壳内部也是亮的&#xff0c;看起来特别浮夸&#xff0c;潮里潮…...

F5洞察2023年网络威胁,助力网络安全防护

2023已经过半&#xff0c;关于网络安全防护的相关讨论话题热度始终居高不下。对于网络安全领域的从业者来说&#xff0c;应当对相关的前瞻分析有所了解。前段时间&#xff0c;我阅读了F5 安全运营中心工程师对威胁网络安全的预测&#xff0c;深受启发&#xff0c;故此选取了几则…...

从零构建深度学习推理框架-4 框架中的算子注册机制

今天要讲的这一注册机制用到了设计模式中的工厂模式和单例模式&#xff0c;所以这节课也是对两大设计模式的一个合理应用和实践。KuiperInfer的注册表是一个map数据结构&#xff0c;维护了一组键值对&#xff0c;key是对应的OpType&#xff0c;用来查找对应的value&#xff0c;…...

使用vscode+ssh免密远程Linux

使用vscodessh免密远程Linux 使用 SSH 密钥对&#xff1a;使用 SSH Agent&#xff1a;ssh-agent的使用场景 使用 SSH 密钥对&#xff1a; 确保你的本地机器上已经生成了 SSH 密钥对。如果没有&#xff0c;请使用以下命令生成密钥对&#xff1a; ssh-keygen -t rsa这将在 ~/.ssh…...

rust-异步学习

rust获取future中的结果 两种主要的方法使用 async: async fn 和 async 块 async 体以及其他 future 类型是惰性的&#xff1a;除非它们运行起来&#xff0c;否则它们什么都不做。 运行 Future 最常见的方法是 .await 它。 当 .await 在 Future 上调用时&#xff0c;它会尝试把…...

【Azure】office365邮箱测试的邮箱账号因频繁连接邮箱服务器而被限制连接 引起邮箱显示异常

azure微软office365邮箱会对频繁连接自身邮箱服务器的IP地址进行&#xff0c;连接邮箱服务器IP限制&#xff0c;也就是黑名单&#xff0c;释放时间不确定&#xff0c;但至少一天及以上。 解决办法&#xff0c;换一个IP&#xff0c;或者新注册一个office365邮箱再重试。 以下是…...

重新登录成功和登录失败处理器

<template><div class="login"><el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"><h3 class="title">Java1234 Vue3 后台管理系统</h3><el…...

【Spring】(三)Spring 使用注解存储和读取 Bean对象

文章目录 前言一、使用注解储存 Bean 对象1.1 配置扫描路径1.2 类注解储存 Bean 对象1.2.1 Controller&#xff08;控制器存储&#xff09;1.2.2 Service&#xff08;服务储存&#xff09;1.2.3 Repository&#xff08;仓库存储&#xff09;1.2.4 Component&#xff08;组件储存…...

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中&#xff0c;具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…...

---------------- 部署 Zookeeper 集群 ----------------

部署 Zookeeper 集群 1.安装前准备2.安装 Zookeeper修改配置文件在每个节点上创建数据目录和日志目录在每个节点的dataDir指定的目录下创建一个 myid 的文件配置 Zookeeper 启动脚本 //准备 3 台服务器做 Zookeeper 集群 192.168.109.1 192.168.109.2 192.168.109.3 1.安装前准…...

SpringBoot 依赖管理和自动配置---带你了解什么是版本仲裁

&#x1f600;前言 本篇博文是关于SpringBoot 依赖管理和自动配置&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…...

c语言每日一练(2)

前言&#xff1a; 每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…...

代码随想录第三十七天

代码随想录第三十七天 Leetcode 738. 单调递增的数字 Leetcode 738. 单调递增的数字 题目链接: 单调递增的数字 自己的思路:完全想不到&#xff01;&#xff01; 正确思路:大致思路是从后向前遍历&#xff0c;不可以从前向后&#xff0c;如果从前向后没有保证单调递增的顺序&…...

Linux进程间通信--ftok

在C语言中&#xff0c;ftok函数用于生成一个唯一的键值&#xff0c;该键值通常用于创建共享内存&#xff0c;消息队列和信号量等系统资源的标识符。 ftok函数原型入下&#xff1a; key_t ftok(const char *pathname, int proj_id); 参数说明&#xff1a; pathname&#xff1a…...

Spring Boot集成Mybatis-Plus

Spring Boot集成Mybatis-Plus 1. pom.xml导包 <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql<…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【Java学习笔记】BigInteger 和 BigDecimal 类

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

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...