Skip to content

DlaBoard_A — 技术说明(中文版)

MCU: STM32F407(STM32CubeMX + HAL)
来源: 应用层逻辑自 DlaCart(STM32F103,vision-follow-car MCU 部分)迁移而来。与 Jetson 的 22 字节帧协议及 VGUS 串口屏交互与 DlaCart 保持一致(除非本文另有说明)。


1. 概述

DlaBoard_A 实现与 DlaCart 同级的高层行为:

能力说明
工作模式手动、遥控、训练(向主机周期上报)、跟随(接收主机指令)。
模式来源仅串口屏(VGUS) — 变量地址 0x05A1screen.hSCREEN_KEY_MODE_* 键值。没有单独的「模式」GPIO 组。
档位 PRND四路数字量输入(按下接地为低)。屏上 0x05E1 亦可选档;物理开关与屏可并存,GPIO 消抖后更新档位并可 Screen_SetGear() 回写屏。
Jetson 链路USART1,115200 8N122 字节二进制帧,CRC16-MODBUS(与 DlaCart 相同)。
串口屏USART2,9600 8N1,VGUS 风格 0x82 / 0x83screen.c)。波特率与 VGUS 屏出厂值一致,CubeMX .ioc 已固化为 9600。

DlaCart 上的 OLED(SSD1306)在本板 纳入工程。


2. 硬件 / 引脚分配

以外设实例为准,与 DlaBoard_A.iocstm32f4xx_hal_msp.c 一致。下表为迁移固件 设计目标 接线说明。

完整 IO 与外设参数表(逐引脚、波特率、定时器分频、NVIC、Cube 预留脚):见同目录 DlaBoard_A_MCU_IO_CN.md

功能外设 / 引脚说明
JetsonUSART1(常见 PA9 TX / PA10 RX)RX 中断中调用 TrainUART_ReceiveISR()
VGUS 屏USART2(常见 PD5 TX / PD6 RX)Screen_ReceiveISR() + HAL_UART_IRQHandler
CAN(转向伺服)CAN1(PB9 TX / PB8 RX)MX_CAN1_Init USER 区:滤波器 + HAL_CAN_Start()servo_can.c 使用 hcan1
电机 PWMTIM1 CH1 / CH2如 PA8、PE11 等以 Cube 为准;motor_control.c 驱动 htim1
遥控 PWM 输入(转向 / 油门摇杆)TIM3 CH3 / CH4转向=CH3(PC8)、油门摇杆=CH4(PC9)rc_input.cRC_STEER_CHANNEL=TIM_CHANNEL_3/RC_DRIVE_CHANNEL=TIM_CHANNEL_4)使用 htim3。捕获分发见 tim_capture.c
轮速 FGTIM2 CH3 / CH4PA2 / PA3,板上 100Ω 串接 + 10kΩ 下拉到 GND。wheel_speed.chtim2 上以上升沿计数;Board_TuneTimersForCart()ICFilter 设为 8 抑制毛刺。
加速踏板ADC1 IN9(PB1)初始化末段设为连续转换、踏板通道;Battery_GetLevel() 会短暂切通道后恢复。
电池电压ADC1 IN11(PC1)见 §6.2。
档位 P/R/N/DGPIOD 输入PD0=P,PD1=R,PD3=N,PD4=D — 宏见 board_inputs.h低有效,Cube 中配置上拉。
刹车开关GPIOE PE2、PE3上拉输入,=按下;用于训练帧刹车位等逻辑。
原车继电器(停转 / 倒车 / 刹车缸等)固件中未接具体引脚board_relays.c 为占位,硬件确定后在此实现。

2.1 定时器分频(运行时调整)

DlaCart_AppInit()Board_TuneTimersForCart()dla_cart_app.c)在 Cube 初始化之后写入:

  • TIM1:1 kHz PWM 时基(168 MHz 定时器时钟 / 168 / 1000)。
  • TIM2 / TIM3: 计数 1 µs(APB1 定时器时钟 84 MHz / 84),用于输入捕获脉宽与轮速脉冲。

若修改系统时钟或 APB 分频,需重新核算上述 PSC/ARR。


3. 软件架构

3.1 主流程

  • main.c:Cube MX_* 初始化后调用 DlaCart_AppInit(),主循环中调用 DlaCart_AppLoopIteration()
  • dla_cart_app.c:与 DlaCart 等价的状态机(g_steering_modeg_servo、档位、跟随指令、转向/电机/训练发送等)。
  • dla_cart_loop.inc:主循环体(#include 便于维护);PRND 读脚使用 board_inputs.h 宏。

3.2 模块一览

模块文件作用
训练/跟随串口train_uart.c/h组帧发送、RX 环形缓冲、TrainUART_PollFollowCmd()
串口屏screen.c/hVGUS 收发、心跳、键值/地址解析。
转向 CANservo_can.c/h伺服指令集(0x64+id);hcan1
FOC 驱动 CANfoc_can.c/h0x210 下发驱动请求 / 0x211 收状态 / 0x212 收母线遥测;含 UART 台架测试 CLI(FOC/BRAKE/RC?)。
刹车 CANbrake_can.c/h0x220 下发刹车命令给刹车板 DlaCart_v2.1(脉冲式电动刹车)。
遥控 PWMrc_input.c/hTIM3 输入捕获,CH1 转向、CH2 油门摇杆。
电机 PWMmotor_control.c/hTIM1 双通道占空比(行走已改 FOC CAN,本地 PWM 保持停机)。
轮速wheel_speed.c/hTIM2 双通道脉冲,500 ms 窗口 → 0.1 km/h(FOC rpm 不新鲜时的回退)。
捕获分发tim_capture.cHAL_TIM_IC_CaptureCallback → RC 或轮速。
电量board_battery.c/hIN11 采样并恢复 IN9;返回 0–4 供屏显示。
板级输入说明board_inputs.hPRND 引脚宏;注释说明模式仅来自屏。
继电器占位board_relays.c/h原车停转/倒车继电器,待接 GPIO。刹车不在此(见 brake_can)。
模式枚举steering.hMODE_MANUAL / REMOTE / TRAINING / FOLLOW

3.3 中断(stm32f4xx_it.c

中断行为
USART1TrainUART_ReceiveISR()(与 DlaCart 一致,不经 HAL_UART_IRQHandler 收字节)。
USART2Screen_ReceiveISR()HAL_UART_IRQHandler(&huart2)
TIM2HAL_TIM_IRQHandler(&htim2) — 轮速。
TIM3HAL_TIM_IRQHandler(&htim3) — 遥控捕获。

NVIC:TrainUART_InitScreen_InitWheelSpeed_InitRC_Input_Init 内使能。


4. 通信协议

CAN 总线(伺服 / FOC / 刹车)的字节级权威定义见同目录 01_CAN接口规范_CN.md,本节只列要点。 全总线 1 Mbps 经典帧;控制板 hcan1 滤波器全收进 FIFO0,主循环 while 排空逐帧分发。

4.0 CAN 概览

ID方向名称模块
0x210控制板→FOC驱动请求(油门‰/转向‰/flags/档位/seq/timeout)foc_can.c
0x211FOC→控制板行走状态(health/双轮rpm/echo/valid+gear)foc_can.c
0x212FOC→控制板母线遥测(VBUS mV + 母线电流 cA),供屏显foc_can.c
0x220控制板→刹车板刹车命令(apply/seq/timeout/0x42)brake_can.c
0x64+id控制板↔伺服转向伺服指令/反馈servo_can.c

刹车意图 foc_brake(FOC 与刹车板同源):跟随取上位机 brake;否则 刹车开关(PE2/PE3) 或 P 档 或 撤防 任一成立。UART BRAKE 1/0/OFF 为测试旁路。

4.1 Jetson ↔ MCU(USART1)

与 DlaCart 完全一致:

  • 22 字节、小端、SOF 0xAA 0x55CRC16-MODBUS 覆盖字节 [2..19]
  • MCU→主机:0x01 训练状态、0x02 跟随就绪、0x05/0x06 手动/遥控通知、 0x07 采集(SLAM)上报(基础行驶数据;与训练 0x01 分流,便于 Jetson 区分用途)。
  • 主机→MCU: 0x10 跟随控制(转角、油门参考、刹车)。

采集 vs 训练:两者均为 22 字节帧、字段相同,仅 TYPE 不同(训练 0x01 供自动驾驶 训练,采集 0x07 供 SLAM)。IMU 字段为后续帧扩展——当前 22 字节帧仅 [18:19] 2 字节预留,容不下 IMU,待板载 IMU 驱动 + Jetson 帧格式约定后加长。

完整字段表、CRC 说明、Python 示例见同级目录 DlaCart 文档:

  • ../DlaCart/docs/DOCUMENTATION.md(第 5 节)
  • ../DlaCart/docs/TRAINING_PROTOCOL.md

4.2 VGUS 串口屏(USART2)

  • 写变量:0xA5 0x5A + 长度 + 0x82 + 地址 + 数据(screen.c)。
  • 读变量 / 触摸键值:0x83Screen_RxByte() 中解析。
  • 常用地址:SCREEN_ADDR_MODE0x05A1)、SCREEN_ADDR_GEAR0x05E1)、SCREEN_ADDR_SPEED0x05C1)等 — 见 screen.h
  • VBUS 屏显地址:母线电压 SCREEN_ADDR_VBUS_VOLT=0x05EC(0.1V/字)、 母线电流 SCREEN_ADDR_VBUS_CURR=0x05F0(0.1A/字,含符号)。数据来自 FOC 0x212 遥测。
  • 模式键值:手动 0x0010、遥控 0x0008、训练 0x0004、跟随 0x0002、自动 0x0001采集 0x0020(同在 0x05A1,仅键值不同)。

5. 工作模式与档位(澄清)

概念来源
工作模式(手动/遥控/训练/采集/跟随)仅串口屏SCREEN_ADDR_MODE + SCREEN_KEY_MODE_*)。无模式专用 GPIO。
档位 PRND四路 GPIOboard_inputs.h 中 GPIOD 引脚)+ 可选屏上 SCREEN_ADDR_GEAR 键值。

采集模式SCREEN_KEY_MODE_COLLECT=0x0020):行为与训练一致(伺服不使能、读转向角、 可驾驶),但 20ms 上报 TYPE_COLLECT(0x07) 帧给 Jetson 做 SLAM,与训练 TYPE_CTRL(0x01) 分流,避免两功能混用。IMU 字段待扩展(见 §4.1 注与 §8)。


6. ADC

6.1 踏板(IN9 / PB1)

MX_ADC1_Init USER 区在首次配置后设为 连续转换、通道 ADC_CHANNEL_9。主循环用 HAL_ADC_GetValue(&hadc1) 做踏板映射(与 DlaCart 相同粗阈值:原始值约 1100–3100 对应 0–1000 需求)。

6.2 电池(IN11 / PC1)

board_battery.cBattery_GetLevel()

  1. 停止 ADC,配置 ADC_CHANNEL_11,较长采样时间,单次转换。
  2. BAT_VDIV_RATIO 将原始值换为母线电压 mV(默认与 DlaCart 文档中分压思路一致;必须按你板电阻修改:((R_{\mathrm{上}}+R_{\mathrm{下}})/R_{\mathrm{下}}))。
  3. 映射为 0–4(100% / 75% / 50% / 25% / 空)写入屏变量 SCREEN_ADDR_BATTERY
  4. 恢复 ADC_CHANNEL_9(踏板)并重新 HAL_ADC_Start

请按实际电池串数与分压修改 BAT_VDIV_RATIOBAT_*_MV 阈值。


7. 编译与维护

  1. 使用 STM32CubeIDEDebug/ 下 GNU ARM Makefile 编译 DlaBoard_A
  2. 从 Cube 重新生成代码后务必检查:
    • MX_CAN1_Init USER 区是否仍包含 滤波器 + HAL_CAN_Start
    • MX_ADC1_Init USER 区是否仍为 连续模式 + IN9 踏板
    • MX_GPIO_Init USER 区是否仍将 PE2/PE3 配为 上拉输入(若原理图为开关接地);
    • 工程是否仍包含全部 Core/Src 源文件(dla_cart_app.ctrain_uart.c 等)— Cube 可能覆盖 subdir.mk,需人工合并。
  3. 已移除: USART1 上原 ASCII uart_protocol,现统一为 DlaCart 二进制训练/跟随协议

8. SPI / IMU

现状(2026-06:核对代码):main.c 已包含 MX_SPI1_Init()(主模式)与 IMU 片选 PA4 (GPIO 初始化末段拉高空闲)。即 SPI 总线与片选硬件路径就绪,但应用层 (Core/Src.c/.inc尚无 IMU 驱动/寄存器读取代码 —— 没有任何 HAL_SPI_TransmitReceive 业务调用。

这直接影响「采集」功能(需求第 7 条:采集 IMU+速度+方向上报 Jetson 做 SLAM): 采集帧的 IMU 字段当前无数据源。待确认 IMU 型号后补驱动(建议新增 imu_spi.c/h,在主循环定周期读取,填入采集上报帧)。详见 00_集成Review与计划_CN.md §3-6 / §5-Q2。


9. 参考与致谢

  • 协议与行为细节:../DlaCart/docs/DOCUMENTATION.md../DlaCart/docs/TRAINING_PROTOCOL.md
  • 上游仓库与许可:见 DlaCart 根目录 README.md

10. 英文文档

默认英文说明见同目录 DlaBoard_A_Documentation.md