All MicroEvals
我这个 MSPM0 小车昨天本来已经能跑了,5ms 一个控制周期,速度环和转向环都在 TIMER_0 里。 今天为了看...
Create MicroEval
Header image for 我这个 MSPM0 小车昨天本来已经能跑了,5ms 一个控制周期,速度环和转向环都在 TIMER_0 里。

今天为了看...

我这个 MSPM0 小车昨天本来已经能跑了,5ms 一个控制周期,速度环和转向环都在 TIMER_0 里。 今天为了看...

Prompt

我这个 MSPM0 小车昨天本来已经能跑了,5ms 一个控制周期,速度环和转向环都在 TIMER_0 里。 今天为了看数据加了遥测,之后有个很烦的问题:大部分时间正常,但是大概十几秒会突然左右轮差速抽一下,车头明显甩一下,然后自己恢复。 我第一反应是 PID 偶发炸了,队友觉得是蓝牙串口堵了。我看 UART 带宽应该够,所以感觉不至于。 目前配置: TIMER_0 control 200 Hz encoder update 200 Hz Bluetooth UART 921600 telemetry 200 Hz telemetry line 72~95 bytes 控制中断大概这样: TIMER_0_IRQHandler() { update_encoder(); speed_pid(); turn_pid(); motor_output(); if (telemetry_enable) { Telemetry_Push(); } } Telemetry_Push() 不是直接 printf,之前让 AI 优化过,大概逻辑: void Telemetry_Push(void) { TelemetrySnapshot s; s.target_l = target_l; s.target_r = target_r; s.speed_l = speed_l; s.speed_r = speed_r; s.pwm_l = pwm_l; s.pwm_r = pwm_r; telemetry_fifo[wr] = s; wr = (wr + 1) % 64; } main 里: if (rd != wr) { TelemetrySnapshot *s = &telemetry_fifo[rd]; snprintf(txbuf, sizeof(txbuf), ...); HAL_UART_Transmit(...); rd = (rd + 1) % 64; } 没有 RTOS。 我抓了几组东西: 正常时: control_dt: avg 5.00ms max 5.18ms fifo_used: 0~3 出问题附近: t=18.420 fifo=58 t=18.425 fifo=60 t=18.430 fifo=61 t=18.435 fifo=63 t=18.440 fifo=0 t=18.445 fifo=1 同一段车控日志: target L/R = 1.20 / 1.20 speed L/R = 1.17 / 1.16 turn error = 2 下一条: target L/R = 1.20 / 1.20 speed L/R = 0.71 / 1.54 turn error = 3 再下一条基本恢复 还有一个很奇怪的事情: telemetry_enable=0 连跑3分钟没复现 telemetry_enable=1 30~40秒内通常能看到一次 但我看 921600 波特率理论带宽完全够 200Hz×100B 啊。 我现在准备一次搞稳一点: FIFO 从64扩到512; UART改DMA; FIFO满以后丢最老数据; 加UART发送超时; 超时自动重启UART; 遥测线程做成独立状态机; 后面干脆上FreeRTOS把控制、通信、OLED都拆任务。 反正这个工程之后还要继续做,早点正规化也行。 你先别写代码,给我判断一下现在最可能是什么,以及今晚我应该怎么改和怎么验。我主要想赶紧把车恢复到昨天那种稳定状态。

Drag to resize
Drag to resize
Drag to resize