基于立创·天猛星MSPM0G3507开发板的电机PID控制实战:编码器测速、定距与曲线显示

news2026/3/14 12:07:14
基于立创·天猛星MSPM0G3507开发板的电机PID控制实战编码器测速、定距与曲线显示最近有不少参加电赛或者刚开始学电机控制的朋友问我PID算法听起来挺复杂到底怎么在单片机上跑起来又怎么调参呢正好我手头有块立创·天猛星MSPM0G3507开发板用它配合一个带编码器的直流电机和一块小屏幕做了一个完整的PID控制小项目。这个项目麻雀虽小五脏俱全涵盖了编码器测速、PID算法实现、速度与距离双闭环控制还能实时显示曲线和参数非常适合用来入门实战。通过这篇教程我会手把手带你走一遍整个流程。你不需要有深厚的控制理论背景只要跟着做就能理解PID是怎么在嵌入式系统里“活”起来的并掌握关键的调试技巧。咱们的目标很明确让电机乖乖听话让它转多快就转多快让它走多远就走多远并且一切变化都能在屏幕上看得清清楚楚。1. 项目总览与硬件连接在动手写代码之前咱们先搞清楚要做什么以及手头的“家伙事儿”怎么连起来。这个项目要实现两个核心功能定速控制和定距控制。定速就是让电机稳定在某个转速比如每分钟100转运行定距则是让电机精确转动一定的圈数比如正好转10圈停下。为了实现这两个目标我们需要三个关键部分协同工作感知反馈靠电机上的编码器来“看”电机实际转得多快、转了多少。思考控制由MSPM0G3507单片机运行PID算法计算出发给电机的控制指令。执行输出通过单片机的PWM信号驱动电机驱动模块比如TB6612、DRV8833等从而控制电机转动。此外我们还需要一块屏幕比如OLED或TFT LCD来显示PID参数、目标值、实际值以及它们的变化曲线这样调试起来就直观多了。硬件连接其实很简单思路清晰就行编码器通常有A、B两相输出将它们分别连接到MSPM0G3507的任意两个支持编码器接口QEI或外部中断EINT的GPIO引脚上。编码器供电接3.3V或5V地线接GND。电机驱动模块模块的PWM输入引脚接单片机的一个定时器通道用于产生PWM方向控制引脚接另一个GPIO。电机驱动模块的电源VM接电机所需的电压比如12V逻辑电源VCC接3.3V或5V。务必确保电机电源与单片机电源共地屏幕根据屏幕类型I2C或SPI将对应的SCL/SDA或SCK/MOSI等引脚连接到单片机的相应外设引脚上。注意在连接电机驱动模块和大功率电机时强烈建议使用独立的电源为电机供电并使用逻辑电平隔离或确保共地良好以避免电机启动和停止时产生的电流冲击和噪声干扰单片机正常工作甚至导致复位或损坏。2. 基础模块驱动编码器与PWM地基打牢房子才稳。在实现高级的PID控制之前我们必须先让两个最基础的模块可靠工作读取编码器获取速度/位置以及输出PWM驱动电机。2.1 编码器测速与位置读取带编码器的电机其编码器就像一个高精度的“眼睛”电机每转动一个微小角度就会输出一组脉冲。通过测量一定时间内的脉冲数就能算出速度通过累计脉冲总数就能知道位置转过的角度或圈数。MSPM0G3507的Timer模块支持正交编码器接口QEI模式这是读取编码器最准确、最省CPU资源的方式。它会自动根据A、B两相的相位关系判断正反转并递增或递减计数器的值。配置QEI的步骤通常如下以TI的DriverLib库为例初始化GPIO将连接编码器A、B相的引脚配置为外设功能模式映射到对应的Timer单元。配置Timer为QEI模式选择一个16位或32位定时器将其工作模式设置为编码器模式。设置计数模式与预分频根据编码器线数每转脉冲数和期望的计数范围设置计数模式例如在A、B相每个边沿都计数分辨率最高和预分频。使能定时器启动编码器计数。// 示例使用Timer_A0作为编码器接口 (伪代码具体函数名参考TI DriverLib) #include “ti_msp_dl_config.h” void Encoder_Init(void) { // 1. 配置GPIO为Timer外设功能 DL_GPIO_setPeriphMode(ENCODER_A_PORT, ENCODER_A_PIN, DL_GPIO_PERIPH_MODE_SECONDARY); DL_GPIO_setPeriphMode(ENCODER_B_PORT, ENCODER_B_PIN, DL_GPIO_PERIPH_MODE_SECONDARY); DL_GPIO_setPinConfig(ENCODER_A_PORT, ENCODER_A_PIN, PIN_CONFIG_MUX_FUNC); DL_GPIO_setPinConfig(ENCODER_B_PORT, ENCODER_B_PIN, PIN_CONFIG_MUX_FUNC); // 2. 3. 配置Timer_A0为QEI模式 DL_TimerA_setQeiMode(TIMER_A0_INST, DL_TIMER_A_QEI_MODE_X4, // 4倍频模式A/B相每个边沿都计数 DL_TIMER_A_QEI_INVERT_NONE); // 不反转输入极性 DL_TimerA_setPrescaler(TIMER_A0_INST, DL_TIMER_A_PRESCALER_DIVIDE_1); // 预分频1 // 4. 启动定时器开始计数 DL_TimerA_startCounter(TIMER_A0_INST); } // 读取当前编码器计数值用于计算位置 int32_t Encoder_GetCount(void) { return (int32_t)DL_TimerA_getCount(TIMER_A0_INST); }有了位置计数速度怎么算呢一个经典的方法是M法测速在固定的时间间隔T比如10ms内读取编码器计数值的变化量ΔCount。那么速度Speed单位转/分钟RPM的计算公式为Speed (RPM) (ΔCount / (编码器线数 * 4)) / T * 60这里“编码器线数*4”是因为我们使用了4倍频模式。ΔCount就是本次采样时刻的计数值减去上一次采样时刻的计数值。这个计算过程可以放在一个定时中断里完成确保速度更新的周期是固定的。2.2 PWM输出配置PWM脉冲宽度调制是控制电机转速和转向的“缰绳”。通过改变PWM波形的占空比高电平时间占整个周期的比例可以等效地改变输出到电机的平均电压从而控制转速。在MSPM0G3507上我们通常使用一个Timer模块的PWM输出通道来控制电机速度再用一个普通的GPIO来控制方向高电平正转低电平反转。配置PWM输出的关键步骤初始化GPIO将PWM输出引脚配置为对应的Timer外设功能。配置Timer为PWM模式设置定时器的计数模式通常为上/下计数或边沿对齐、周期值决定PWM频率和比较值决定占空比。设置PWM频率和初始占空比PWM频率不宜过高开关损耗大或过低电机噪音大、转速不稳对于普通直流有刷电机1kHz到20kHz都是常见范围。初始占空比设为0让电机处于停止状态。// 示例配置Timer_A1的某个通道输出PWM (伪代码) void PWM_Init(void) { // 1. 配置PWM引脚 DL_GPIO_setPeriphMode(PWM_PORT, PWM_PIN, DL_GPIO_PERIPH_MODE_PRIMARY); DL_GPIO_setPinConfig(PWM_PORT, PWM_PIN, PIN_CONFIG_MUX_FUNC); // 2. 配置Timer_A1为PWM模式 DL_TimerA_setMode(TIMER_A1_INST, DL_TIMER_A_MODE_PWM_UP_DOWN); // 上下计数模式中心对齐PWM DL_TimerA_setPeriod(TIMER_A1_INST, PWM_PERIOD); // 设置周期值PWM频率 系统时钟 / (PWM_PERIOD * 预分频) DL_TimerA_enableCaptureComparePwmOutput(TIMER_A1_INST, PWM_CHANNEL); // 使能指定通道的PWM输出 // 3. 设置初始占空比为0% DL_TimerA_setCompareValue(TIMER_A1_INST, PWM_CHANNEL, 0); // 启动定时器 DL_TimerA_startCounter(TIMER_A1_INST); } // 函数设置PWM占空比 (范围: 0.0 ~ 1.0) void PWM_SetDuty(float duty) { uint32_t compareValue; if(duty 0.0f) duty 0.0f; if(duty 1.0f) duty 1.0f; compareValue (uint32_t)(duty * (float)PWM_PERIOD); DL_TimerA_setCompareValue(TIMER_A1_INST, PWM_CHANNEL, compareValue); }3. PID控制算法的实现与整定核心部分来了PID控制器就像一个有经验的“老司机”它根据“目标速度”期望值和“实际速度”测量值之间的偏差来调整PWM这个“油门”让偏差尽可能小。3.1 PID算法原理与离散化PID是比例P、积分I、微分D三个环节的缩写。咱们用开车来类比比例P当前偏差有多大就按比例给多大的控制量。偏差大了就多踩点油门偏差小了就少踩点。反应快但容易刹不住车超调或者在目标值附近来回晃静差。积分I把过去一段时间的偏差累积起来。主要用于消除静差。比如车一直比目标速度慢一点积分项就会慢慢增加油门直到完全消除这个微小偏差。微分D预测偏差未来的变化趋势。如果偏差正在快速减小比如快达到目标速度了就提前松点油门防止冲过头。它能增加系统稳定性抑制超调。在单片机里我们处理的是离散的数字信号所以要用离散化的PID公式。最常用的是位置式PIDu(k) Kp * e(k) Ki * Σe(j) Kd * [e(k) - e(k-1)]其中u(k)是当前时刻第k次采样的输出控制量比如PWM占空比。e(k)是当前时刻的偏差e(k) 目标值 - 测量值。Kp,Ki,Kd就是我们需要整定的三个参数。Σe(j)是从开始到当前时刻所有偏差的累加积分项。[e(k) - e(k-1)]是本次偏差与上次偏差的差值微分项。在实际编程中我们通常会把积分项Ki * Σe(j)写成Ki * integral并设置一个积分限幅防止积分饱和误差一直累积导致输出巨大。微分项也可以采用不完全微分等形式来抑制高频噪声。3.2 代码实现一个实用的PID结构体下面是一个在嵌入式系统中非常实用的PID控制器结构体和初始化函数。我习惯把PID相关的所有变量打包在一起这样管理多个控制器比如速度环和位置环会很方便。typedef struct { float target; // 目标值 float measure; // 测量值 float err; // 当前误差 float err_last; // 上一次误差 float integral; // 积分项累加值 float output; // PID输出值 float Kp; float Ki; Kd; float integral_limit; // 积分限幅 float output_limit; // 输出限幅 } PID_Controller; void PID_Init(PID_Controller *pid, float kp, float ki, float kd, float i_limit, float o_limit) { pid-Kp kp; pid-Ki ki; pid-Kd kd; pid-integral_limit i_limit; pid-output_limit o_limit; 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; } float PID_Calculate(PID_Controller *pid, float target, float measure) { float differential; pid-target target; pid-measure measure; pid-err pid-target - pid-measure; // 积分项计算并限幅防止饱和 pid-integral pid-err; if(pid-integral pid-integral_limit) pid-integral pid-integral_limit; if(pid-integral -pid-integral_limit) pid-integral -pid-integral_limit; // 微分项计算不完全微分可在此处实现 differential pid-err - pid-err_last; pid-err_last pid-err; // PID输出计算 pid-output pid-Kp * pid-err pid-Ki * pid-integral pid-Kd * differential; // 输出限幅 if(pid-output pid-output_limit) pid-output pid-output_limit; if(pid-output -pid-output_limit) pid-output -pid-output_limit; return pid-output; }3.3 参数整定让电机“听话”的秘诀PID参数整定是个经验活但也是有章可循的。对于电机速度控制我推荐先P、再I、最后D的试凑法并且一定要在闭环即编码器反馈正常的情况下进行。初始化将Ki和Kd设为0输出限幅设为安全值比如对应最大占空比0.8积分限幅设一个中等值。调比例P给一个较小的目标速度比如50 RPM。从小到大慢慢增加Kp。你会看到电机开始转动并且实际速度向目标值靠近。当Kp增大到出现明显抖动或持续振荡时说明P太大了。将Kp回调到振荡消失此时系统响应较快且稳定。记下这个Kp值。调积分I保持Kp为刚才的值引入一个很小的Ki。观察电机速度。如果存在静差稳定后速度略低于目标值就缓慢增大Ki直到静差被消除。Ki太大会引起低频振荡或超调。如果出现振荡就减小Ki。合适的Ki能消除静差且不影响动态响应。调微分D可选速度环对微分项不太敏感且编码器噪声容易被微分放大。如果系统超调严重可以尝试加入很小的Kd来抑制。注意微分项对噪声非常敏感如果使用一定要确保编码器信号干净或者使用不完全微分、对测量值进行低通滤波。提示定距控制位置环的参数整定思路类似但通常需要更小的比例增益和更谨慎的积分、微分因为位置环更容易振荡。可以先让速度内环稳定工作再在外层套上位置环进行调试。4. 系统整合与功能实现现在我们把各个模块像拼图一样组合起来实现定速和定距功能并把数据送到屏幕上显示。4.1 定速控制实现定速控制是单环系统速度PID环。它的输入是目标速度反馈是编码器计算出的实际速度输出是PWM占空比。程序逻辑可以放在一个固定的定时中断比如1ms或5ms中执行这个周期就是PID的控制周期。PID_Controller speed_pid; // 声明一个速度PID控制器 float target_speed_rpm 100.0f; // 目标速度100 RPM float current_speed_rpm; // 当前速度 float pwm_duty; // PWM占空比 // 在定时中断服务函数中 void Timer_ISR(void) { // 1. 读取编码器值计算当前速度 (假设有函数Get_Speed_RPM()) current_speed_rpm Get_Speed_RPM(); // 2. 进行PID计算 pwm_duty PID_Calculate(speed_pid, target_speed_rpm, current_speed_rpm); // 注意PID输出可能是-1.0~1.0需要根据你的电机驱动逻辑映射到0~1.0的占空比和方向 // 例如if(pwm_duty 0) { 方向正转; PWM_SetDuty(pwm_duty); } // else { 方向反转; PWM_SetDuty(-pwm_duty); } // 3. 更新PWM输出 PWM_SetDuty(fabsf(pwm_duty)); // 取绝对值作为占空比 Set_Motor_Direction(pwm_duty 0 ? FORWARD : REVERSE); // 设置方向 // 4. (可选) 将目标值、实际值、PID输出等数据存入缓冲区供显示线程使用 Update_Display_Data(target_speed_rpm, current_speed_rpm, speed_pid.output); }4.2 定距控制实现定距控制是双环系统外环是位置环内环是速度环。外环PID根据“目标位置”总脉冲数和“当前位置”编码器累计值计算出“目标速度”然后将这个目标速度交给内环的速度PID去跟踪执行。这种结构也叫串级PID抗干扰能力更强。PID_Controller position_pid; // 声明一个位置PID控制器 PID_Controller speed_pid; // 速度PID控制器复用 int32_t target_position_count 10000; // 目标位置10000个计数 int32_t current_position_count; // 当前位置 float inner_target_speed; // 内环速度环的目标速度 // 在定时中断服务函数中 void Timer_ISR(void) { // 1. 读取编码器当前位置 current_position_count Encoder_GetCount(); // 2. 外环位置环PID计算输入是位置偏差输出是期望速度 inner_target_speed PID_Calculate(position_pid, (float)target_position_count, (float)current_position_count); // 对inner_target_speed进行限幅避免内环无法跟踪 // 3. 读取当前速度 current_speed_rpm Get_Speed_RPM(); // 4. 内环速度环PID计算跟踪外环给出的期望速度 pwm_duty PID_Calculate(speed_pid, inner_target_speed, current_speed_rpm); // 5. 更新PWM输出 PWM_SetDuty(fabsf(pwm_duty)); Set_Motor_Direction(pwm_duty 0 ? FORWARD : REVERSE); // 6. 更新显示数据 Update_Display_Data(target_position_count, current_position_count, inner_target_speed, current_speed_rpm); }4.3 曲线与参数显示图形化显示是调试的“眼睛”。我们可以利用屏幕的绘图功能绘制两条曲线一条是目标值水平线或斜坡另一条是实际测量值。看着实际值曲线如何追赶并稳定在目标值线上PID参数的效果一目了然。显示逻辑可以放在主循环中以较低的频率比如10Hz刷新避免占用过多CPU。显示内容可以包括实时曲线目标值 vs. 实际值速度或位置。数值显示当前目标值、实际值、PID输出值。参数显示与调节当前的Kp, Ki, Kd值。如果屏幕支持触摸或外接了按键甚至可以实时修改这些参数观察系统响应变化这是最有效的学习方式。5. 调试心得与常见问题做完以上所有步骤你的电机应该已经能受控运行了。但在实际调试中你可能会遇到下面这些“坑”这里分享一些我的处理经验电机不转或抖动严重检查硬件首先确认电机驱动模块供电是否正常PWM和方向信号是否到达驱动模块。用万用表测量电机两端电压。检查编码器编码器接线是否正确A、B相有没有接反在转动电机时用逻辑分析仪或单片机读取GPIO状态看是否有脉冲变化。参数问题PID参数尤其是Kp是否太小先尝试给一个固定的、较小的PWM占空比看电机能否正常转动排除软件算法问题。速度控制存在静差增大Ki这是消除静差的主要手段。但要注意积分限幅防止积分饱和。检查测量编码器测速计算是否正确M法测速的时间窗口T是否准确可以在屏幕上打印出原始的脉冲计数变化量来验证。系统振荡来回晃动P太大这是最常见的原因。减小Kp。I太大积分作用过强也会引起振荡尤其是低频振荡。减小Ki。控制周期不合适PID计算和执行的周期太快或太慢都可能引发不稳定。对于电机速度控制1ms到10ms是比较常见的范围。定距控制到终点时过冲或抖动切换控制模式当位置接近目标时比如最后10%的路程可以将位置环的输出目标速度进行限幅逐渐降低允许的最大速度实现“软着陆”。加入死区当位置误差小于某个很小值时直接停止PWM输出避免在终点附近因微小误差而持续抖动。这个项目虽然不大但完整地走通了嵌入式运动控制的经典流程传感器反馈、控制器计算、执行器输出、人机交互。希望你能通过动手实践真正理解PID不再是书本上的公式而是能让物理世界中的电机精准运行的强大工具。调试过程可能会有些曲折但当你看到电机最终平稳、准确地按照你的指令运行时那种成就感就是学习嵌入式最大的乐趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411042.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…