# car-mcu **Repository Path**: longcat99/car-mcu ## Basic Information - **Project Name**: car-mcu - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-29 - **Last Updated**: 2026-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # car-mcu · 卡丁车电控(主控 + 灯光继电器板 + 上位机) > **一句话**:一台电动卡丁车的整套电控 —— 线控**转向 / 刹车 / 油门**、灯光喇叭、 > 遥控与自动驾驶接口,外加一块只管**刹车灯 / 倒车灯**的 CAN 继电器板, > 以及两台台架调试上位机。 | | | |---|---| | 仓库 | https://gitee.com/longcat99/car-mcu (`master`) | | 主控固件 | `kart-mcu` **v1.2.2** · STM32F407VET6(DlaBoard_B) | | 继电器板固件 | `relay-can` **1.3.2** · STM32F042F6P6(维度物联 base1 双路继电器板) | | 总线 | CAN **1 Mbps**(整车)· RS485 **115200**(继电器板备用/诊断) | | 最后更新 | 2026-10-29 | --- ## 0. 最小上下文(开新任务先看这段) ``` 仓库 D:\ai\car-mcu ├─ kart-mcu/ 主控固件 v1.2.2:转向(编码器+JMC伺服) / 刹车推杆 / ODrive 油门 / 灯光 / 遥控 / AUTO 接口 ├─ relay-can/ 继电器板固件 1.3.2:K1 刹车灯、K2 倒车灯;CAN 0x204/0x704/0x714 + 485 55A5 帧 │ └─ tools/ CanRelayMonitor(CAN/485 图形上位机)、Relay485(485 命令行诊断)、CanSniff(CAN 抓包) └─ docs/ 各工程 README_CN.md 与 docs/*.md,根目录另有原理图和手册 PDF CAN 节点:0/1 = ODrive 双轮毂,2 = JMC 伺服,3 = BRT38 编码器,4 = 继电器板 继电器板引脚:PA5=K1、PA6=K2、PB1=光敏电阻、PA7=NTC 板温、PA11/PA12=CAN、PA2/PA3=485 继电器命令是【锁存】:发一帧就保持,主机只在状态变化时发,不周期补帧 现状:relay-can 1.3.2 已上板验证(485 全链路 OK;CAN 靠【外接 TJA1050】才通); kart-mcu 编译通过、未整车联调;自动大灯 LIGHT_AUTO_ENABLE=0(阈值已粗标 200/150)。 铁律:这块继电器板【只能用 SWD】,PA11/PA12 接了 CAN 收发器,DFU 会打死; 测 CAN/485 必须 12 V 给板子上电(DAP 的 3V3 带不动收发器)。 ``` --- ## 1. 这个仓库要解决什么 目标:把一台电动卡丁车做成**能人开、能遥控、能自动驾驶**的线控车。 | 角色 | 干什么 | |---|---| | **主控板** `kart-mcu` | 底盘线控:方向盘角度闭环(绝对值编码器 + JMC 伺服)、刹车推杆、油门(默认 ODrive CAN)、灯光喇叭、安全态收敛 | | **继电器板** `relay-can` | 车身灯光:K1 = 刹车灯、K2 = 倒车灯;和主控同一条 CAN,也可走 485 | | **上位机** `relay-can/tools` | 台架调试:不接整车也能点继电器、看光照/板温、抓报文、做失效保护测试 | 三种驾驶模式:`MANUAL`(人开)/ `RC`(遥控)/ `AUTO`(鲁班猫 4 上位机)。 **安全态**(急停、撤使能、丢链路、编码器超时、刹车故障都收敛到这里): 油门 0 + 刹车拉紧 + 转向回中;转向反馈不可信时**主动放开伺服**(宁可让人扳方向)。 **当前阶段:单车 / 台架验证**。继电器板已经上板跑通,主控还没整车联调。 --- ## 2. 系统框图 ``` 鲁班猫 4(AUTO 上位机) │ USB1:22 字节帧 ▼ kart-mcu 主控(STM32F407VET6,DlaBoard_B) ── USB2:调试串口 UART5,115200,敲 STAT/CLI │ CAN 1 Mbps ├─ 节点 3 BRT38 单圈绝对值编码器(转向反馈) ├─ 节点 2 JMC IHSV-RC 伺服(速度模式打方向) ├─ 节点 0/1 ODrive CANSimple(左右轮毂电机) └─ 节点 4 relay-can 继电器板(K1 刹车灯 / K2 倒车灯) ▲ └─ 485(PA2/PA3,115200)备用 / 诊断通道(Relay485 工具) ``` --- ## 3. 目录 ``` car-mcu/ ├─ kart-mcu/ 主控固件(STM32F407VET6,v1.2.2) │ ├─ Core/Inc/app_config.h ★ 编译期参数(周期、限幅、CAN ID、增益、阈值) │ ├─ Core/Inc/board_pins.h ★ 引脚 / 连接器权威定义 │ ├─ Core/Src/ 转向、刹车、油门、灯光、遥控、状态机、CLI │ ├─ docs/ ★ WIRING_CN / PINOUT_CN / PROTOCOL_CN / ODRIVE_CN + 两张 svg │ ├─ build.bat flash.bat 一键编译 / 一键烧写(SWD) │ └─ README_CN.md ★ 整车固件详细文档 │ ├─ relay-can/ 继电器板固件(STM32F042F6P6,1.3.2,裸机 CMSIS 不用 HAL) │ ├─ Core/ adc_scan(PB1/PA7) / relay / proto / rs485 / can_bx / led │ ├─ docs/relay_wiring.svg ★ 继电器板接线拓扑图(推荐先看这张) │ ├─ tools/ │ │ ├─ CanRelayMonitor/ ★ CAN + 485 图形上位机(光照/板温/太暗自动开继电器/截图) │ │ ├─ Relay485/ 485 命令行诊断(--sensors --adc --led-test --de-scan …) │ │ └─ CanSniff/ CAN 抓包(看 0x704 心跳 / 0x714 传感器应答) │ ├─ build.bat flash.bat │ └─ README_CN.md ★ 继电器板详细文档(协议、排障、台架验证记录) │ ├─ tools/pdfdump.py PDF 转文本小脚本 ├─ DlaBoard_B1_Schematic1_2026-08-01.pdf 主控板原理图 ├─ IHSV-RC 伺服手册 / CANopen 协议手册 / servo_manual.txt ├─ .gitignore / .gitattributes └─ README.md ← 本文件 ``` --- ## 4. 硬件与接线 ### 4.1 两块板 | 板子 | MCU | 干什么 | 烧写 | |---|---|---|---| | 主控 **DlaBoard_B** | STM32F407VET6 | 整车逻辑、CAN 主机、串口 | SWD(H1:PA13/PA14/NRST) | | 继电器板 **base1 双路继电器** | STM32F042F6P6(TSSOP20,32K/6K) | K1/K2 两路干接点 | SWD(PA13/PA14),**禁止 DFU** | ### 4.2 继电器板引脚(`relay-can`) | 功能 | 引脚 | 备注 | |---|---|---| | 状态灯 | PA4 | 高电平亮;快闪=没链路、慢闪=在线断开、常亮=至少一路吸合 | | K1 刹车灯 | **PA5** | 高电平吸合(不是 PA0/PA1,网上示例是别的板子) | | K2 倒车灯 | **PA6** | 同上 | | 光敏电阻 | **PB1** | ADC_IN9,1.44 kΩ 下臂;原始码值**越亮越小** | | NTC 板温 | **PA7** | ADC_IN7,15 kΩ 上拉 + 10 kΩ NTC(B=3950),上报 `T10`(0.1 ℃) | | CAN | PA11 / PA12 | 1 Mbps,**必须置 PA11/PA12 重映射位** | | RS485 | PA2 / PA3 | USART2,115200 8N1;DE 脚在板上没引出(kart 侧配 PC0) | | 供电 | **12 V** | 只给 DAP 的 3V3 时收发器不工作,CAN/485 都测不了 | ### 4.3 主控外设 | 外设 | 型号 / 接口 | 备注 | |---|---|---| | 转向反馈 | BRT38-C2M17bit-RT13(CANopen,节点 3,1 Mbps,17 位单圈) | 出厂 500 kbps / 节点 1,必须先改 | | 转向执行 | JMC IHSV-RC 伺服(CiA402,节点 2,速度模式) | `JMC_RATED_CURRENT_MA` 按铭牌 | | 行走 | ODrive ×2(CANSimple,节点 0/1,1 Mbps) | 出厂 250 kbps,必须改成 1 Mbps | | 刹车 | BTS7960 + 电动推杆(无位置反馈,定时开环) | 满行程用 `BRAKETIME` 标定 | | 油门 | 三线 5 V 踏板 → CN29(板载分压) | `THRMIN/THRMAX` 标定 | | 遥控 | HotRC DS650(CH1 转向 / CH2 油门 / CH3 刹车 / CH4 喇叭) | 4 通道捕获 | | 自动驾驶 | 鲁班猫 4 → USB1(USART1,22 字节帧) | 打开串口时别拉 DTR/RTS | | 调试 | USB2(UART5,115200) | 敲 `STAT` / `LIGHT` / `BRAKE` … | > 接线逐根对照看 `kart-mcu/docs/images/flash/wiring.svg`,接口速查看 `PINOUT_CN.md`, > 上电顺序看 `kart-mcu/README_CN.md` §3。 --- ## 5. 编译 / 烧写 / 工具 工具链固定在本机 `D:\ai\toolchain\armgcc\mingw64\bin`(arm-none-eabi-gcc + mingw32-make)。 PC 工具用 .NET Framework 的 **32 位 csc**(`ControlCAN.dll` 是 PE i386,64 位进程加载不了)。 | 做什么 | 命令 | |---|---| | 编译主控 | `D:\ai\car-mcu\kart-mcu\build.bat` | | 编译继电器板 | `D:\ai\car-mcu\relay-can\build.bat` | | 烧写(两块板都一样) | `flash.bat` → 自动(先 ST-Link,再 DAP-Link)
`flash.bat stlink` / `flash.bat dap` / `flash.bat ur`(连不上时 connect-under-reset) | | CAN 上位机 | `relay-can\tools\CanRelayMonitor\build.bat` → `bin\CanRelayMonitor.exe` | | 485 诊断 | `relay-can\tools\Relay485\build.bat` → `bin\Relay485.exe COM6 --sensors` | | CAN 抓包 | `relay-can\tools\CanSniff\build.bat` → `bin\CanSniff.exe 10` | | 上位机截图 | `CanRelayMonitor.exe --sim --shot=ui.png`(模拟器)/ `--485 COM6 --shot=ui.png`(真串口) | | 自检(不碰硬件) | `CanRelayMonitor.exe --selftest`(帧结构、协议字节、反相、联动判据) | 常用 485 诊断: ```bat Relay485.exe --list :: 列串口 Relay485.exe COM6 --status :: 读 K1/K2/超时 Relay485.exe COM6 --k1 on :: 发一帧就退出(锁存) Relay485.exe COM6 --sensors :: 光照(PB1) + 板温(PA7 NTC) Relay485.exe COM6 --sensors-watch 20 :: 连续看 20 s(遮住光敏电阻试方向) Relay485.exe COM6 --adc :: 5 个模拟脚各读一次 Relay485.exe COM6 --led-test :: LED 亮/灭各 60 ms,看 PB1/PA7 跟不跟 Relay485.exe COM6 --de-scan :: 485 没应答时先扫 DE 脚 ``` --- ## 6. 现状(2026-10-29) ### 6.1 已验证 | 项 | 结果 | |---|---| | 继电器板 1.3.2 编译 | `text 10208 / data 4 / bss 1484`,距 32 KB 上限还剩 21 KB | | 继电器板 485 全链路 | COM6 实测:打开 3.5 s 零命令帧;点 K1 只发一帧;杀进程 5 s 后仍 `K1=1 to=0xFF`(真锁存) | | 继电器板 CAN | 板载 TJA1050T 的 VCC 只有 **4.3 V**(datasheet 下限 4.5 V),**外接 TJA1050 模块后收发正常**,固件/帧格式不用改 | | 传感器 | 板温 27.4 ℃(PA7 NTC);光照 PB1 室内原始码值 ≈ 600(484 mV,`LIGHT8` ≈ 37..44),遮住升高、强光降低 | | 失效保护 | 发 `data[3]=100`(1 s)后板子 1 s 自动松开并转快闪 | | 上位机 | `--selftest` 全过(含 `255−x` 反相、联动判据、485/CAN 帧字节) | | 主控固件 | 编译干净(`text 68104 / data 616 / bss 4800`),**未上板** | ### 6.2 未验证 / 待办 | 优先级 | 事项 | |---|---| | 高 | 继电器板"手捂住 → PB1 原始码值升到 200 以上 → K1 吸合"实板验证(目前只在 `--sim` 模拟器里验过) | | 高 | `kart-mcu` 整车联调:编码器改 1 Mbps/节点 3、ODrive 改 1 Mbps、推杆 `BRAKETIME`、踏板 `THRMIN/THRMAX` | | 中 | 自动大灯启用:按实车环境重新标 `LIGHT_ON_RAW` / `LIGHT_OFF_RAW`(现粗标 200 / 150),再把 `LIGHT_AUTO_ENABLE` 改 1 | | 中 | 板载 TJA1050T 供电整改(换 3.3 V 收发器模块最省事,见 `relay-can/README_CN.md` §11.3) | | 低 | 485 DE 脚确认(kart 侧现配 PC0,板上未引出,需飞线) | | 低 | 继电器极性 / 续流 / 带感性负载时的电源跌落 | --- ## 7. 踩过的坑(新任务必读) 1. **光照方向以实板为准:越亮码值越小。** PB1 上这颗器件受光后把引脚往下拉, 遮住码值升高、强光降低。别按"光敏电阻越亮阻值越小"去推分压,推出来是反的。 固件原样上报原始码值,只有上位机 `Light.Display()` 做 `255−x`, 所以界面"越亮越大"、日志里的 `PB1 原始` 和 `mV` 保持真实方向(万用表可对)。 2. **PB1 = 光照,PA7 = 板温**,两路独立。1.3.1 及以前把两路都当 PA7,是错的。 3. **ADC 必须连续模式 + 丢前 200 个**:单次模式读 PB1 会读到上一个通道的残压 (0.54 V vs 真实 0.18 V)。采样前还要灭板载 LED 15 ms(灯就在传感器旁边,会抬 168 mV)。 4. **继电器命令是锁存**:`data[3]=0` 永不自动断开;`1..254` 才是 ×10 ms 的失效保护。 主机只在状态变化时发一帧,别加周期补帧(1.3.0 之前那样会"先松再吸")。 5. **继电器是 PA5/PA6**,不是 PA0/PA1;**PA11/PA12 必须置重映射位**(`SYSCFG_CFGR1`), 漏了 CAN 一点波形都没有,还不报错。 6. **这块继电器板绝对不要 DFU**:PA11/PA12 直接接 CAN 收发器,USB 信号会把收发器打死。 只能 SWD。 7. **测 CAN/485 必须 12 V 供电**。只用 DAP 的 3V3 时收发器不工作,PA11/PA12 被 ESD 二极管 钳低,SWD 读出来像"引脚短路",极易误判芯片坏。 8. **主控别整片擦除**:`0x08004000` 扇区是掉电参数(转向中位、推杆行程、CPR、限速), `-e all` 之后要重新 `CENTER` / `BRAKETIME` / `CPR` 再 `SAVE`。 9. **烧主控时先拔 USB1**(鲁班猫那根),否则一键下载电路可能把板子拉复位。 10. **一个串口只能一个进程**:`CanRelayMonitor` 开着时串口被占,`Relay485` 会打不开; 同理 exe 在跑时 `build.bat` 装不进 `bin\`(会退到 `%TEMP%` 并给提示)。 11. **编码是 UTF-8**。改中文文件请用编辑器/写文件工具,**不要**用 PowerShell `Get-Content | Set-Content`(会按 GBK 重写,整份文件乱码)。 `.bat` 必须**纯 ASCII**(cmd 按 OEM 代码页解析,中文会拆坏命令行)。 12. 控制台里中文显示成乱码是终端代码页问题,**文件本身没问题**;判断内容请直接读文件。 --- ## 8. 文档地图 | 想了解 | 看这里 | |---|---| | 整车固件怎么用、CLI 命令、上电顺序 | `kart-mcu/README_CN.md` | | 主控引脚 / 连接器 / 复用 | `kart-mcu/docs/PINOUT_CN.md` + `images/board/pinout.svg` | | 逐根接线、供电、上电检查 | `kart-mcu/docs/WIRING_CN.md` + `images/flash/wiring.svg` | | CAN / 485 / CLI 协议细节 | `kart-mcu/docs/PROTOCOL_CN.md` | | ODrive 首次配置 | `kart-mcu/docs/ODRIVE_CN.md` | | 继电器板协议、485 帧、排障、台架记录 | `relay-can/README_CN.md` | | 继电器板接线图 | `relay-can/docs/relay_wiring.svg` | | 上位机怎么用、截图、自检输出 | `relay-can/tools/CanRelayMonitor/README_CN.md` | | 主控板原理图 | `DlaBoard_B1_Schematic1_2026-08-01.pdf` | --- ## 9. 版本记录(要点) **relay-can** | 版本 | 内容 | |---|---| | 1.3.2 | 传感器分两路:PB1 光照 + PA7 NTC 板温;ADC 改连续模式;光照方向按实板修正 | | 1.3.1 | 板温改回 PA7 + 10 kΩ NTC 换算(`T10`) | | 1.3.0 | 继电器命令改**锁存**;删除周期补帧;seq 窗口去重;485 状态应答锁存回 `0xFF` | | 1.2.x | CAN 引脚/复用全组合体检、485 附加查询(`77`/`7A`/`73`/`74`)、失效保护 | **kart-mcu** | 版本 | 内容 | |---|---| | v1.2.2 | 行走改 ODrive CANSimple;前进/后退、限速、手动灯光改三段拨动开关;H2 遥控通道与 U7 脚序按原理图修正;自动大灯预留(未启用) | --- ## 10. 仓库约定 - 分支 `master`,远端 `origin` = `https://gitee.com/longcat99/car-mcu.git`。 - 提交身份只写在本仓库:`longcat99 `。 - **不入库**:`build/`、`tools/*/bin/`、`*.o/.elf/.hex/.map`、`.screenshots/`、 以及 `ref-canrelay/`、`ref-servo/`、`ref-vision-follow/` 三个独立参考工程(各有自己的 `.git`)。 - 本机 `core.autocrlf=true`,所以 `.gitattributes` 把 `*.pdf/*.png/*.exe` 标成 binary, 防止 PDF 检出时被加 CRLF 弄坏;文本入库统一 LF。 - 固件版本号在各自 `README_CN.md` 头部维护,改了行为记得同步。