【STM32CubeMX】基于ADC反馈与DAC输出的PID闭环电压调节实战

news2026/3/19 0:50:44
1. 从零开始为什么我们需要一个“聪明”的电压调节系统大家好我是老张一个在嵌入式领域摸爬滚打了十多年的工程师。今天我想和大家聊聊一个非常经典且实用的实战项目用STM32做一个能自己“思考”和“调整”的电压源。听起来是不是有点意思你可能会有疑问调个电压而已我用个电位器手动拧或者直接用DAC输出一个固定值不就行了吗干嘛搞得这么复杂这个问题问得好也是我当年入门时的第一个困惑。让我用一个生活中的例子来解释。想象一下你家里的热水器你希望洗澡水稳定在40度。如果热水器没有温控系统你只能手动调节燃气阀门。当你打开冷水龙头时水流变化会导致水温骤降你得赶紧去调大火力过一会儿水压稳定了水又太烫你又得去调小。整个过程你手忙脚乱水温忽高忽低洗澡体验极差。这就是“开环”控制——你控制器发出一个指令开多大火力但结果实际水温受各种因素水压、气温影响无法保证稳定。现在我们给热水器加一个温度传感器和一套智能算法。传感器实时测量出水温度这就是ADC反馈智能算法比较设定温度40度和实际温度发现低了就自动加大火力发现高了就自动减小火力这就是DAC输出的调整。很快无论水压怎么变出水温度都能稳稳地保持在40度附近。这就是“闭环”控制而其中那个最经典、最有效的智能算法就是我们今天的主角——PID算法。回到我们的STM32项目。我们的目标是用STM32的DAC输出一个精确的电压比如1.65V。理想情况下你写一个固定值给DAC它就应该输出1.65V。但现实很骨感芯片内部的基准电压有微小偏差、外部负载变化、电路板上的噪声、甚至环境温度漂移都会导致你实际用万用表测到的电压不是1.65V可能是1.62V也可能是1.68V。对于电源、信号发生、精密传感等应用这种误差是不可接受的。所以我们需要构建一个闭环系统用一路ADC去实时采集DAC的实际输出电压这就是反馈用PID算法计算当前输出与目标1.65V的差距并动态调整发给DAC的数值最终让实际电压无限逼近目标值。这个过程快速、自动且抗干扰。而STM32CubeMX这个图形化工具能让我们像搭积木一样快速配置好ADC、DAC、DMA这些硬件外设把精力集中在核心的PID算法调试上。接下来我就手把手带你完成这个“让电压听话”的完整实战。2. 硬件闭环的基石STM32CubeMX工程配置详解工欲善其事必先利其器。在写代码之前我们用STM32CubeMX把硬件底子打好。这里我以最经典的STM32F103C8T6蓝色小药丸板为例其他F1、F4系列芯片配置大同小异。打开CubeMX新建工程选择你的芯片型号。2.1 时钟树配置给系统一颗强劲的“心脏”配置任何外设前先要把时钟配好这是很多新手容易忽略却至关重要的一步。在“Clock Configuration”标签页我们的目标是让系统主频跑到该芯片的最高性能。对于STM32F103通常选择外部高速晶振HSE作为时钟源然后经过PLL倍频将系统时钟SYSCLK设置为72MHz。ADC和DAC的时钟APB2也尽量高一些但要注意不能超过其手册规定的最大值通常14MHz。一个稳定的高速时钟是整个系统快速响应的基础。配置完后记得在“Project Manager”里把“HSE”和“LSE”都选为“Crystal/Ceramic Resonator”。2.2 ADC与DMA配置打造连续不断的“数据流水线”我们的ADC需要不间断地采集DAC输出的电压如果每次采集都让CPU来搬运数据CPU就别干其他事了。所以我们必须请出**DMA直接存储器访问**这位“数据传输专员”。启用ADC1在“Analog”下找到“ADC1”。我们选择通道0PA0作为输入引脚。当然你可以选其他通道记得后续硬件连接要对应。关键参数设置Scan Conversion Mode: 设置为Enabled。因为我们虽然只用一个通道但配合DMA循环模式需要启用扫描模式。Continuous Conversion Mode: 设置为Enabled。这就是“连续转换模式”ADC会一刻不停地工作。DMA Continuous Requests: 设置为Enabled。保证DMA请求也是连续的与ADC转换同步。End Of Conversion Selection: 设置为EOC flag at the end of single conversion。Number Of Conversion: 设为1因为我们只转换1个通道。在“Rank”里设置Channel为ADC_CH0Sampling Time可以设为55.5 Cycles这是一个兼顾速度和精度的常用值。配置DMA切换到“DMA Settings”标签页点击“Add”。选择ADC1模式选择Circular循环模式。这样DMA会像一个环形缓冲区一样自动把ADC转换完成的数据搬运到我们指定的数组里搬完最后一个又回到开头永不停止。优先级可以设为High。2.3 DAC配置我们的“执行机构”DAC的配置相对简单。在“Analog”下找到“DAC”勾选“OUT1 Configuration”对应PA4引脚或“OUT2”对应PA5。将“Output Buffer”使能这样可以提高带负载能力。其他参数保持默认即可。DAC是12位精度的这意味着我们输出值的范围是0到4095对应0V到参考电压通常是3.3V。2.4 USART配置系统的“眼睛和嘴巴”调试PID离不开串口打印。我们启用USART1PA9为TXPA10为RX。模式选择Asynchronous异步通信。波特率设为115200数据位8停止位1无校验。这样我们就可以通过printf函数将ADC采集到的电压值、PID计算过程等关键信息发送到电脑的串口助手上直观地观察系统运行状态。2.5 生成工程代码在“Project Manager”里给工程起个名字选择好IDEMDK-Keil或IAR在“Code Generator”里强烈建议勾选“Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral”。这会让每个外设的代码独立成文件结构非常清晰。最后点击“GENERATE CODE”让CubeMX为我们生成完整的初始化代码。至此硬件底层驱动就全部准备好了我们接下来要做的就是在它搭建好的舞台上编写PID算法这个“大脑”的逻辑。3. PID算法核心位置式PID的C语言实现与深度解析PID控制器之所以几十年经久不衰就是因为它结构简单效果却出奇地好。PID是比例P、积分I、微分D的合称。别被名字吓到我们可以用开车来类比。比例P就像你发现车子偏离车道中心线了偏离越多误差大你打方向盘的幅度就越大。它反应迅速立竿见影但单纯用P车子会在中心线附近来回摆动振荡永远停不到正中心静差。积分I它关注的是“历史遗留问题”。如果车子因为路面倾斜一直有一个微小的偏差P调节不过来I就会把这个小误差随时间累加起来累加到一定程度就足以让方向盘多打一点最终把车子拉回绝对中心消除静差。但I太强会导致系统反应迟钝超调严重。微分D它有“预见性”。它看的是误差变化的速度。当车子正在快速靠近中心线时D会提前反打一点方向盘防止车子冲过头。它能有效抑制振荡让系统更平稳。但对噪声非常敏感。我们的项目用的是位置式PID它的输出直接对应DAC应该输出的具体数值。下面我们来编写它的代码并深入理解每一个参数。3.1 PID数据结构定义首先创建一个pid.h头文件。一个好的数据结构能让代码清晰易懂。#ifndef __PID_H #define __PID_H #include main.h typedef struct { float Target; // 目标电压值比如1.65 float Measure; // 实际测量电压值ADC反馈值 float Err; // 当前误差 Target - Measure float Err_Last; // 上一次的误差 float Kp, Ki, Kd; // PID三个核心参数 float Integral; // 误差积分项累积历史误差 float Output; // PID计算出的最终输出值将直接给DAC } PID_TypeDef; void PID_Init(PID_TypeDef *pid); float PID_Calculate(PID_TypeDef *pid, float measure); #endif这里我特意把变量名取得更直观比如ActualVoltage改成了MeasureSetVoltage改成了Target。Integral积分项单独拿出来这是实现积分作用的关键。3.2 PID核心计算函数接下来是重头戏在pid.c中实现初始化与计算函数。#include pid.h #include stdio.h // 用于调试打印 // PID控制器初始化 void PID_Init(PID_TypeDef *pid) { if (pid NULL) return; pid-Target 0.0f; pid-Measure 0.0f; pid-Err 0.0f; pid-Err_Last 0.0f; pid-Integral 0.0f; pid-Output 0.0f; // 初始PID参数这是一个需要调试的起点 pid-Kp 0.5f; // 比例系数先给一个较小的值 pid-Ki 0.05f; // 积分系数初始值很小 pid-Kd 0.01f; // 微分系数初始值非常小 printf(PID Controller Initialized.\r\n); } // PID计算函数输入当前测量值返回控制输出值 float PID_Calculate(PID_TypeDef *pid, float measure) { if (pid NULL) return 0.0f; pid-Measure measure; // 更新测量值 pid-Err_Last pid-Err; // 保存旧误差 pid-Err pid-Target - pid-Measure; // 计算新误差 // 积分项累加同时加入抗积分饱和的简单处理 pid-Integral pid-Err; // 限制积分项防止积分 windup饱和 if (pid-Integral 100.0f) pid-Integral 100.0f; if (pid-Integral -100.0f) pid-Integral -100.0f; // 经典位置式PID公式 pid-Output (pid-Kp * pid-Err) (pid-Ki * pid-Integral) (pid-Kd * (pid-Err - pid-Err_Last)); // 对最终输出值进行限幅确保在DAC的有效输入范围内0-4095对应0-3.3V if (pid-Output 4095.0f) pid-Output 4095.0f; if (pid-Output 0.0f) pid-Output 0.0f; return pid-Output; }这段代码有几个实战要点积分抗饱和if (pid-Integral 100.0f)...这行代码至关重要。当系统存在较大误差比如目标值突然设得极高积分项会疯狂累加导致输出巨大系统失控。这个限制保护了系统。输出限幅DAC只能接收0-4095的数字。PID计算出的输出值必须被限制在这个范围否则写入DAC寄存器会出错。变量更新顺序一定要先保存上一次误差Err_Last再计算新的Err。顺序错了微分项就完全不对了。3.3 在主循环中调用PID现在我们把PID融入到main.c的主循环中形成完整的闭环。// 在文件顶部包含头文件和定义变量 #include pid.h PID_TypeDef myPID; // 声明一个PID实例 uint16_t adc_raw_value 0; // 存放ADC原始值 float actual_voltage 0.0f; // 计算出的实际电压 uint16_t dac_output_value 2048; // DAC初始输出值对应约1.65V // 在main函数初始化部分启动ADC和DAC并初始化PID int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC1_Init(); MX_DAC_Init(); MX_USART1_UART_Init(); HAL_ADCEx_Calibration_Start(hadc1); // F1系列需要校准 HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_raw_value, 1); // 启动ADC DMA传输 HAL_DAC_Start(hdac, DAC_CHANNEL_1); // 启动DAC PID_Init(myPID); // 初始化PID myPID.Target 1.65f; // 设定目标电压为1.65V while (1) { // 1. 读取ADC值并转换为电压 (假设Vref3.3V, 12位ADC) actual_voltage (adc_raw_value * 3.3f) / 4096.0f; // 2. 将实际电压送入PID计算得到新的DAC输出值 dac_output_value (uint16_t)PID_Calculate(myPID, actual_voltage); // 3. 将PID的输出值写入DAC HAL_DAC_SetValue(hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_output_value); // 4. 通过串口打印信息方便调试 printf(Target:%.2fV, Measure:%.3fV, DAC_OUT:%d\r\n, myPID.Target, actual_voltage, dac_output_value); HAL_Delay(10); // 控制周期10ms一次。这个值非常关键 } }整个闭环流程就清晰了ADC采集 - 转换为电压 - PID计算误差并给出新指令 - DAC执行新指令 - 影响实际电压 - 下一周期ADC再次采集...如此循环往复形成一个自动调节的环路。4. 系统联调与PID参数整定从理论到稳定的实战代码写完了烧录进板子用一根杜邦线把DAC的输出引脚PA4和ADC的输入引脚PA0连接起来同时接上串口线。打开串口助手你可能会看到电压值在跳动但很可能不是稳定的1.65V。别急这才是乐趣的开始——PID参数整定。这是将理论变为稳定系统的关键一步也是最需要经验和耐心的一步。4.1 调试前的准备工作首先确保你的硬件连接和软件配置无误。在串口助手上你应该能看到不断刷新的数据。如果数据全是0或者不动检查DMA是否配置正确ADC是否启动。如果电压值是一个完全不相关的固定值检查ADC和DAC的引脚配置和硬件连接。然后我们把目标电压myPID.Target先设为一个容易观察的值比如1.0V。同时暂时把Ki和Kd都设为0先调试纯比例控制P控制。4.2 比例系数Kp的调试寻找反应的“力度”将Kp从0.1开始慢慢增大。你会观察到Kp很小如0.1系统反应非常慢实际电压像蜗牛一样慢慢爬向1.0V最终稳定在一个比1.0V低不少的值这就是静差。这说明控制力度太弱。逐渐增大Kp到0.5 1.0反应速度变快静差减小。Kp过大如3.0系统开始“矫枉过正”。电压会快速冲过1.0V超调然后回落又低于1.0V再冲上去形成明显的、持续的振荡甚至发散。这说明控制力度太猛系统不稳定了。我们的目标是找到一个Kp让系统能较快响应且没有持续振荡允许有一点超调和静差。比如Kp1.5时电压可能快速上升到1.1V然后回落到0.95V最终在0.98V附近稳定下来。记住这个有静差的状态。4.3 积分系数Ki的调试消除顽固的“静差”现在引入积分给Ki一个很小的值比如0.01。积分的作用是消除静差。你会发现之前稳定在0.98V的电压开始非常缓慢地向1.0V移动最终精确地停在1.0V上。这就是积分在默默累加那个微小的误差并最终将其纠正。但是Ki是一把双刃剑Ki太小消除静差的速度太慢可能需要几十秒甚至几分钟。Ki太大积分作用过强。它会加剧系统的超调甚至引发新的振荡。你可能看到电压冲到1.2V然后跌到0.8V来回摆动好几次才能稳定。更糟糕的是它可能让系统变得不稳定。调试Ki时要非常小心一点点地加。通常Ki的值应该远小于Kp比如Kp的1/10到1/100。我们的目标是让系统在消除静差的同时不引入明显的超调或振荡。4.4 微分系数Kd的调试给系统装上“预见性”的阻尼当比例和积分调得差不多了系统能稳定到目标值但可能收敛过程有些“犹豫”或者有轻微振荡。这时就该微分D上场了。D能预测误差变化的趋势并施加一个反向的阻尼力。将Kd设置为一个很小的正数比如0.005。观察系统的响应如果系统收敛曲线变得更平滑超调量减小稳定时间缩短说明Kd起到了正面作用。如果系统变得反应迟钝或者出现高频抖动说明Kd太大了。微分项对噪声极其敏感ADC采集中的任何毛刺都会被D放大导致输出抖动。这也是很多实际系统中不用D只用PI控制器的原因。4.5 整定口诀与经验分享网上流传的“口诀法”在实际中很有参考价值“先调P后调I最后再加D”。只加P从小到大调到系统快速响应但出现临界振荡等幅振荡前。加入I从很小值开始增加直到系统静差被消除但要注意超调不能太大。加入D从很小值开始增加用于抑制超调使系统更平稳。在我的实际项目中对于STM32这种数字系统还有一个关键参数控制周期就是主循环里那个HAL_Delay(10)。它决定了PID多久运算一次。周期太短如1ms可能计算过于频繁系统响应不过来周期太长如100ms系统反应迟钝。一般根据被控对象的特性来选对于电压调节10ms到50ms是一个常见的范围。你可以尝试改变这个延时观察系统性能的变化。调试时一定要有耐心记录下不同参数下的曲线可以通过串口数据画图。我习惯用Kp1.2, Ki0.05, Kd0.008作为一个电压调节的起始调试点然后根据实际情况微调。当你能通过调整三个数字让电压曲线从“过山车”变成“平滑电梯”时那种成就感是无与伦比的。5. 进阶思考与避坑指南做到上面那一步一个基本的PID电压调节器已经成功了。但如果你想做得更稳健、更专业下面这些我踩过的“坑”和经验之谈或许对你有帮助。5.1 量化与标度变换让算法脱离具体硬件我们之前的代码里PID计算直接操作电压值1.65V输出直接是DAC的数值0-4095。这耦合度太高了。更好的做法是进行标度变换让PID算法运行在一个“标准化”的领域。例如我们可以定义PID内部处理的是“相对量”。设定目标值Target为100.0代表100%测量值Measure也按比例折算到0-100。PID计算出的Output也是一个0-100的相对量。最后在写入DAC前再将这个相对量映射到0-4095。这样做的好处是PID参数Kp Ki Kd变得更有通用性即使你换了一个基准电压是5V的DAC也只需要修改最后的映射关系而不需要重新整定PID参数。5.2 应对现实世界的噪声滤波的重要性理想很丰满现实很骨感。你的ADC采集到的值不可能是绝对稳定的总会夹杂着电路噪声。这些高频噪声会被PID尤其是微分项D疯狂放大导致DAC输出抖动。软件滤波是必须的。最简单的是一阶低通滤波也叫惯性滤波。在读取adc_raw_value后不要直接用于计算而是这样处理float filtered_voltage 0.0f; float a 0.1f; // 滤波系数0a1越小滤波越强响应越慢 filtered_voltage a * actual_voltage (1-a) * filtered_voltage; // 本次实际值占10%历史滤波值占90%然后再把filtered_voltage送入PID_Calculate函数。这个简单的改动能极大提升系统的稳定性和抗干扰能力。你可以根据噪声情况调整系数a。5.3 积分饱和与变积分算法前面我们用了简单的积分限幅来抗饱和。但在一些高级应用中还可以采用“变积分”算法。其思想是当误差很大时取消积分作用防止积分项累积过大只有当误差进入一个较小范围时才开启积分用于消除静差。这能进一步提升系统的动态性能。5.4 从电压到万物PID的通用性今天我们用PID调节电压明天你就可以用它调节电机的转速、四轴飞行器的角度、恒温箱的温度、甚至化工反应的pH值。其核心思想万变不离其宗测量反馈、计算误差、动态调整。STM32CubeMXADCDACPID这个组合为你打开了一扇通往自动控制世界的大门。当你真正理解并调通一个PID回路后再看那些复杂的工业控制器你会发现它们的内核依然是这个朴实而强大的算法。最后硬件上记得给ADC的输入引脚加上一个小的滤波电容比如0.1uF可以有效滤除高频噪声。调试时万用表永远是验证最终结果的好帮手不要完全依赖串口打印的数值。多动手多观察多思考享受从软件到硬件、从算法到系统完整打通的乐趣吧。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…