# 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` 头部维护,改了行为记得同步。