资讯动态

电磁循迹小车PID调节实战:从电感信号采集到STM32舵机电机控制

发布时间:2026/10/17 7:22:07 来源:尧图企业网站定制
简介基于STM32的电磁循迹小车PID调节项目面向参加恩智浦智能车竞赛的开发者与嵌入式控制学习者聚焦电磁循迹中的电感采集、PID参数整定与路径跟踪实现。压缩包共192个文件容量5.76MB以C源码43个.c和头文件47个.h为主辅以编译生成的.o、.d、.crf、.hex、.map等工程文件并包含LCD显示、MPU6050姿态解算、定时器与串口等底层驱动模块便于直接查阅工程结构并对照调试。资源已有4687人学习下载。资源内含完整的STM32工程代码与PID调节实现覆盖从电感信号采集到舵机与电机控制的完整链路提供了Keil工程配置、批处理脚本和链接脚本等辅助文件可帮助读者快速理解PID参数对循迹稳定性的影响并在实车调试中加以验证。对于希望系统掌握电磁循迹小车调参方法和工程组织的学习者是一份可直接上手研究的完整参考。1. 电磁循迹小车先看懂电感信号的变化再谈 PID 的调节第一次拿到这辆电磁循迹小车的时候我也跟大多数人一样以为决定它能不能跑完全程的是 PID 参数那三个数。于是在调参上耗了一个通宵结果发现车要么在直道上左右摆头要么在弯道里直接冲出去。等到把串口数据打出来仔细看了一遍才意识到问题根本不在于 P、I、D 这三个字而是电感采集回来的那一路电压信号根本就没处理干净。误差信号本身就是脏的后面 PID 再努力也是白搭。这份「电磁循迹小车PID调节.zip」工程就是围绕 STM32 主控、电感采集、PID 调节三个核心点展开的一套完整循迹小车实现。它适合两类人一类是准备校内智能车竞赛、想快速把车跑起来的学生另一类是已经在做嵌入式控制、想看看别人怎么处理信号和闭环的开发者。读完你会知道电感数据是怎么变成误差、误差又是怎么变成舵机和电机 PWM 的以及调参时那些让人崩溃的「玄学」问题到底出在哪一环。2. 系统架构与技术选型从电感采集到 PID 输出整条链路是这样串起来的2.1 工程目录和整体结构打开压缩包之后第一件事不是双击工程文件而是先把目录结构过一遍。按常见分组来看这份工程的代码分层大概是这样的电磁循迹小车PID调节/ ├── Doc/ # 接线说明、赛道示意图、调参记录 ├── MDK-ARM/ # Keil 工程文件编译入口 ├── USER/ # main.c、中断服务、系统时钟配置 ├── APP/ # 策略层循迹误差计算、PID 控制逻辑 ├── BSP/ # 板级驱动电感、舵机、电机、编码器 └── Readme.txt # 使用说明与硬件清单主控用的是 STM32F103C8T6属于整个工程里最常见也最稳妥的选择。72MHz 主频、12 位 ADC、多路定时器 PWM 输出做一路双电感循迹完全够用而且上手资料多出问题好排查。这种目录分层有一个明显的好处BSP 只管硬件初始化APP 层只碰数据和策略USER 里放中断和主循环。后面二次开发的时候想换一个电感布局只需要动 APP 里的误差计算想换电机驱动芯片只需要改 BSP 的 PWM 初始化策略层完全不用碰。这个划分在结构上就已经为后面的调试留好了余地。2.2 电感信号链路从磁场到数字量中间发生了什么电磁循迹的原理说起来并不复杂赛道中心埋设的导线通有固定频率的交变电流会在导线周围产生同频率的交变磁场。小车左右两侧各放一个水平绕制的工字电感电感与电容并联构成 LC 谐振回路当回路谐振频率与导线电流频率一致时电感两端感应的电压最大。这个电压经过检波和放大之后变成直流电平再送入 STM32 的 ADC 引脚就成了单片机可以直接处理的数值。这套链路里最容易忽略的环节是检波之后的信号调理。常见做法是运放做半波整流或者峰值检波再配合一个 RC 低通把纹波滤掉让 ADC 拿到的数值呈缓慢变化而不是高频毛刺。如果你的工程里把电感信号直接接进 ADC那读到的原始数据大概率会跳得很厉害后面所有控制都无从谈起。2.3 为什么转向环用 PD 而不用完整 PID大多数电磁循迹小车的转向控制用的其实不是完整的 PID而是 PD。原因在于循迹的期望值本身就是动态变化的赛道曲率时刻在变比例项负责快速响应偏差微分项负责在车身即将冲过中心线时提前收力这两个串起来就能把车稳定地压在导线附近。积分项在这类场景里要慎用。电感传感器的差分误差在正常情况下平均值趋近于零不存在持续的稳态误差需要消除。如果加入积分项弯道中持续的单侧偏差会令积分值不断累积出弯之后车还会继续往弯道方向拐表现为直道上莫名其妙地跑偏。所以工程里常见的写法是转向环用 PD速度环才考虑 PI 或者完整 PID。2.4 控制周期怎么定定时器中断驱动还是主循环轮询控制周期是整个系统里容易踩坑的地方。电感采集本身是一次 ADC 转换但真正的控制计算必须按固定周期执行否则同一组 PID 参数在不同车速下表现会完全不一样。常见做法是用一个定时器产生 1ms 或者 2ms 的中断在中断里做「采电感 → 算误差 → 算 PID → 更新 PWM」这一整套动作主循环只负责显示和调试数据输出。如果放在主循环里用 while 轮询while 里其他任务的耗时会影响控制周期车速快的时候感觉特别明显车会一冲一冲的。定时器中断的好处是周期固定调好的参数换到另一个场地或者改一个速度表现不会因为代码执行路径变化而改变。这一点在拿到工程之后先确认一下能省掉很多后面排查抖动的时间。3. 核心代码走读从电感采集的原始值到舵机和电机 PWM 的完整实现3.1 电感采集驱动多路 ADC 轮流采样加滑动平均这一节是整套代码的地基信号质量直接决定后面 PID 调参能不能成。工程里最常见的电感采集方式是使用 ADC 的规则通道组依次扫描多个通道配合 DMA 搬运结果可以把 CPU 从等待转换的时间里解放出来。下面是一段简化之后的核心逻辑/* BSP/inductance.c — 两路电感 ADC 采集与滑动平均 */ #define SAMPLE_NUM 16 uint16_t adc_raw[2]; uint16_t adc_buf[2][SAMPLE_NUM]; uint8_t buf_index 0; void Inductance_Scan(void) { /* 启动一次多通道 ADC 转换结果通过 DMA 搬运到 adc_raw */ ADC_SoftwareStartConvCmd(ADC1, ENABLE); /* 等待 DMA 传输完成实际工程里会用标志位判断 */ while (DMA_GetFlagStatus(DMA1_FLAG_TC1) RESET); DMA_ClearFlag(DMA1_FLAG_TC1); /* 将本周期原始值写入环形缓冲区 */ for (int i 0; i 2; i) { adc_buf[i][buf_index] adc_raw[i]; } buf_index (buf_index 1) % SAMPLE_NUM; } uint16_t Inductance_GetFiltered(uint8_t ch) { uint32_t sum 0; for (int i 0; i SAMPLE_NUM; i) { sum adc_buf[ch][i]; } return (uint16_t)(sum / SAMPLE_NUM); }这段代码里 SAMPLE_NUM 是滑动窗口的大小取 16 意味着每次返回的是最近 16 次采样的平均值。窗口太小时滤波效果差电感数值会跟着噪声周期性抖动窗口太大时信号反应慢弯道里车已经压到导线边缘了误差值才慢慢变化导致转向跟不上。实际使用中还需要关注 ADC 的采样时间。STM32F103 的 ADC 采样时间可以配置到 239.5 个周期对于 20kHz 左右的谐振信号建议把采样时间配得稍微长一点这样等效于一次硬件级低通滤波比单纯靠软件平均的效果更自然。电感这种缓慢变化的模拟信号追求采样速度意义不大稳定才是第一位。3.2 误差计算差分归一化让参数在不同场地下可复用电感采集回来的原始 ADC 值受供电电压、场地电流强度、电感高度等因素影响同一个位置换一块场地数值可能差出一倍。如果直接把原始值差值作为 PID 的输入换场地就得重新调一遍参数。所以在计算误差这一步工程里普遍会做归一化处理代码长这样/* APP/control.c — 双电感差分归一化输出范围约为 [-1.0, 1.0] */ float error_left_right 0.0f; float error_last 0.0f; uint8_t line_lost 0; uint16_t lost_counter 0; void Cal_TrackError(void) { uint16_t left Inductance_GetFiltered(0); uint16_t right Inductance_GetFiltered(1); float sum (float)left (float)right; /* 两侧数值都很小认为已经完全丢线 */ if (sum 30.0f) { line_lost 1; lost_counter; /* 丢线时保持上一次误差等待重新入线 */ error_left_right error_last; return; } line_lost 0; lost_counter 0; error_left_right ((float)left - (float)right) / sum; error_last error_left_right; }这个函数是整辆车决策逻辑里最关键的一步。差分归一化的好处有两点一是把误差映射到 -1 到 1 之间左侧电感值大误差为正右侧电感值大误差为负方向直观二是自动消除了共模干扰的影响比如场地电流变大导致两侧电感同时升高差值除以和之后数值不会明显变化。需要留意的是丢线处理。当两个电感都远离导线时两路 ADC 值都会非常小此时计算出的差分值没有意义还可能是一个大数。工程里用 sum 30 这个阈值判定丢线并保持上一次有效误差让小车的转向保持惯性向前滑等重新检测到信号再恢复控制。这个阈值不是固定的需要根据你用串口观察到的空采背景值来定一般比背景噪声高出一倍以上。3.3 PID 计算位置式 PD 加输出限幅的实现细节误差算好了接下来进入 PID 控制函数。工程里转向环用的是位置式 PD保留了一个很小的积分项用于处理极少数持续偏心场景代码实现如下/* APP/control.c — 位置式 PID 计算 */ #define KP_TURN 24.0f #define KI_TURN 0.2f #define KD_TURN 60.0f #define INTEGRAL_LIMIT 400.0f #define OUTPUT_LIMIT 1000.0f float pid_out 0.0f; float integral 0.0f; float last_err 0.0f; float Turn_PID(float err) { /* 比例项直接对当前偏差做出反应 */ float p_out KP_TURN * err; /* 积分项带限幅的累积防止积分饱和小车出弯不回来 */ integral KI_TURN * err; if (integral INTEGRAL_LIMIT) integral INTEGRAL_LIMIT; if (integral -INTEGRAL_LIMIT) integral -INTEGRAL_LIMIT; /* 微分项用当前误差减上一次误差等效于误差变化率 */ float d_out KD_TURN * (err - last_err); last_err err; float output p_out integral d_out; /* 输出限幅防止舵机打死或电机占空比超出有效范围 */ if (output OUTPUT_LIMIT) output OUTPUT_LIMIT; if (output -OUTPUT_LIMIT) output -OUTPUT_LIMIT; return output; }这里微分项用的是误差的一阶差分没有采用标准的微分先行结构因为电磁传感器本身已经做了 16 次滑动平均高频噪声被压制了一部分直接差分不会有太严重的噪声放大。如果你把滑动窗口改小了微分噪声会急剧上升此时建议在微分项前面再加一个一阶低通滤波器否则车速一快就会出现高频抖振。关于积分限幅这个限幅值不是随便写的。在弯道中误差持续为负积分会一直累积如果限幅值过大致使积分项占的比重偏大出弯之后车会继续向弯道方向偏一段才回来。一般把积分贡献限制在输出总量的五分之一以内比较稳妥具体数值要根据你的车速在串口里观察调整。3.4 控制输出映射把 PID 结果变成差速和舵机角度PID 计算出来的是一路带正负号的输出值它不能直接驱动电机。在典型的双后轮驱动加舵机前轮转向布局中舵机角度直接跟转向输出映射速度输出则要根据转向量做左右后轮的差速控制。/* APP/control.c — 舵机与电机 PWM 映射 */ #define STEER_MID 750 #define STEER_RANGE 150 #define BASE_SPEED 500 #define MAX_SPEED 900 /* PID 输出范围 [-1000, 1000]映射到舵机 PWM 脉宽 */ void Set_Steer(float pid_angle) { float scale pid_angle / OUTPUT_LIMIT; /* 归一化到 [-1,1] */ int pwm STEER_MID (int)(STEER_RANGE * scale); if (pwm STEER_MID STEER_RANGE) pwm STEER_MID STEER_RANGE; if (pwm STEER_MID - STEER_RANGE) pwm STEER_MID - STEER_RANGE; Servo_SetPulse(pwm); } /* 两侧后轮差速转向越大内外侧轮速差越大 */ void Set_Motor_Diff(float pid_angle) { float scale pid_angle / OUTPUT_LIMIT; int pwm_l (int)(BASE_SPEED - scale * 300); int pwm_r (int)(BASE_SPEED scale * 300); if (pwm_l 0) pwm_l 0; if (pwm_r 0) pwm_r 0; if (pwm_l MAX_SPEED) pwm_l MAX_SPEED; if (pwm_r MAX_SPEED) pwm_r MAX_SPEED; Motor_SetPWM(MOTOR_LEFT, pwm_l); Motor_SetPWM(MOTOR_RIGHT, pwm_r); }STEER_MID 是舵机机械中位对应的 PWM 值这个值必须实测校准不同舵机和不同前轮安装角度差异很大。STEER_RANGE 是最大转向角对应的偏离量取值范围受前轮机械限位约束设大了会憋舵机设小了转向不足。BASE_SPEED 在这里是基础 PWM 占空比当 PID 输出为 0 时两侧轮速相等车沿直线前进。差速系数 300 控制的是转向时内外侧轮速差系数越大过弯越灵活但高速时容易甩尾。需要记住的是电磁循迹小车跑直道靠的是转向环不断微调而不是靠差速差速只是在曲率较大时提供额外帮助所以系数不需要设得很大。3.5 控制周期整合定时器中断把各个模块串起来最后一步是把采集、误差、PID、输出放进定时器中断里形成一个固定周期的控制循环。这也是整个工程里最像「实时系统」的地方代码框架大致如下/* USER/stm32f10x_it.c — 1ms 定时器中断服务函数 */ void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); Inductance_Scan(); /* 1. 采集两路电感原始值 */ Cal_TrackError(); /* 2. 差分归一化计算当前偏差 */ float out Turn_PID(error_left_right); /* 3. PID 计算 */ Set_Steer(out); /* 4. 舵机跟随转向输出 */ Set_Motor_Diff(out); /* 5. 电机差速跟随 */ } }这段中断服务函数做的事情非常明确。控制周期选 1ms 时舵机刷新频率为 1kHz足够平滑如果改用 2ms 周期系统对弯道的响应会慢一点但舵机抖动会变小适合低速调试时切换。这里有一个简历上可以写的细节如果后期加了测速编码器准备做速度闭环速度环的计算周期一般是转向环的 5 到 10 倍也就是 5ms 到 10ms 一次不需要每个毫秒都算。把速度环和转向环放在同一个定时器里做分频处理是工程里常见的省资源做法。4. 搭建与运行从拿到工程到小车跑起来附现场调参的实操思路4.1 工程编译与烧录步骤拿到工程之后首先检查你本地的 Keil 版本是否支持工程文件中的芯片包。工程基于 STM32F103C8T6需要先确认 Keil 里已经安装了对应的 Device Pack。打开 MDK-ARM 目录下的工程文件后在 Options for Target 里检查两件事一是 Device 是否正确选为 STM32F103C8二是 Debug 页面里的下载器类型是否与你手头的工具匹配常见的是 ST-Link 或 J-Link。编译前建议做一次 Clean 再 Build避免旧的中间文件干扰链接结果。编译通过之后点击 Load 烧录。这里有个比较容易忽略的问题如果使用 ST-Link 的 SWD 接口下载板子必须是供电状态而且 VBAT 和 VCC 的电平要与 ST-Link 的输出一致否则经常出现「No target connected」的报错。烧录完成之后按一下复位键小车会进入主循环开始工作。4.2 引脚定义与接线表工程里 BSP 层的初始化代码已经固化了引脚分配但不同买来的车模底板引脚定义可能不一样接线前先看一下工程内的 hw_config.h 或者 readme 里的引脚表。以一个典型的双电感加两路电机的配置为例功能模块引脚说明左电感 ADCPA1ADC1 通道 1接左水平电感检波输出右电感 ADCPA2ADC1 通道 2接右水平电感检波输出舵机 PWMPA8TIM1_CH150Hz 舵机控制信号左后轮电机 PWMPB6TIM4_CH1接驱动芯片输入右后轮电机 PWMPB7TIM4_CH2接驱动芯片输入电机方向控制PB8 / PB9接驱动芯片方向引脚接线时最大的坑在电源。舵机启动瞬间电流很大如果控制板、舵机、驱动板共用一路电源舵机转动时可能会把电压拉低导致 STM32 复位重启表现就是小车一打方向就断电重启。我一般会建议把舵机电源和控制板电源分开或者至少在电源端并一个大容量的电解电容能缓解很多这边的问题。4.3 现场调参先从串口数据开始不要一上来就调 P调参是有顺序的反过来基本都会翻车。第一步别急着跑车先把串口接上在 main 循环里把两路电感的原始 ADC 值和归一化之后的误差值打印出来然后把车抬起来靠近赛道中心线左右缓慢移动车身观察串口数据的变化。如果误差值方向反了比如车往左偏误差显示为负说明两路电感接反了直接交换 PA1 和 PA2 接线即可不需要改代码。确认误差方向正确之后下一步是检查舵机的跟随方向用手把车身往左推看舵机是否自动往左打角如果方向反了把误差取负或者对调差速公式的加减号。方向都对之后把 BASE_SPEED 设为 300 左右低速起步然后从 KP 开始调。从一个保守的数值开始比如 10.0每次加 2 到 3跑一圈直道看看车是否左右摆头。稳定之后再加车速度速度每提高一档后面往往需要同步提高 KD 来抑制动态抖动。4.4 参数表理解每个参数的物理含义工程里的 PID 参数集中定义在 control.c 的宏里改完重新编译烧录即可生效。调参时参考下面的表格来快速定位方向参数作用调大之后的表现调小时的表现KP_TURN转向响应强度过弯凌厉但直道摆头转向迟钝弯道冲出KD_TURN转向阻尼车身稳定但反应变慢弯道甩尾直道高频微抖KI_TURN积分修正直道低频漂移减小一般无感知变化BASE_SPEED基础车速圈速快弯道压力大调参更安全圈速慢一个比较稳妥的流程是先把 KI 设为 0KD 从前向参考值的一半开始往上加调完转向表现之后再调差速系数最后才回来微调 BASE_SPEED。车速与 PID 参数是强关联的这个压包里的参数大概率是在某一组特定车速下整定的换速度跑之前做好重新走一遍调参流程的预期。5. 避坑记录电感值跳变、丢线冲出跑道和舵机抖振的排查笔记5.1 直道上小车左右摆头走线呈 S 形现象小车在直道上看起来在稳定前进但轨迹明显呈 S 形摆动频率不高但幅度明显。原因常见原因是 KP 太大导致转向过冲车刚回到中心线时比例项给的修正量偏大了直接冲到另一侧然后又被拉回来形成来回振荡。另一种可能是电感滑动平均窗口太小ADC 噪声引起的误差抖动被转向环放大。解决先把 KP 按当前值的 50% 往下调看 S 形是否收敛。如果仍存在检查滑动平均窗口 SAMPLE_NUM 是否小于 8建议至少 16。这里调整优先级有个细节先保证信号平滑再调 PID顺序别反过来。另外测一下你的 PWM 刷新频率是不是与控制周期匹配舵机的响应速度比电机慢PWM 频率过高也会表现为转向滞后和持续振荡。5.2 弯道中电感读数突然归零小车直接冲出赛道现象小车进入弯道后某一侧电感值瞬间掉到几十甚至零误差计算完全乱掉车速不变直接冲出去。原因电感离地面太远或者安装角度偏向水平会导致盲区。导线周围的磁场在远离导线后衰减很快弯道中车身偏转角度大时两个水平电感都可能偏离磁场最强区域造成同时丢线。解决先观察丢线时的背景 ADC 值再把 Cal_TrackError 里 sum 30 的阈值放低一些避免把「弱信号」误判为「丢线」。然后是机械层面调整水平电感离地高度建议控制在 1 到 2 厘米之间太高容易丢线太低会被路肩刮碰。如果赛道上有坡道前向再加一个水平电感配合加权融合可以提高上坡时的稳定性。5.3 舵机中位不准直道小车跑不直现象所有参数看起来都正确误差也为零但小车在直道上始终朝一侧偏移而且偏移方向固定不变。原因舵机中位对应的 PWM 值在机械角度上并不等于前轮正方向STEER_MID 设置得偏离了实际机械中点导致误差为零时前轮依然有固定偏角。解决把车架空让前轮悬空给舵机发送一个初始 PWM 值测量前轮是否与车身轴线平行。如果不是逐步逼近修正 STEER_MID 直到前轮正。重复两次之后把新值写回控制代码。这个方法在更换舵机或者重新拆装前轮之后必须重新校准一次否则在硬件上「归零」了 PID 也没法补偿过来。5.4 加了积分项之后直道开始低频漂移现象把 KI 从 0 调到一个非零值之后直道上车身出现低频漂移方向会周期性缓慢偏移然后又自行修正回来。原因积分项在连续弯道中累积了偏差历史出弯之后累积值没有归零车身会向弯道方向偏移一段距离直到误差反向把积分消掉。电磁电感传感器的差分误差在直道上没有稳态偏差积分项没有存在的必要。解决将 KI_TURN 改回 0或者设置很小仅用于坡道等持续重力干扰场景。如果确实需要积分一定配合 INTEGRAL_LIMIT 做限幅并考虑在检测到丢线时把积分清零。调试时用一个带开关控制的标志出弯瞬间观察积分变量是否直接回到零能快速判断出丢线清除逻辑是否生效。5.5 上电瞬间舵机猛打一下方向再恢复正常现象每次上电复位之后小车都会先猛转一下舵机持续不到半秒又恢复稳定看起来像程序「抽风」。原因微分项在第一次执行时last_err 的初始值为 0而当前误差可能是一个较大的值导致第一帧的微分项算出非常大的输出。同时如果舵机 PWM 引脚的初始电平是低电平舵机上电时会根据默认电平先偏到一个位置随后才被控制信号覆盖。解决最简单的方法是在初始化时将 last_err 赋值为当前误差让第一帧微分项输出为 0。其次是让控制输出在启动后的前 50ms 保持中位值可以用一个启动计数器实现在计数器达到设定值之前强制 Set_Steer(0)。这两个措施加起来上电瞬间完全不会再出现异常转向动作我从那之后所有小车工程的初始化流程里都加上了这个软启动逻辑。6. 二次开发从双电感 PD 到速度闭环与多电感融合的改造思路如果这辆车已经能稳定跑完一圈下一步的改造方向通常不是继续精调参数而是往「更快」和「更稳」两个方向走。先说速度闭环。当前工程里 BASE_SPEED 是开环给 PWM 占空比电池电压从 7.4V 掉到 6.8V 时车速会明显变慢转向环参数的表现也随之变化。改造办法是在后轮电机上加装编码器读取两个后轮的实际转速用另一个 PI 环去闭环速度。速度环的代码结构其实和转向环差不多只是把误差从电感偏差换成了「目标速度 - 实际速度」。目标速度不再是固定值而是根据转向输出大小动态调整直道上误差小目标速度高弯道里误差大目标速度降低。这个联动逻辑放在 APP 层的策略函数里算法层面不需要动 PID 函数本身只多了一个累加速度积分的数组。其次可以考虑把两路水平电感升级为三路布局。中置电感负责直道中心线检测左右电感负责弯道偏差三路数据通过加权融合得到一个更平滑的误差曲线。改造后 Cal_TrackError 不再只算左右差分而是用类似 (left - right) / (left right center_weight) 的公式中置电感权重可以提高直道抗干扰能力。这个升级方案的代码改动量不大但机械安装上需要重新设计电感支架。调试手段方面建议优先加一个无线串口模块把误差值、PID 输出、左右电感值实时传到上位机配合虚拟示波器看波形。我见过不少同学在原地调参调不出来结果用上位机看一眼波形马上就能定位问题——电感信号在波形上像不像带噪声的正弦波舵机输出有没有饱和一眼就能判定。这比靠眼睛看车跑要高效得多。如果之后想把车从 2m/s 提升到 3m/s 以上需要同时动的就不只是算法了。更激进的电感前置布局、更硬的底盘、更宽的轮距、更低的车身重心这些机械因素与控制周期共同决定了速度上限。每改一处机械结构都要回到第 4 节的调参流程重新走一遍。从那以后我每次改完结构都会强制自己先看串口数据和波形再跑车不为把时间浪费在反复试错上。这份工程最大的价值不在于代码本身而在于它把一条完整的信号链路从传感器一路打通到执行器摆在你面前顺着它去改每一处都能看得很清楚。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑