NUEDC HARDWARE DICTIONARY

电赛元器件图鉴

接线、代码与上电证据放在同一页。先确认电源和接口,再跑最小例程,最后才进入闭环与整机联调。

18元器件条目
3主控字典
15外设模块
18/18四项资料门禁
返回 Hardware Lab
18 项
01

主控字典

STM32F103C8T6 Blue Pill 主控板

常见 F103 最小系统板,可做云台/执行/轻量底盘主控;模块库里按接口复用,不绑定具体题目。

4/4资料门禁
核心定位
轻量控制板、备用主控、云台/小执行器子系统
代码链路
CubeMX/CubeIDE 或 Keil 生成外设初始化,业务代码放在 main 循环、定时器回调和串口接收回调里
下载调试
SWD 使用 PA13/PA14,保留 NRST 更利于现场救程序
电气边界
GPIO 为 3.3V 逻辑,电机、激光、步进不能从板载 3V3 取电
代码 3接线 5看图 3排故 3

主控历程

阶段说明为什么重要
备用起点先当作轻量基线板,验证最小启动、串口和 I2C 链路。safe-idle、UART 回环和 I2C 扫描都能单独跑通。
外设铺开把 PWM、GPIO 和 ADC 拆成独立 smoke,不把逻辑塞进中断。每个外设都有日志和失败码,方便排查。
模块集成所有外设入口统一成 Init/Tick/GetSnapshot。STOP、超时和默认安全态都能单独验证。
定位适合作为低风险备用主控和练习板。PA13/PA14 保留,救砖成本低。

开发链路 / 适用题型

阶段要做什么可见证据
空工程先跑 safe-idle,确认启动文件、时钟、SWD 和主循环。能下载、复位后 LED/串口心跳正常。
外设 smoke分别跑 UART 回环、I2C 扫描、PWM 空载、GPIO 输入。串口有字节、I2C 有地址、PWM 占空比可测。
模块接入一次只接一个外设,把 Init/Tick/GetSnapshot 分层。每个模块有最小日志和失败码。
题目集成把视觉/姿态/执行器接到 App 状态机,不在中断里跑业务。STOP、超时和默认安全状态能单独验证。
  • 轻量云台
  • 串口/I2C 外设验证
  • 备用主控
  • 单执行器小系统
  • 低风险练习板

落地代码链路

层级入口 / 文件 / 命令验收证据
safe-idle 构建python online-build/tools/build_firmware.py --target stm32f103c8-safe-idle生成 firmware.elf/hex/bin、firmware.map 和 build-manifest.json,只证明启动链路。
下载调试入口PA13=SWDIO、PA14=SWCLK,NRST 建议接出;不要把 SWD 脚复用给普通外设。调试器能 attach、复位后 heartbeat/LED/串口心跳正常。
外设接入模板App_Init -> UartProbe/I2cScan/PwmSmoke -> App_Tick 状态机UART 字节计数、I2C 地址、PWM 占空比和 STOP 路径都有单独日志。

例程字典

例程 / 模板位置 / 目标什么时候用
safe-idle 在线编译模板stm32f103c8-safe-idle只验证工具链、启动文件、链接脚本和空闲主循环,不驱动外设
串口模块模板USART1/USART2 + 环形缓冲接 MaixCAM/JY61P/ZDT TTL 时,先只收帧和打印状态
I2C 调试模板I2C1 + 地址扫描OLED/MPU6050 上车前先扫 0x3C/0x68,确认上拉和线序
PWM/GPIO 执行模板TIM PWM + GPIOTB6612、激光 EN/PWM、舵机先空载低占空比验证

代码怎么调用

F103 先用生成工具把 GPIO/UART/I2C/TIM 初始化好,再在用户代码区写业务调用;不要在中断里做阻塞打印或长计算。

  1. 在 CubeMX/Keil 中开启 SWD,避免把 PA13/PA14 改成普通 GPIO。
  2. 为每个外设先写最小 smoke 函数,例如 UartProbe、I2cScan、MotorLowSpeedTest。
  3. 主循环只调状态机;串口接收只入缓冲;定时器中断只做计数/置标志。
int main(void) {
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_I2C1_Init();
  MX_TIM3_Init();
  App_Init();
  while (1) { App_Tick(); }
}

逐针接线

引脚 / 信号接到哪里为什么这样接
PA13/PA14DAPLink/STLink SWDIO/SWCLK下载调试固定保留;现场故障靠它恢复
PA9 -> 外设 RX;PA10 <- 外设 TX视觉/JY61P/ZDT TTLUART 必须 TX/RX 交叉,GND 共地
PB6/PB7OLED/MPU6050 SCL/SDAI2C1 常用脚;确认模块是否已有上拉
TIMx_CHxTB6612 PWMA/PWMB 或舵机 PWMPWM 尽量用同一组定时器,便于统一频率
5V/3V3/GND小信号模块供电参考大电流执行器另供电,但必须共地

原理图证据与标注

  • 本页已有 Blue Pill 原理图 PDF 来源和本地接口速查 SVG;接线前先看电源、晶振、BOOT、SWD、USB/CAN 复用。
  • PA11/PA12 是 MCU USB/CAN 相关引脚,不等于 CANH/CANL;接 CAN 必须经过收发器。
  • 不同 Blue Pill 克隆板 5V、3V3、BOOT0、PC13 LED 细节可能不同,以板上丝印和实物测试为准。
看图位置重点标注必须确认错了会怎样
电源域5V、3V3、GND、稳压器和 USB 供电路径先确认外设只吃逻辑电源,电机/激光/步进另供电并共地。把板载 3V3 当执行器电源会掉压复位,5V 模块输出直进 IO 也可能超压。
下载恢复PA13/PA14 SWDIO/SWCLK、NRST、BOOT0SWD 和 NRST 保留到排针,BOOT0 默认不误拉高。占用 PA13/PA14 后现场无法下载;BOOT 配错会表现为烧录后不启动。
通信边界PA9/PA10 USART、PA11/PA12 USB/CAN 复用UART 按 TX/RX 交叉;CAN 必须外接收发器后才到 CANH/CANL。把 PA11/PA12 当 CANH/CANL 直连会完全不通,甚至损坏总线侧器件。

上电调试清单

  • SWD 能连接
  • 空工程能下载运行
  • 串口回环能收到
  • I2C 扫描能找到地址
  • PWM 空载输出正确

故障定位

现象常见原因下一步证据
SWD 连不上PA13/PA14 被复用、NRST 未接、BOOT/供电异常断开外设,保留 SWD/NRST,先只下载空工程。
串口无输出TX/RX 未交叉、波特率不一致、GPIO 复用未开用 USB-TTL 做回环,再只发固定 heartbeat。
I2C 找不到 OLED/MPU6050SCL/SDA 接反、无上拉、地址 0x3C/0x3D/0x68/0x69 不一致先跑地址扫描,降低速率并缩短线。
02

主控字典

立创天猛星 MSPM0G3507 M0 主控板

TI MSPM0G3507 主控板,适合底盘控制、传感器采集、PWM/定时器练习和低功耗 M0 题目。按模块接口复用,不绑定某一道题。

4/4资料门禁
核心定位
电赛实时控制主控,适合差速底盘、PWM/编码器、传感器融合和安全状态机
代码链路
TI MSPM0 SDK + SysConfig + driverlib,生成外设初始化后写 App 层状态机
下载调试
SWD/RST 优先;必要时 ROM UART BSL,但要先确认 PA18/BSL 和 TX/RX
推荐架构
M0 管实时闭环和急停,MaixCAM/F407/F103 只发送上层目标或辅助信息
代码 4接线 6看图 3排故 3

主控历程

阶段说明为什么重要
主力落地作为当前项目主力控制板,从 safe-idle 和 SysConfig 起步。先把板级启动、时钟和外设入口统一起来。
工具链固化编译、链接、烧录和救砖命令都固化成可重复流程。TI SDK、CMake/Makefile、pyOCD、ROM BSL 都纳入。
外设扩张JY61P、TB6612、OLED、线阵逐步接入统一应用层。外设都改成 Init/Poll/Snapshot/Command。
安全闭环STOP、DISARM 和故障时命令与 duty 立即归零。电机、激光和步进都走统一安全状态机。

开发链路 / 适用题型

阶段要做什么可见证据
工具链用 TI MSPM0 SDK、SysConfig、GNU Arm/Makefile 跑 safe-idle。本地或在线编译产物 fresh,SWD 可 attach。
板级 ABI固定 BoardApp_Init/BoardApp_Poll 和 runtime 字段,不手改 SysConfig 生成文件。loop_counter、boot_cookie、APP_READY 可读。
外设分层JY61P、TB6612、OLED、线阵都走 Init/Poll/Snapshot/Command。UART 帧计数、PWM/编码器、OLED ACK、line_raw_bits 都有运行态证据。
安全闭环电机/激光/步进先经过 DISARM/ARM/RUNNING/FAULT 状态机。STOP 和 DISARM 后 duty/command 归零。
  • 2026 视觉导航定点小车
  • 差速底盘
  • 传感器融合
  • PWM/编码器闭环
  • 实时安全控制

落地代码链路

层级入口 / 文件 / 命令验收证据
safe-idle 构建python online-build/tools/build_firmware.py --target mspm0g3507-safe-idle生成 fresh 产物;先证明 GNU Arm、链接脚本和启动文件可用。
车载主循环BoardApp_Init -> BoardApp_Poll,外设走 Init/Poll/Snapshot/Commandboot_cookie、loop_counter、APP_READY、模块 runtime 字段可读。
SWD 调试 ABIg_board_app_runtime / g_board_app_swd_control / g_board_app_line_snapshot每次重编后从最新 ELF 解析符号,不复用旧地址。
UART BSL 救援9600 8N1:connection_pack -> 0xBB -> GET_ID -> password/erase/download不能只发 0xBB;每一步记录响应字节和超时。

例程字典

例程 / 模板位置 / 目标什么时候用
safe-idle 在线编译模板mspm0g3507-safe-idle验证 MSPM0 工具链、链接和空闲主循环
2026 天猛星车载最小上板工程骨架本地 MSPM03507各模块例程代码/80_integrated_app已整理 JY61P、线阵、TB6612、OLED 和安全 DISARMED 默认状态
MSPM0 UART BSL 恢复流程Connection frame -> 0xBB -> GET_ID救砖/串口下载时用,不能只发单字节 0xBB
AT8236 + MG513X 速度闭环移植https://github.com/ZhiKong0/nuedc-component-examples/tree/main/motor/at8236-mg513x移植电机驱动、编码器测速和速度 PI

代码怎么调用

M0 代码建议分三层:SysConfig/driverlib 初始化、board_app 驱动封装、App 状态机。执行器必须受 DISARM/STOP 统一安全门控制。

  1. 先在 SysConfig 里固定 UART/I2C/PWM/编码器/ADC 引脚,导出后不要手改生成文件。
  2. 每个外设写 Init、Poll/Tick、GetSnapshot 或 Command 函数,主循环只调 App_Tick。
  3. 电机和激光类输出必须先经过 arm/disarm 状态,调试时默认 DISARMED。
int main(void) {
  SYSCFG_DL_init();
  BoardApp_Init();
  while (1) {
    BoardApp_Tick();
  }
}

逐针接线

引脚 / 信号接到哪里为什么这样接
SWDIO/SWCLK/RSTDAPLink下载、读内存、运行态证明都依赖它
PA18/BSLBSL 模式控制进入 ROM BSL 前必须明确电平状态,避免误触发
UART0 PA0/PA1JY61P 或调试串口已有车载骨架使用 UART0 作为 JY61P 入口
TIMG/TIMA PWMTB6612/AT8236 控制输入电机 PWM 优先用连续定时器资源
I2C0 PA31/PA28SSD1306 OLED已在车载骨架中作为显示调试路径
GPIO/ADC灰度线阵 OUT0..OUTn先做阈值/方向表,再接入闭环

原理图证据与标注

  • 本页已有天猛星板载资源图、MSPM0G3507 pinout 和开源硬件工程入口;查引脚时先用官方 pinout,再看板上接口丝印。
  • CAN_TX/RX 不是 CANH/CANL,必须加 CAN 收发器。
  • 电机、步进、激光另供电,和主控共地;不要把板载 3V3 当执行器电源。
看图位置重点标注必须确认错了会怎样
板载资源官方 pinout、板载资源图、排针丝印先冻结 UART/I2C/PWM/编码器/SWD 的占脚表,再接外设。只看芯片 GPIO 名会忽略板载占脚,导致 OLED、线阵、JY61P 互相抢脚。
下载与救援SWDIO/SWCLK/RST、PA18/BSL、UART BSL TX/RXSWD 优先保留;需要 BSL 时按 PA18 和完整 connection frame 流程。BSL 只发 0xBB 或 TX/RX 接反会表现为无响应,盲目擦写会放大故障。
执行器隔离5V、3V3、GND、VM/VIN 外部供电接口电机、激光、步进电源独立,主控只给逻辑信号且全部共地。执行器电流走主控板会引起复位、ADC 漂移和通信丢帧。

上电调试清单

  • SDK 能编译
  • SWD 能 attach
  • 空工程能烧录
  • UART 有心跳
  • 每个执行器默认 DISARMED

故障定位

现象常见原因下一步证据
编译或烧录失败SDK/工具链缺失、SysConfig 输出不匹配、pyOCD 目标或探针错误先跑 safe-idle,记录命令、产物时间和 pyOCD list 结果。
BSL 无响应没有先发完整 Connection 帧、PA18/BSL 状态不对、TX/RX 接反按 connection_pack -> 0xBB -> GET_ID 顺序复测。
外设代码跑了但车不动安全状态仍 DISARMED、输出编译开关关闭、VM/STBY/GND 问题读 safety/motor_cmd/motor_duty,再决定改代码还是查硬件。
03

主控字典

立创天空星 STM32F407 主控板

STM32F407VxT6 高性能主控板,适合视觉协同、运动控制、SDIO/高速采样和多串口多定时器题目。引脚序号按官方 Pinout 图查。

4/4资料门禁
核心定位
高性能多外设主控,适合多串口视觉协同、复杂云台、多执行器和记录任务
代码链路
STM32CubeMX/CubeIDE 或 Keil,先用官方 Pinout 锁定 P1/P2,再生成 HAL/LL 初始化
下载调试
SWD/JTAG 保留;高速外设和板载资源会占脚,改线前先查原理图
典型角色
主车/复杂外设汇聚板;实时危险执行仍要写 STOP 和超时保护
代码 4接线 5看图 3排故 3

主控历程

阶段说明为什么重要
复杂底盘备选更适合多串口、SDIO、CAN 和多执行器并行的复杂题。P1/P2 的 Pinout 和复用资源要先锁定。
高吞吐整合用 USART DMA + ring buffer 消化高频输入。多路传感和视觉不会堵主循环。
多执行器平台适合电机、激光、步进等多路执行器统一管理。每个执行器都保留 STOP / 限位 / 超时路径。
定位它是重载平台,不是最小样例的首选。调试口和复用要先定死。

开发链路 / 适用题型

阶段要做什么可见证据
Pinout 冻结先按官方 P1/P2 和板载资源表锁定 UART/I2C/SPI/TIM。接口分配表写清楚,SWD/JTAG 未占用。
外设 smoke逐个验证多 UART、SPI/I2C IMU、PWM/编码器、SDIO/日志。每个接口有独立最小例程和日志。
并发通信串口接收用 DMA/中断 + ring buffer,App 层统一调度。丢帧/超时不会阻塞主循环。
复杂题集成把视觉、云台、电机和记录分到状态机,不让驱动层直接决策。每个执行器都有 STOP、限位和超时路径。
  • 复杂底盘
  • 多串口视觉协同
  • 云台打靶
  • SDIO 记录
  • 多执行器系统

落地代码链路

层级入口 / 文件 / 命令验收证据
safe-idle 构建python online-build/tools/build_firmware.py --target stm32f407ve-safe-idle生成 F407 safe-idle 产物,确认 M4 工具链和链接脚本。
Pinout 冻结先查官方 P1/P2 交互式 Pinout,再生成 CubeMX/CubeIDE 工程。每个 UART/I2C/SPI/TIM 都有唯一占用记录,SWD/JTAG 保留。
并发接收USART DMA/IT -> ring buffer -> App_Tick 解析记录 rx_bytes、last_frame、checksum_error,不让阻塞接收卡住主循环。
执行器安全Motor/Laser/Stepper 只接受 App 层语义命令STOP、限位、超时和 FAULT 均能单独触发。

例程字典

例程 / 模板位置 / 目标什么时候用
safe-idle 在线编译模板stm32f407ve-safe-idle验证 F407 工具链、启动文件和空闲工程
多 UART 外设模板USART + DMA/IT接 MaixCAM、串口屏、JY61P、ZDT TTL 时先分配优先级
SPI/I2C IMU 模板https://github.com/ZhiKong0/nuedc-component-examples/tree/main/imu/icm42688-hardware参考 ICM42688 驱动、OLED、编码器和步进代码组织
云台/激光控制模板本地 ZDT/F103 云台资料可移植先禁激光,只测云台 STOP、限位和低速点动

代码怎么调用

F407 适合把通信、记录和多外设集中起来,但代码上必须分层:驱动层不做业务决策,App 层统一处理状态和安全。

  1. 先按官方 Pinout 选 P1/P2 引脚,检查 TF/LCD/音频/按键/LED 是否占用。
  2. 串口接收优先 DMA/中断 + ring buffer,避免阻塞主循环。
  3. PWM/编码器通道尽量按 TIM 成组规划,方便同步和频率统一。
void App_Tick(void) {
  Vision_Poll();
  Imu_Poll();
  MotorSafety_Update();
  Actuator_Update();
}

逐针接线

引脚 / 信号接到哪里为什么这样接
P1/P2 80P所有外设排针必须先查官方交互式 Pinout,不能只看 GPIO 名
PA13/PA14/NRSTSWD 调试器保留下载和现场恢复能力
USARTx TX/RXMaixCAM/JY61P/ZDT/串口屏多串口要先分配优先级和波特率
I2C/SPIOLED/IMU/Flash短线、共地、确认上拉或 CS 电平
TIMx CHxPWM/编码器/舵机多轴控制要避免通道冲突

原理图证据与标注

  • 本页已有官方 Pinout、原理图总览和晶振原理图;接线前先查板载外设占脚。
  • F407 IO 仍按 3.3V 逻辑处理;5V 模块输出接入前必须查电平兼容。
  • CAN/RS485 都需要外部收发器或板载接口确认,不能把 MCU 引脚直接接总线。
看图位置重点标注必须确认错了会怎样
P1/P2 排针官方 80P 引脚编号图和原理图总览每个 USART/I2C/SPI/TIM 通道先写入接口分配表。F407 外设多但复用也多,未冻结 pinout 会让后期连线反复返工。
调试口PA13/PA14、NRST、JTAG/SWD 相关跳线比赛现场保留 SWD/JTAG 下载恢复能力。把调试口当普通 IO 后,卡死时只能拆线或进 Bootloader 救。
总线接口CAN/RS485/USB/SDIO 外围电路和 3.3V 逻辑域总线侧确认是否有收发器、终端电阻和外部接口保护。MCU TX/RX 直连差分总线、5V 信号直入 IO 都会造成通信失败或硬件风险。

上电调试清单

  • Pinout 表已确认
  • SWD 能连接
  • 串口分配表已写
  • 板载占脚已排除
  • STOP/超时保护已验证

故障定位

现象常见原因下一步证据
某个外设初始化后另一个外设失效P1/P2 引脚复用或 TIM/USART 通道冲突回到 Pinout 表,按外设组重新分配。
高速通信丢帧阻塞接收、优先级不当、DMA 缓冲过小改为 ring buffer,先只记录计数和 last_frame。
CAN/RS485 不通把 MCU TX/RX 当成总线线直接接,缺收发器或终端确认收发器、电源、终端电阻和总线侧线序。
04

外设模块

TB6612FNG 双路直流电机驱动

用于驱动两路直流电机;主控只给 PWM/GPIO,电机电流走 VM。

4/4资料门禁
用途
两路有刷直流电机 H 桥驱动;主控只给 PWM/GPIO,电机电流走 VM
调用方式
PWM 控速度,AIN/BIN 控方向,STBY 作为总使能
接线风险
VM 和 VCC 分开;编码器线不接 TB6612;电机上电前架空车轮
代码 3接线 6看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
驱动 APITb6612_Init -> Tb6612_SetChannel(MOTOR_A/B, -1000..1000) -> Tb6612_StopsetSpeed 内部统一方向脚、PWM、刹车/滑行策略。
天猛星接线约定PWMA=PA12、PWMB=PA13;方向脚 PB17/PB19/PA16/PB24;STBY 按板子实际拉高或由 GPIO 控制。读 motor_cmd、motor_drive、motor_duty、safety_state 后再判断代码/硬件。
低速 smokeARM -> 40..90 permille -> 800..1200 ms -> STOP -> DISARM轮子架空,STOP 后 command/duty 归零,编码器 delta 与电机方向一致。

代码怎么调用

把每路电机封装成 setSpeed(-1000..1000),函数内部决定方向脚和 PWM 占空比;所有输出受 motorEnable/stop 统一控制。

  1. 初始化 PWMA/PWMB 为同频 PWM,AIN1/AIN2/BIN1/BIN2/STBY 为推挽输出。
  2. 启动前 STBY 拉低、PWM=0;确认方向脚后再 STBY 拉高。
  3. 速度为正反向时互斥方向脚;速度为 0 时 PWM=0 并按刹车/滑行策略处理。
void Motor_Set(int left, int right) {
  Tb6612_SetChannel(MOTOR_A, left);
  Tb6612_SetChannel(MOTOR_B, right);
}

逐针接线

引脚 / 信号接到哪里为什么这样接
VM电机电源正极承载电机电流,按电机电压选择
VCC主控 3V3/5V 逻辑电源只供芯片逻辑,不等于电机电源
GND主控地、电池地控制信号必须共地
PWMA/PWMB主控 PWM 输出调速
AIN1/AIN2/BIN1/BIN2主控 GPIO决定两路电机方向
AO1/AO2/BO1/BO2左右电机两根电机线只接电机绕组,不接编码器

原理图证据与标注

  • 本页包含 Pololu 最小接线图和原理图,可用来确认 VM/VCC/GND/STBY 关系。
  • 红板模块丝印可能不同,先用万用表和丝印确认 VM、VCC、GND。
看图位置重点标注必须确认错了会怎样
双电源VM、VCC、GND、板上滤波电容VM 接电机电源,VCC 接逻辑电源,两路地必须相连。VM/VCC 混接会导致电机不转、主控复位,严重时损坏驱动板。
使能脚STBY、PWMA/PWMB、AIN/BIN 到芯片脚STBY 默认安全态,PWM 和方向脚上电先归零。STBY 悬空或方向脚未初始化会出现上电乱转。
输出端AO1/AO2、BO1/BO2 与电机端子输出端只接电机绕组,编码器 A/B 不接 TB6612。把编码器线接到 H 桥输出会烧传感器或主控输入。

上电调试清单

  • 不接电机测 PWM
  • STBY 默认低
  • 单路空载低速
  • 方向反了记录软件符号
  • 再接编码器闭环

故障定位

现象常见原因下一步证据
PWM 有波形但电机不转VM 未供电、STBY 未拉高、GND 未共地或电机线未接到 AO/BO轮子架空,先测 VM/VCC/GND/STBY,再单路 40-90 permille。
上电就乱转方向脚/PWM 未默认归零,安全门未生效上电 STBY 低、PWM=0,DISARMED 后再允许输出。
闭环越调越炸电机方向、编码器方向、左右轮映射不一致先修符号和左右映射,不要先调 PID。
05

外设模块

MG310 GMR 编码器电机

电机两线进驱动器,编码器四线进主控;最容易接错。

4/4资料门禁
用途
带 A/B 相编码器的直流减速电机,电机线进驱动器,编码器线进主控
调用方式
驱动器负责给电机供电;主控用定时器编码器模式、GPIO 中断或定时采样读取 A/B 相
接线风险
6P 线序必须按实物确认,不能把电机线接到主控 IO
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
编码器读取Encoder_ReadCount -> Encoder_Tick -> speed_count = now - last只接 VCC/GND/A/B 手转轮,count 和 raw A/B 都变化。
方向符号先定义车体前进时每侧 encoder delta 的正方向。目标正速度时,左/右轮测得速度也为正;不一致先改 sign。
驱动分离M+/M- 只接 H 桥输出;A/B/VCC/GND 只进主控编码器接口。电机转动和编码器计数可以独立 smoke。

代码怎么调用

先写 Encoder_GetCount/Encoder_GetDelta,再用定时任务计算速度;闭环前只手转轮子验证计数方向。

  1. A/B 相接主控成对输入,开启上拉或按模块输出类型配置。
  2. 固定周期读取 count 差分得到速度,方向由 A/B 相位或 count 正负决定。
  3. 把方向符号和电机 M+/M- 软件符号统一,再进入速度闭环。
void Encoder_Tick(void) {
  int32_t now = Encoder_ReadCount();
  motor.speed_count = now - motor.last_count;
  motor.last_count = now;
}

逐针接线

引脚 / 信号接到哪里为什么这样接
1 电机+TB6612/AT8236 输出一端电机绕组,不接主控
6 电机-TB6612/AT8236 输出另一端反接只改变电机物理方向
2 编码器 GND系统 GND编码器信号参考地
5 编码器 VCC3V3/5V按实物版本确认输出电平
3/4 A/B 相主控编码器输入测速和方向反馈

原理图证据与标注

  • 本页已有 MG310 6P 线序图和装配参考图;真正接线前仍要对照你手上插头方向。
  • A/B 相反接不会烧,但闭环方向会错;电机线接错到 IO 才危险。
看图位置重点标注必须确认错了会怎样
6P 方向插头缺口、线色、卖家 6P 线序图先画出你手上插头从 1 到 6 的实际顺序。套用别的电机线序最容易把电机线接到 MCU IO。
编码器侧ENC VCC、ENC GND、A 相、B 相只接编码器时手转轮子,raw A/B 和 count 都变化。A/B 反接不会烧,但会让速度闭环符号反掉。
电机侧M+、M- 与 H 桥 AO/BO 输出电机两线只进驱动器输出,不直接进主控。主控 GPIO 直驱电机必然过流,且会把噪声打进逻辑地。

上电调试清单

  • 只接编码器供电
  • 手转轮看计数
  • 记录正方向
  • 接驱动器空载低速
  • 最后开速度环

故障定位

现象常见原因下一步证据
手转轮计数不变编码器 VCC/GND/A/B 线序错、输入无上拉或引脚配置错只接编码器,读 raw A/B,再接驱动器。
计数方向反A/B 相顺序与软件坐标不一致交换 A/B 或改 encoder sign,记录正方向。
电机转但速度为零电机线接对但编码器线没进主控分开验证 M+/M- 和 A/B,不把电机线接 IO。
06

外设模块

MG513X / MG513XL 霍尔编码器直流减速电机

12V 1:28 金属减速电机;电机绕组进驱动器,A/B 编码器反馈进主控,适合小车底盘和中等负载闭环。

4/4资料门禁
用途
12V 直流减速电机 + 霍尔/GMR 编码器,适合小车底盘速度闭环
调用方式
电机 M+/M- 接 H 桥;编码器 A/B 接主控计数;速度 PI 在主控里跑
接线风险
不同版本 6P 插头线序可能不同,先看卖家/实物线序图
代码 3接线 4看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
编码器驱动https://github.com/ZhiKong0/nuedc-component-examples/blob/main/motor/at8236-mg513x/firmware/common/mg513x_encoder.c先移植 count/delta/方向符号,再进入速度闭环。
速度环https://github.com/ZhiKong0/nuedc-component-examples/blob/main/motor/at8236-mg513x/firmware/common/motor_speed_pi.c单轮限幅 200-300 permille,目标正速度时 measured speed 也为正。
接线证据https://github.com/ZhiKong0/nuedc-component-examples/blob/main/motor/at8236-mg513x/docs/wiring.md6P 插头方向、线色和 A/B 相顺序必须按实物记录,不套 MG310 旧线序。

代码怎么调用

推荐直接参考 AT8236 + MG513X 例程,把驱动器输出、编码器计数、速度 PI 三件事拆开。

  1. 移植 at8236_motor.c/h 或等价 H 桥驱动,只负责输出方向和 PWM。
  2. 移植 mg513x_encoder.c/h 或用定时器编码器模式读取 A/B 相。
  3. 固定周期调用 motor_speed_pi.c,把目标速度换成 PWM 输出。
Motor_SetTarget(left_target, right_target);
Encoder_UpdateDelta();
MotorSpeedPi_Tick();
At8236_ApplyPwm();

逐针接线

引脚 / 信号接到哪里为什么这样接
M+ / M-AT8236/TB6612 电机输出承载电机电流
ENC VCC3V3/5V按编码器版本供电
ENC GND系统 GND必须与主控/驱动共地
A/B 相主控 TIM 编码器输入速度和方向反馈

原理图证据与标注

  • 本页已有 MG513X 6P 接线示意、产品参数表和编码器参数图;它们用于确认版本差异。
  • 闭环发散时优先查方向符号:M+/M-、A/B 相、左右轮坐标三者必须统一。
看图位置重点标注必须确认错了会怎样
版本线序MG513X/MG513XL 参数图、6P 接线示意、实物线色按实物记录 M+/M-、ENC VCC/GND、A/B 相。霍尔/GMR 版本线序不同,照抄旧 MG310 线序会让反馈和电机错位。
反馈入口A/B 相到主控定时器/捕获输入左右轮分别手转,确认 delta 属于对应车轮。左右编码器通道接反会出现一边动、另一边计数的假象。
功率路径驱动板输出端、电源端和电机堵转电流单轮低占空比空载验证后再闭环。方向符号未统一时直接加 PI,会表现为越调越冲和发热。

上电调试清单

  • 手转计数方向
  • 单轮空载
  • 左右轮符号
  • 低速 PI
  • 堵转/过流保护

故障定位

现象常见原因下一步证据
低速抖动或闭环发散M+/M-、A/B 相、左右轮坐标三者符号不一致先单轮空载,比较命令方向和 encoder delta。
一个轮子动另一个计数变左右编码器通道映射接反手转左/右轮分别读 raw AB 和 count。
堵转或发热负载过大、PWM 太高、保护缺失限幅低速,加入 STOP/过流/超时保护。
07

外设模块

AT8236 双路编码器直流电机驱动

比普通 TB6612 板更适合带霍尔编码器的小车底盘;标准版把电机输出和编码器端口都集中到驱动板上。

4/4资料门禁
用途
双路直流电机驱动,适合带编码器底盘;标准版把电机和编码器接口集中到板上
调用方式
和普通 H 桥一样写方向/PWM;编码器反馈仍进主控计数
接线风险
标准版和 Lite 版排针不同,5V/3V3 是输入还是输出要看丝印
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
H 桥驱动文件https://github.com/ZhiKong0/nuedc-component-examples/blob/main/motor/at8236-mg513x/firmware/common/at8236_motor.c只负责控制 IN1/IN2/PWM,不把编码器逻辑塞进驱动输出层。
编码器/PI 配套https://github.com/ZhiKong0/nuedc-component-examples/tree/main/motor/at8236-mg513xat8236_motor、mg513x_encoder、motor_speed_pi 三层分开移植。
上车前 smokehttps://github.com/ZhiKong0/nuedc-component-examples/blob/main/motor/at8236-mg513x/docs/debug_checklist.md按编码器、驱动、闭环顺序验证;任何异常先 STOP/DISARM。

代码怎么调用

把 AT8236 当成双路 H 桥:控制输入由主控输出,编码器 A/B 由主控读取,驱动板不替你做闭环。

  1. 先按 wiring.md 区分标准版/Lite 版接口。
  2. AIN/BIN 或 PWM/DIR 接主控输出,E1/E2 编码器线接主控输入。
  3. 单路低速 smoke 通过后再双路同向、反向、差速测试。
At8236_SetMotor(LEFT, pwm_left);
At8236_SetMotor(RIGHT, pwm_right);
left_delta = Encoder_LeftDelta();
right_delta = Encoder_RightDelta();

逐针接线

引脚 / 信号接到哪里为什么这样接
VIN/VM电机电源不要从主控板取电
GND主控地/电池地控制和编码器反馈必须共地
AIN1/AIN2/BIN1/BIN2主控 GPIO/PWM控制双路方向和速度
E1A/E1B/E2A/E2B主控编码器输入反馈仍由主控读取
AO/BO 或电机端口左右电机绕组承载电机电流

原理图证据与标注

  • 本页已有标准版接口说明、接线示例和 Lite 版引脚图;接线时先确认自己是哪一版。
  • 如果板上提供 5V 输出,不要反向把主控 5V 强灌进去,先查丝印/手册。
看图位置重点标注必须确认错了会怎样
版本识别标准版接口说明、Lite 版引脚图、板上丝印先确认自己手上是哪一版,再决定 5V/3V3、控制排针和编码器端子。标准版和 Lite 版混用线表会导致供电或控制脚接错。
电机电源VIN/VM、GND、电机输出 AO/BO驱动板吃独立电机电源,主控只接控制信号并共地。GND 不共地时 PWM 看似有波形但驱动无效。
编码器通道E1A/E1B、E2A/E2B 到主控输入驱动板可能只是汇线,编码器仍要进主控计数。只把电机接到驱动板而没把编码器接回主控,闭环速度会一直为 0。

上电调试清单

  • 版本确认
  • VM/GND 确认
  • 单路空载
  • 编码器计数
  • 速度闭环

故障定位

现象常见原因下一步证据
标准版和 Lite 版线接不上接口版本不同,5V/编码器/控制排针定义不同先按丝印和手册确认版本,再照接线表改线。
驱动板有电但主控控制无效GND 未共地、控制模式脚不对、PWM/DIR 接反只测单路输入脚和输出端,暂不接闭环。
编码器反馈异常驱动板只过线不解码,编码器仍要接主控确认 E1A/E1B/E2A/E2B 进主控计数脚。
08

外设模块

MaixCAM Pro / K230 / OpenMV 视觉模块

视觉模块自己识别目标,只把 valid/dx/dy 发给主控。

4/4资料门禁
用途
视觉协处理器,负责识别目标并把少量结果发给实时主控
调用方式
MaixPy/OpenMV 风格脚本识别目标,UART 输出 valid/dx/dy/id
接线风险
不要让视觉板直接控制危险执行器;主控必须有丢帧停车策略
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
视觉脚本MaixPy/OpenMV:检测目标 -> 输出 V,valid,dx,dy,confidence,seq\nUSB 串口先能连续看到固定格式帧,遮挡目标时 valid=0。
主控接收UART RX ring buffer -> 按换行解析 -> Vision_Snapshot(valid, dx, dy, age_ms)记录 vision_rx_bytes、last_seq、bad_frame、age_ms,不让解析阻塞主循环。
丢帧保护age_ms > 100~200 或 valid=0 时目标失效,底盘/云台进入降级或 STOP拔掉 TX 或盖住镜头后,控制输出在超时内归零。

代码怎么调用

视觉侧只输出结构化小帧,主控侧解析后进入状态机;先不要传大图片或复杂 JSON。

  1. 视觉脚本计算目标是否有效、中心偏差 dx/dy、目标编号 id。
  2. UART 每 20-50ms 发一帧简短文本或二进制帧。
  3. 主控超过 100-300ms 没收到有效帧就降级或停车。
# MaixCAM side
uart.write(f"V,{valid},{dx},{dy},{target_id}\n")

// MCU side
if (VisionFrame_Parse(line, &vision)) App_SetVision(vision);

逐针接线

引脚 / 信号接到哪里为什么这样接
VBUS/VSYSUSB/5V 供电视觉峰值电流较大,供电要稳
GND主控 GNDUART 必须共地
A16/UART0_TX主控 RX发送识别结果
A17/UART0_RX主控 TX接收阈值/模式配置,可选
USB电脑调试现场调曝光、阈值、模型和日志

原理图证据与标注

  • 本页已有 MaixCAM Pro 完整 IO 图;A16/A17、A15/A27 等编号以官方 IO 图为准。
  • 视觉板 IO 多为 3.3V 逻辑,和 5V 主控/模块相接前查电平。
看图位置重点标注必须确认错了会怎样
UART0A16/UART0_TX、A17/UART0_RX 与官方 IO 图A16 接主控 RX,A17 接主控 TX;只单向上报时可先不接 RX。TX/RX 未交叉或选错 UART 组,会表现为主控收不到视觉结果。
供电VBUS、VSYS、3V3、GND视觉板用稳定 5V/USB 供电,UART 与主控共地。K230 峰值电流不足会重启,主控侧只看到断续乱码或丢帧。
扩展 IOA15/A27 I2C5、A18/A19、A28/A29、SPI4只把必要信号接到主控,IO 按 3.3V 逻辑处理。把视觉板当 5V IO 或让它直接控制危险执行器,会绕过主控安全状态机。

上电调试清单

  • USB 调试正常
  • 脚本能跑
  • UART 文本可读
  • 主控丢帧保护
  • 现场曝光参数可调

故障定位

现象常见原因下一步证据
主控收不到视觉结果TX/RX 未交叉、波特率不一致、视觉脚本未发帧先用 USB 调试脚本,再发固定 V,1,0,0 帧。
识别结果偶发跳变曝光、阈值、帧率或现场光不稳定输出 valid/confidence,主控加连续帧确认和超时降级。
视觉板供电重启USB/5V 峰值电流不足或地线压降独立稳压供电,UART 与主控共地。
09

外设模块

JY61P UART 姿态模块

串口输出角度/角速度,比 MPU6050 更适合快速调通。

4/4资料门禁
用途
快速获得姿态角/角速度的 UART 模块,适合先把车跑起来
调用方式
串口收 WIT 帧,调用 wit_c_sdk 更新寄存器,再读取 Roll/Pitch/Yaw
接线风险
TX 接主控 RX;只读姿态时 RX 可先不接;坐标系方向要贴标签
代码 3接线 4看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
SDK 文件https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/jy61p-sdk/wit_c_sdk.cUART 收到的每个字节都喂给 WitSerialDataIn。
寄存器定义https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/jy61p-sdk/REG.h按 Roll/Pitch/Yaw 寄存器换算 raw / 32768 * 180。
运行态证明uart_rx_bytes、jy61p_sync_bytes、jy61p_last_frame_id、jy61p_bad_checksums、jy61p_yaw_cdeg先证明 0x55/0x51/0x52/0x53 帧稳定,再把 yaw 接进控制。

代码怎么调用

移植 REG.h、wit_c_sdk.c/h,把 UART 收到的每个字节喂给 WitSerialDataIn,再从回调或寄存器读角度。

  1. 初始化 UART 波特率,常见先试 9600 或 115200。
  2. 串口中断/DMA 收字节后调用 WitSerialDataIn(byte)。
  3. 收到角度寄存器更新后换算 Roll/Pitch/Yaw,注意单位和坐标系。
void Uart_RxByte(uint8_t b) {
  WitSerialDataIn(b);
}
yaw_deg = sReg[Yaw] / 32768.0f * 180.0f;

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC3V3/5V按模块规格和丝印供电
GND主控 GND必须共地
TX主控 RX模块输出姿态帧
RX主控 TX需要配置输出内容/校准时再接

原理图证据与标注

  • 本页已有立创接线参考图和 UART 接线 SVG;接线图重点是 TX/RX 交叉和共地。
  • JY61P 输出角度不等于车体控制坐标,安装方向要固定并在代码里统一符号。
看图位置重点标注必须确认错了会怎样
四线接口VCC、GND、TX、RX 接线参考图TX 到主控 RX,RX 到主控 TX;只读姿态可先接 VCC/GND/TX。TX/RX 接反时 UART 有配置但没有任何有效 0x55 帧。
电源电平模块规格、VCC 范围、串口电平确认模块和主控 UART 电平兼容,必须共地。电平不兼容会造成乱码、帧校验错或 IO 风险。
安装方向模块坐标箭头、车体前进方向、固定螺丝位把 yaw/pitch/roll 和车体坐标贴标签,代码里统一符号。安装方向未定义时,即使通信正确,控制方向也会反。

上电调试清单

  • 串口有帧
  • 帧头正确
  • 静置 yaw 漂移可接受
  • 转动方向正确
  • 异常丢帧不阻塞控制

故障定位

现象常见原因下一步证据
UART 字节计数为 0供电、GND、TX/RX、pinmux、波特率或中断错误先用 USB-TTL 看模块是否输出,再接主控 RX。
有字节但没有 0x55 帧波特率/输出模式不匹配,或模块不是 WIT 协议检查 0x55 0x51/0x52/0x53 和 checksum。
yaw 方向不对或漂移安装方向和车体坐标未统一,或没有静置校准贴方向标签,记录符号,静置测漂移。
10

外设模块

MPU6050 I2C 姿态模块

I2C 加速度/陀螺仪模块,需要滤波和姿态解算。

4/4资料门禁
用途
裸 6 轴 IMU,适合练 I2C、滤波和姿态解算
调用方式
I2C 写 PWR_MGMT_1 唤醒,再连续读加速度/陀螺仪寄存器
接线风险
SCL/SDA 需要上拉;AD0 决定 0x68/0x69 地址
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
驱动入口https://github.com/ZhiKong0/nuedc-component-examples/tree/main/imu/mpu6050-driver先跑 WHO_AM_I=0x68,再读 accel/gyro raw,最后才上 DMP 或互补滤波。
I2C 适配https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/mpu6050-syscfg/mpu6050-oled-software-i2c.syscfgI2C scan 能看到 0x68/0x69;SCL/SDA 低速短线稳定 ACK。
姿态读取MPU6050_Init -> CalibrateBias -> ReadAccelGyro -> Imu_Update静止时 gyro bias 小、accel 约 1g,控制环里只读 snapshot 不阻塞。

代码怎么调用

先做 I2C 扫描确认地址,再写初始化,最后定时读取原始量并做零偏/滤波。

  1. 扫描 0x68/0x69,确认 VCC/GND/SCL/SDA。
  2. 写 0x6B=0x00 唤醒,配置量程和滤波。
  3. 周期读取 0x3B 起始的 14 字节,换算 ax/ay/az/gx/gy/gz。
i2c_write(MPU_ADDR, 0x6B, 0x00);
i2c_read(MPU_ADDR, 0x3B, buf, 14);
ax = (int16_t)((buf[0] << 8) | buf[1]);

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC3V3 优先模块虽可能带稳压,但 3.3V 逻辑更稳
GND系统 GNDI2C 参考地
SCL/SDA主控 I2C时钟和双向数据
AD0GND/VCC选择地址 0x68/0x69
INT主控中断脚数据就绪可选

原理图证据与标注

  • 本页已有 MPU6050 Pinout、原理图和 Arduino 接线参考;先看地址、上拉和电源域。
  • 如果同一 I2C 上还有 OLED,先确认地址不冲突,再降低线长和速率。
看图位置重点标注必须确认错了会怎样
I2C 总线SCL、SDA、上拉电阻、线长SCL/SDA 不反接,同总线 OLED 地址不冲突。上拉不足或线太长会导致偶发 NACK、WHO_AM_I 失败和控制卡顿。
地址脚AD0 到 GND/VCC 的连接AD0=GND 通常 0x68,AD0=VCC 通常 0x69。地址假设错会让扫描不到或和另一个 IMU 冲突。
电源与中断VCC、GND、INT、模块稳压/电平转换优先 3V3 逻辑,INT 可选接中断脚并做去抖/标志位。电机噪声进地线会让姿态噪声变大,INT 悬空触发会造成误读。

上电调试清单

  • I2C 扫描
  • WHO_AM_I 正确
  • 静态零偏
  • 姿态方向
  • 控制环非阻塞读取

故障定位

现象常见原因下一步证据
I2C 扫不到 0x68/0x69SCL/SDA 接反、AD0 状态不明、上拉不足先扫地址,短线低速,确认 AD0 到 GND/VCC。
WHO_AM_I 不对地址错、器件不是 MPU6050、总线被其他模块拉住单独接模块并读 0x75。
姿态噪声大零偏未校准、线束长、电机噪声进地线静态零偏,远离电机线,控制环非阻塞读取。
11

外设模块

BNO085 / BNO08X 九轴融合姿态模块

自带传感器融合,能直接输出姿态;比裸 MPU6050 更省调参时间。

4/4资料门禁
用途
自带融合的姿态模块,适合少调参拿稳定姿态
调用方式
I2C/SPI 用库读取 report;UART-RVC 模式可直接解析姿态帧
接线风险
PS0/PS1 决定接口模式,必须和例程一致
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
UART-RVC 驱动https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/bno08x-uart-rvc/bno08x_uart_rvc.c能稳定解析 yaw/pitch/roll、accel 和 frame counter,校验错误计数不增长。
模式固定按 PS0/PS1 选择 UART-RVC 或 I2C,固件与接线只保留一种模式上电后读取模式与例程一致;不要一边接 I2C 一边跑 UART 例程。
应用快照Bno08x_Poll -> Bno08x_GetSnapshot(yaw, pitch, roll, age_ms)age_ms 过大时控制层不再使用旧姿态;静置 yaw 漂移可记录。

代码怎么调用

比赛快调优先 UART-RVC:串口收固定帧,解析 yaw/pitch/roll;需要完整 report 再上 I2C/SPI 库。

  1. 按 PS0/PS1 选择 UART-RVC 或 I2C 模式。
  2. UART 模式先确认波特率和帧头,再解析欧拉角。
  3. I2C 模式先跑官方/Adafruit 示例,再移植到主控。
if (Bno08xRvc_ParseByte(byte, &pose)) {
  app.yaw = pose.yaw_deg;
  app.pitch = pose.pitch_deg;
}

逐针接线

引脚 / 信号接到哪里为什么这样接
VIN/GND3V3/5V 与系统地按模块板载稳压范围
SCL/SDA主控 I2C完整 report 模式
TX/RX主控 UARTUART-RVC 快速姿态帧
PS0/PS1固定电平选择接口协议
RST/INTGPIO/中断复位和数据就绪可选

原理图证据与标注

  • 本页已有 Adafruit Pinout 图;不同 BNO08x 模块 PS0/PS1 丝印和默认上拉可能不同。
  • UART-RVC 适合先跑通,完整融合参数和高频 report 再考虑 I2C/SPI。
看图位置重点标注必须确认错了会怎样
接口模式PS0、PS1、I2C/SPI/UART 引脚说明PS0/PS1 的电平和例程接口一致。模式脚错时,代码完全正常也不会有任何有效帧或 ACK。
电源VIN、3Vo、GND、RSTVIN 按模块规格供电,3Vo 只作小负载参考,RST 不悬空误复位。把 3Vo 当外设电源或供电不足,会造成姿态输出断续。
数据口TX/RX 或 SCL/SDA 到主控UART-RVC 先 TX/RX 交叉;I2C 模式确认上拉和地址。接口线同时接多种模式会互相拉扯,表现为偶发错误帧。

上电调试清单

  • 模式脚确认
  • 串口/I2C 有数据
  • 静置稳定
  • 转动方向正确
  • 丢帧有保护

故障定位

现象常见原因下一步证据
接口模式不对PS0/PS1 电平和例程不一致先固定 UART-RVC 或 I2C 模式,不混用例程。
有数据但角度跳report 类型/坐标系解析错或丢帧打印 frame id、时间戳和 yaw/pitch/roll。
I2C 不稳定上拉、线长、电源或地址冲突先 UART-RVC 跑通,再回到 I2C 完整 report。
12

外设模块

ICM42688 / ICM-42688-P 六轴 IMU

高性能三轴陀螺仪 + 三轴加速度计;输出原始量,需要你自己滤波/融合。

4/4资料门禁
用途
高性能 6 轴 IMU,适合高速采样和自写滤波
调用方式
I2C/SPI 读写寄存器,配置量程/ODR/FIFO 后读原始加速度和角速度
接线风险
它没有磁力计,yaw 需要融合/约束,不能指望长期绝对航向
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
驱动文件https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/icm42688-hardware/icm42688_driver.c先读 WHO_AM_I,再确认 accel/gyro 原始值随姿态变化。
初始化序列soft reset -> 选择 SPI/I2C -> 配 ODR/FSR/滤波 -> 启动 accel/gyro记录 whoami、odr_hz、sample_dt_us、fifo_count 或 data_ready。
控制接入Imu_Poll 非阻塞采样 -> ImuSnapshot(raw, dps, g, dt)控制周期不因 IMU 读数阻塞;yaw 不当绝对航向单独使用。

代码怎么调用

先用 I2C 低速验证 WHO_AM_I 和原始数据,再切 SPI/FIFO 提高采样率。

  1. 读 WHO_AM_I 验证通信。
  2. 配置陀螺/加速度量程、ODR、滤波。
  3. 周期读取原始量,做零偏标定,再进入姿态/速度估计。
ICM42688_Init(&imu, bus);
ICM42688_ReadRaw(&imu, &raw);
ImuFilter_Update(&filter, raw.gyro, raw.accel);

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC/GND3V3 与系统地高性能 IMU 优先 3.3V 短线
SCL/SCLKI2C SCL 或 SPI SCK接口二选一
SDA/SDII2C SDA 或 SPI MOSI写寄存器/数据线
SA0/SDO地址选择或 SPI MISO读数据/选地址
CS/INTGPIO/中断SPI 片选和数据就绪

原理图证据与标注

  • 本页 Pinout 来源于开源 ICM-42688-P 模块;其他模块需重新确认 CS、INT、SA0 丝印。
  • 高速采样时线束、地线和电机噪声会明显影响数据。
看图位置重点标注必须确认错了会怎样
接口选择CS、SA0/SDO、SCL/SCLK、SDA/SDISPI 模式 CS 由 GPIO 控;I2C 模式 CS 通常拉高并用 SA0 定地址。CS/SA0 接法和代码模式不一致时,WHO_AM_I 会读不到。
电源地VCC、GND、模块旁路电容使用 3.3V,IMU 地线尽量远离电机大电流回路。地噪声会直接放大 gyro 噪声,采样看起来像机械抖动。
中断/FIFOINT/INT1、FIFO 相关配置高频采样优先用 data-ready 或 FIFO,主循环只消费快照。阻塞式轮询会拖慢控制环,造成速度/姿态闭环抖动。

上电调试清单

  • WHO_AM_I
  • 静态零偏
  • 采样周期稳定
  • 方向轴定义
  • 控制环非阻塞

故障定位

现象常见原因下一步证据
WHO_AM_I 读不到CS/SA0/SDO/SCL/SDA/SPI 模式接错先 I2C 低速或 SPI 单设备验证 ID。
采样周期乱主循环阻塞、FIFO/ODR 配置不一致记录采样时间戳,先不进控制环。
yaw 长期漂移它没有磁力计,陀螺积分必然漂使用约束/视觉/线位辅助,不把 yaw 当绝对航向。
13

外设模块

0.96 OLED / SSD1306 显示模块

调试显示模块,用于显示状态、阈值、速度、误差。

4/4资料门禁
用途
现场调试显示:模式、阈值、速度、误差、故障码
调用方式
I2C 写 SSD1306 命令和显存 buffer,主循环低频刷新
接线风险
显示刷新不要阻塞控制环,I2C 地址常见 0x3C/0x3D
代码 3接线 3看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
显示驱动文件https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/icm42688-hardware/OLED/OLED.c底层只管 I2C/SPI 写命令和显存,业务层只更新字段。
初始化入口I2C scan -> OLED_Init -> clear/test pattern -> low-rate OLED_Updateoled_ack_ok、oled_i2c_addr、render_counter 可读;0x3C/0x3D 先扫出来。
现场字段mode、speed、line_error、yaw、fault_code、armed/running不全屏高频刷新,控制环周期不因显示明显变慢。

代码怎么调用

初始化 SSD1306 后维护一块显存,业务层只改文本/数值,统一低频刷新。

  1. I2C 扫描确认 0x3C/0x3D。
  2. 发送初始化命令序列,清屏。
  3. 周期刷新关键状态,刷新频率低于控制环。
OLED_Init();
OLED_Printf(0, 0, "mode:%d", app.mode);
OLED_Printf(0, 2, "spd:%d", speed);
OLED_Update();

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC/GND3V3/5V 与系统地看模块丝印
SCL/SDA主控 I2C四线 I2C OLED 常用连接
RST/DC/CSGPIO/SPISPI 屏才需要

原理图证据与标注

  • 本页已有 SSD1306 实物参考;具体 I2C/SPI 版本以排针数量和丝印为准。
  • I2C OLED 和 MPU6050 共总线时注意地址、上拉和刷新频率。
看图位置重点标注必须确认错了会怎样
接口版本4P I2C 或 7P SPI 排针丝印先按排针数量确认接口,不把 SPI 屏当 I2C 屏初始化。接口版本错时屏幕全黑/全白,但代码日志可能看起来正常。
I2C 地址SCL、SDA、地址焊盘、上拉扫描 0x3C/0x3D 后再写初始化序列。和 MPU6050 共线时,上拉、线长和阻塞刷新都会影响 IMU。
刷新节奏VCC、GND、I2C 波形和刷新函数调用点低频局部刷新,控制环里只更新关键字段。全屏高频阻塞刷新会让电机控制周期变慢。

上电调试清单

  • I2C 地址
  • 初始化亮屏
  • 不阻塞控制
  • 显示故障码
  • 比赛前固定字段

故障定位

现象常见原因下一步证据
白屏/黑屏地址 0x3C/0x3D、SCL/SDA、上拉或初始化序列错误先 I2C 扫描,再画全屏测试图案。
控制变慢每圈全屏刷新或 I2C 阻塞低频刷新、脏行更新,只显示关键字段。
同总线 IMU 也失效I2C 地址/上拉/线长冲突单独接 OLED,再与 MPU6050 合总线。
14

外设模块

灰度巡迹模块

5/7/8/12 路输入,用于黑线、边界、角点和丢线判断。

4/4资料门禁
用途
巡线、边界、角点、丢线检测
调用方式
数字模块读 GPIO;模拟模块读 ADC;多路传感器转换成 line position 和 confidence
接线风险
5V 供电时输出电平可能也是 5V,接 3.3V 主控前确认
代码 3接线 3看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
采样驱动文件https://github.com/ZhiKong0/nuedc-component-examples/blob/main/imu/icm42688-hardware/grayscale_sensor.c先输出 raw_bits/active_bits,不直接喂 PID。
74HC4051 读取S0/S1/S2 选通 -> 等待 settle -> 采 Z -> 打包 Y0..Y7逐个遮挡传感器,通道顺序和极性都能复现。
控制入口Line_ReadRaw -> Line_CalcPosition -> line_seen/line_error/confidence丢线时进入搜索/减速/停车,不让 PID 继续盲打。

代码怎么调用

先把每路黑白值读出来,再计算加权线位;不要一上来直接套 PID。

  1. 读取 OUT0..OUTn,记录白底/黑线阈值。
  2. 把多路值转换成 line_pos、line_seen、confidence。
  3. 丢线时进入搜索/减速/停车状态,不让 PID 乱打方向。
Line_ReadRaw(raw);
Line_CalcPosition(raw, &line);
if (!line.seen) Chassis_RequestSlowSearch();

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC/GND3V3/5V 与系统地按模块规格,输出电平要匹配主控
OUT0..OUTn主控 GPIO/ADC数字或模拟巡线输入
EN/LED 可选GPIO 或固定电平有些模块可关红外灯

原理图证据与标注

  • 本页已有 8 路接口示意;实际 5/7/12 路模块按同样思路扩展。
  • 模块高度、角度、遮光和线材固定会比代码更影响阈值。
看图位置重点标注必须确认错了会怎样
输出电平VCC、GND、OUT0..OUTn、模块比较器输出5V 供电时先确认 OUT 是否为 5V,3.3V 主控必要时分压/限流。5V OUT 直入 3.3V IO 会带来可靠性和损坏风险。
4051 复用S0/S1/S2、Z、Y0..Y7 接口示意选择脚顺序和传感器物理顺序逐个遮挡验证。通道顺序错时,线位计算方向会反,PID 会把车带离黑线。
机械标定模块高度、前伸量、遮光结构、线束固定固定机械位置后再标定白底/黑线阈值。先调代码后改安装高度,会让所有阈值和控制参数失效。

上电调试清单

  • 白底值
  • 黑线值
  • 左右方向
  • 丢线策略
  • 固定安装高度

故障定位

现象常见原因下一步证据
所有通道恒 0 或恒 1VCC/GND、输出极性、阈值电位器或使能脚问题先读 raw_bits,不要直接套 PID。
通道顺序乱排线方向或 74HC4051 Y0..Y7/S0..S2 顺序错逐个遮挡传感器,记录通道映射。
线位抖动安装高度、光照、遮光和线束固定不稳定固定机械高度,再标定白底/黑线阈值。
15

外设模块

激光驱动板

主控只输出 PWM/EN,激光功率由驱动板承担。

4/4资料门禁
用途
主控用 EN/PWM 控制激光,驱动板承担限流/开关功率
调用方式
GPIO 控亮灭,PWM 控功率;必须有 arm/disable 安全门
接线风险
GPIO 不能直接给激光头供电;不要照射人眼或反光面
代码 3接线 4看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
安全 APILaser_Init -> Laser_Off(default) -> Laser_SetDutyPermille(0..1000) -> Laser_Off上电、复位、程序异常路径都默认关激光。
动作门控DISARMED 禁止输出;ARM 后只允许短脉冲;STOP/FAULT 立即关断按停止键、超时或通信丢失时,PWM/EN 在一个控制周期内归零。
低功率验证低占空比短脉冲 -> 测 VIN/GND/温升 -> 再和云台动作联动先不用闭环打靶,只验证亮灭、极性、限流和热稳定。

代码怎么调用

激光输出必须独立封装,默认关闭;只有目标锁定、用户允许、安全状态满足时才允许短时点亮。

  1. 初始化 PWM/EN 后立即 Laser_Off。
  2. 调试先用低占空比短脉冲,不连续长亮。
  3. 和云台联动时先验证云台 STOP/限位,再允许激光输出。
Laser_Init();
Laser_Off();
if (app.armed && target.locked) Laser_SetDuty(120);

逐针接线

引脚 / 信号接到哪里为什么这样接
VIN/5V独立电源按驱动板丝印和激光功率选择
GND主控地/电源地PWM/EN 需要共地
PWM/EN主控 GPIO/PWM控制亮灭/功率
LASER+/LASER-激光头正负极极性不可接反

原理图证据与标注

  • 本页已有激光驱动板原理简图和激光舵机控制参考图;正式接线仍要补实拍丝印。
  • 限流方式未知时,不要长时间高占空比点亮。
看图位置重点标注必须确认错了会怎样
功率路径VIN/5V、GND、LASER+、LASER-激光头正负极只接驱动输出,驱动板按额定电源独立供电。GPIO 直供激光或极性反接都会损坏器件。
控制脚PWM/EN、下拉/上拉、驱动输入级EN/PWM 默认关闭,MCU 初始化前也不误亮。控制脚悬空会造成上电误亮,比赛现场非常危险。
限流与热驱动板限流元件、散热铜皮、参考原理图不清楚限流方式时只做低占空比短脉冲。长时间高占空比会发热、掉压或烧激光头。

上电调试清单

  • 默认关闭
  • 低占空比短亮
  • 极性确认
  • 云台 STOP
  • 安全提示

故障定位

现象常见原因下一步证据
激光不亮VIN/GND、EN/PWM 极性、激光头正负或驱动限流问题低占空比短脉冲,先不接云台闭环。
上电误亮EN 引脚悬空或默认态未关GPIO 初始化前用硬件下拉/上拉,软件第一句 Laser_Off。
供电掉压或发热驱动方式/限流/电源容量不匹配限时点亮,测电源电压和温升。
16

外设模块

张大头/ZDT 闭环步进驱动

云台 yaw/pitch 常用执行器,TTL 或 CAN 按驱动器版本二选一。

4/4资料门禁
用途
闭环步进云台/机构执行器,可走 TTL 或 CAN 协议
调用方式
主控按驱动器协议发位置/速度/停止命令;每个轴地址必须唯一
接线风险
TTL 和 CAN 不能混接;MCU CAN_TX/RX 不能直接接 CANH/CANL
代码 3接线 5看图 3排故 3

落地代码链路

层级入口 / 文件 / 命令验收证据
TTL 协议层Zdt_SendStop -> Zdt_QueryStatus -> Zdt_MoveRelative(addr, speed, acc, pulse)先能查询状态和执行 STOP,再允许低速点动。
CAN 协议层MCU CAN_TX/RX -> CAN 收发器 -> CANH/CANL;协议帧按驱动器手册组包示波器/USB-CAN 能看到帧,地址和波特率匹配后驱动器应答。
云台安全Laser disabled -> Stepper home/limit/STOP -> low-speed move -> enable aim logic未验证限位、STOP 和超时前,激光保持关闭。

代码怎么调用

先封装 sendFrame 和 Stop,再做 MoveRel/MoveAbs;任何运动前先验证停止命令确实有效。

  1. TTL 模式:主控 TX/RX 交叉接驱动器 RX/TX,GND 共地。
  2. CAN 模式:主控 CAN_TX/RX 先接收发器,再接 CANH/CANL,并按总线加终端电阻。
  3. 先单轴低速点动,再做双轴联动;每条命令都要有超时和 STOP 回退。
Zdt_Init(&yaw, addr_yaw);
Zdt_Stop(&yaw);
Zdt_MoveRelative(&yaw, speed, steps);

逐针接线

引脚 / 信号接到哪里为什么这样接
V+/Gnd10-29V 驱动电源按驱动器规格供电
A+/A-/B+/B-步进电机相线两相线不能随意混
TX/RX/GND主控 UARTTTL 协议通信
CANH/CANLCAN 收发器总线侧CAN 模式,主控必须先经过收发器
Addr/拨码驱动器地址设置多轴地址不能冲突

原理图证据与标注

  • 本页已有 ZDT/Emm 驱动板接口说明图和 TTL/CAN 接口示意;先按自己驱动器版本确认端子。
  • 云台打靶必须先禁激光测步进 STOP 和限位。
看图位置重点标注必须确认错了会怎样
电源与相线V+/GND、A+/A-/B+/B-、电源额定范围电机相线接到驱动器,电源容量满足加减速峰值。相线错或电源不足会丢步、报警、发热,不能靠调代码解决。
TTL/CAN 二选一TX/RX、CANH/CANL、CAN 收发器、模式/地址拨码TTL 必须共地;CAN 必须经收发器和终端,不把 MCU CAN_TX/RX 直连 CANH/CANL。混接 TTL 和 CAN 会导致完全无响应,甚至拉坏总线。
安全端子EN、STOP、限位输入、报警输出先验证 STOP/限位/超时,再做位置闭环和云台联动。运动后停不住比运动不起来更危险,尤其是带激光云台。

上电调试清单

  • 地址唯一
  • 单轴 STOP
  • 低速点动
  • 位置回读/状态
  • 双轴联动前禁激光

故障定位

现象常见原因下一步证据
驱动器不响应命令TTL/CAN 模式错、地址错、波特率/协议帧错先单轴 Stop/状态查询,再 MoveRel。
CAN 模式完全不通MCU CAN_TX/RX 直连 CANH/CANL,缺收发器或终端加收发器,确认 CANH/CANL 和终端电阻。
运动后停不住STOP 命令没验证、超时回退缺失先禁激光,只测 STOP、限位和低速点动。
17

外设模块

BearPi-BM H21E 蓝牙 / 星闪 UART 模组

小熊派 2.4GHz BLE + SLE 双模核心板;刷入对应 AT/测距固件后可通过 UART 配置和交换数据。

4/4资料门禁
无线能力
BLE 4.0-5.4 与 SLE 1.0 双模;星闪通信需要另一台支持 SLE 的设备
主控与资源
BS21E/H2821E RISC-V 32-bit,最高 64MHz,160KB SRAM,1MB Flash
电气边界
BM H21E 核心板和 IO 都是 3.3V;官方 EBM/测距底板教程的 VCC=5V 不能套到裸核心板
调用方式
先确认已烧录的固件类型与 UART 波特率;AT、测距、透明传输的命令和输出格式由固件决定
代码 3接线 7看图 3排故 4

开发链路 / 适用题型

阶段要做什么可见证据
识别硬件先区分 BM 裸核心板、EBM 串口底板和当前固件类型,记录丝印与供电入口。核心板按 3.3V 供电;若用 EBM 底板,按底板丝印/官方接线页确认 VCC。
串口 smoke只接 VCC/GND/TXD/RXD,先看启动日志或发送 AT,不接业务控制。串口字节计数增长;AT 模式收到 OK 或能看到固件启动日志。
模式配置按固件手册设置角色、连接参数或测距参数,重启后回读确认。状态灯/STATE 与串口应答同时证明模式生效。
业务协议在 UART 上增加帧头、长度、序号、CRC 与超时,不把无线链路当成永不丢包的电线。断连、重连和丢帧时控制端进入安全状态,恢复后序号连续。
  • 手机/双设备无线调参
  • BLE 或星闪数据链路
  • 测距标签/信标实验
  • 无线遥控与状态回传

落地代码链路

层级入口 / 文件 / 命令验收证据
硬件与固件识别BearPi-BM H21E core 3.3V;EBM 底板供电按丝印;记录 AT/测距/自研固件版本断电测阻无短路,上电电压稳定,串口能看到与固件版本对应的启动输出。
AT 配置入口KEY 拉高后重新上电 -> UART 发送 AT\r\n -> 校验 OK;配置命令以当前固件手册为准官方文档说明 KEY 高电平上电进入 AT 模式;状态灯慢闪并有完整应答。
应用数据入口BearPiH21E_Init(baud) -> BearPiH21E_ReadLine/WriteFrame -> LinkTimeout收发有字节计数、帧序号和超时;断开无线连接后执行安全回退而不是沿用旧指令。

例程字典

例程 / 模板位置 / 目标什么时候用
UART AT 最小探测KEY 高电平上电 -> AT\r\n -> 等待 OK确认供电、TX/RX 交叉、波特率和固件确实支持 AT
测距固件串口输出标签/信标配对 -> UART 行缓冲 -> 距离字段只有刷入官方测距固件并正确配对后才会持续输出距离

代码怎么调用

把 H21E 当作“可更换固件的无线 MCU/模组”使用:先按固件说明确认 UART 参数,再封装 AT 行协议或业务帧,不能直接套用 HC-05 命令集。

  1. 裸核心板只用稳定 3.3V;若是 EBM 串口底板,按底板丝印和官方教程选择其 VCC 输入。
  2. TXD 接主控 RX,RXD 接主控 TX,GND 共地;KEY 必须在重新上电前处于固件要求的电平。
  3. AT 阶段按 CRLF 收完整行;业务阶段增加超时、序号和 CRC,STATE 仅作辅助证据。
BearPiH21E_Init(115200);              // 波特率以当前固件为准
BearPiH21E_Write((uint8_t *)"AT\r\n", 4);
if (BearPiH21E_ReadLine(rx, sizeof rx, 200) == H21E_OK) {
    link_configured = true;
}
if (BearPiH21E_LinkTimedOut(500)) App_EnterSafeState();

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC(BM 裸核心板)稳定 3.3V 电源官方规格明确核心板与系统 IO 都是 3.3V
VCC(EBM/测距底板)按底板丝印;官方测距教程用 USB-TTL 5V5V 是底板供电入口,不等于裸核心板可直接接 5V
GND主控 GND / USB-TTL GNDUART 必须共地
TXD主控 UART_RX模组发送端接主控接收端
RXD主控 UART_TX模组接收端接主控发送端,3.3V 逻辑
KEY3.3V 或主控 GPIO(按固件上电时序)官方测距固件中 KEY 高电平上电进入 AT 配置模式
STATE(若底板引出)主控 GPIO 输入可辅助判断配对/连接,最终仍应结合串口心跳

原理图证据与标注

  • 官方功能图只标天线、BS21E 主控和状态灯;V/T/R/G 串口底板接口必须结合实物丝印确认。
  • BM H21E 裸核心板供电是 3.3V;官方测距教程的 USB-TTL 5V 接法针对带电源处理的底板。
  • 天线净空区不要铺铜、贴金属或被线束遮挡。
看图位置重点标注必须确认错了会怎样
电源域BM 核心板 3.3V、EBM 底板 VCC、GND 与稳压器路径先确认手里是裸核心板还是带底板版本,再决定 3.3V/5V 从哪里进入。把底板 5V 接法套到裸核心板会损坏 BS21E 与 IO。
UART 交叉与模式TXD->RX、RXD->TX、KEY 上电电平、固件波特率AT 模式先收到 OK,数据模式先有启动日志/字节计数,再接业务协议。TX/RX 同名直连或 KEY 时序错误会表现为串口完全无响应。
射频与状态2.4G PCB 天线净空、状态灯、STATE 输出天线端远离金属/大电流线,连接状态同时由灯、STATE 和应用心跳证明。只看灯不看数据可能把已配对但应用链路失效误判为正常。

上电调试清单

  • 确认 BM 裸板或 EBM 底板
  • 断电确认供电入口
  • TX/RX 交叉并共地
  • AT 模式收到完整应答
  • 断连超时进入安全状态

故障定位

现象常见原因下一步证据
完全不上电或芯片发热把 5V 直接送入 BM 裸核心板,或 VCC/GND 接反立即断电,核对裸板 3.3V 与底板 VCC 路径后再限流上电。
串口没有任何字节TX/RX 未交叉、未共地、波特率不符或当前固件不输出日志示波器看 TXD,轮询常用波特率,并核对固件版本说明。
AT 没有 OKKEY 没有在上电前拉高、行尾不对或刷的不是 AT 固件断电设置 KEY 后重上电,发送 AT+CRLF;仍无应答则核对固件。
显示已配对但业务失控只依赖 STATE/状态灯,没有应用心跳、帧序号和超时增加业务层心跳与 500ms 超时,超时立刻进入安全状态。
18

外设模块

HC-05 经典蓝牙串口模块

Bluetooth 2.0 SPP 主从一体串口模块;数据模式做透明 UART,AT 模式配置角色、名称、密码与波特率。

4/4资料门禁
无线协议
Bluetooth 2.0 SPP 经典蓝牙,不是 BLE;普通 iPhone/iPad 不提供该 SPP 串口用法
默认数据串口
常见底板默认 9600 8N1;实际值可被 AT+UART 修改,接入前要探测
完整 AT 模式
KEY/PIO11 高电平后上电,常用 38400 8N1,命令以 CRLF 结束
电气边界
六针底板常见 VCC 3.6-6V,但 UART TTL 是 3.3V;裸 HC-05 核心模块 VCC 是 3.3V
代码 3接线 6看图 3排故 4

开发链路 / 适用题型

阶段要做什么可见证据
底板识别确认 6 针顺序、是否带稳压/分压、按键连接到 KEY 还是 EN。丝印和万用表导通与数据手册相符,VCC 输入路径不是裸模块 3.3V 焊盘。
AT smokeKEY 高电平上电,用 38400 8N1 发送 AT+CRLF。返回 OK;随后用 AT+UART?、AT+ROLE? 回读配置。
透明传输切回数据模式,按配置的波特率跑 PC/手机到 MCU 双向字节回环。发送、接收计数均增长,长包不会越界,断连后 STATE/心跳变化。
业务帧增加帧头、长度、序号、CRC 与超时;控制命令必须有安全默认态。干扰、重连和半包时解析器丢弃坏帧,不沿用旧控制值。
  • Android/PC 串口遥控
  • 无线参数整定
  • 双 HC-05 主从透传
  • 状态与日志回传

落地代码链路

层级入口 / 文件 / 命令验收证据
串口与 STATEBluetooth_Init -> UART RX IRQ/ring buffer -> Bluetooth_Mode/Get_Bluetooth_ConnectFlag未连接时 STATE 与软件标志为 0,连接后变化;接收计数随手机发送增长。
完整 AT 配置KEY high before power -> 38400 8N1 -> AT\r\n / AT+ROLE?\r\n / AT+UART?\r\n每条命令都收到 CRLF 结尾的 OK/参数应答,再重启进入数据模式。
业务收发BLE_send_String/Send_Bluetooth_Data + frame parser + 500ms link timeout双向回环、长包、半包和断连重连均通过;超时后执行 App_EnterSafeState。

例程字典

例程 / 模板位置 / 目标什么时候用
MSPM0 HC-05 驱动hardware/HC05/hc05.c + hc05.h本地例程包含 Bluetooth_Init、STATE 读取、UART 中断收包与字符串发送
完整 AT 探测KEY 高电平上电,38400 8N1,发送 AT\r\n忘记数据波特率、需要改角色/名称/密码时使用

代码怎么调用

先用 AT 模式确认角色和串口参数,再在数据模式调用本地 HC-05 UART 驱动;中断里只收字节,完整帧解析放到主循环。

  1. 六针底板 VCC 按板卡规格供电,GND 共地,TXD 接 MCU RX,RXD 接 MCU TX;5V MCU 发送端要降到 3.3V。
  2. 完整 AT 模式通常为 KEY 高电平上电、38400 8N1、命令追加 CRLF;克隆固件可能不同,必须以应答为证。
  3. 数据模式使用 AT+UART 配置值,STATE 只辅助判断连接;业务层仍要有心跳、长度检查和超时。
Bluetooth_Init();
Bluetooth_Mode();
if (Get_Bluetooth_ConnectFlag() == CONNECT) {
    BLE_send_String((unsigned char *)"PING\r\n");
}
Receive_Bluetooth_Data();             // 主循环处理,ISR 只收字节

逐针接线

引脚 / 信号接到哪里为什么这样接
VCC(六针底板)3.6-6V,常用 5V;以板上稳压器和卖家规格为准DSD 六针底板规格给出 3.6-6V,不能据此给裸核心模块送 5V
GND主控 GNDUART 电平需要共同参考地
TXD主控 UART_RXHC-05 UART 输出是 3.3V TTL
RXD3.3V 主控 UART_TX;5V 主控需分压/电平转换HC-05 UART 输入是 3.3V 逻辑,不能直接承受 5V IO
EN/KEY3.3V 或主控 GPIOKEY/PIO11 高电平上电进入完整 AT 模式;不同底板命名可能不同
STATE主控 GPIO 输入连接建立后可输出状态,软件仍需应用层心跳确认

原理图证据与标注

  • HC-05 核心模块数据手册的 VCC 是 3.3V;常见六针底板增加稳压后才接受约 3.6-6V。
  • HC-05 TXD/RXD 是 3.3V TTL,不是 RS-232;与 5V 主控通信时重点保护 HC-05 RXD。
  • 市售克隆底板的按键、EN/KEY、STATE 与 LED 接法可能变化,必须以实物丝印和导通测量复核。
看图位置重点标注必须确认错了会怎样
稳压与逻辑电平底板 VCC 到 3.3V 稳压器、HC-05 核心 VCC、RXD 输入路径5V 只进入带稳压底板 VCC;MCU_TX 到 HC-05_RXD 不超过 3.3V。混淆底板供电和 UART 电平会烧毁模块 RX 输入或裸核心板。
UART 与模式脚TXD/RXD 交叉、KEY/PIO11、38400 AT 波特率、CRLFKEY 在上电前为高,完整 AT 模式能返回 OK;数据模式再切到 AT+UART 配置值。只在上电后按键或漏掉 CRLF,会误判模块损坏。
连接状态与业务安全STATE/PIO9、LED、应用心跳、接收环形缓冲STATE 与心跳同时成立才接受控制命令;断连超时清空控制量。仅依赖 STATE 会在串口阻塞或对端应用退出时继续执行旧命令。

上电调试清单

  • 核对六针顺序和稳压器
  • TX/RX 交叉并共地
  • 完整 AT 模式收到 OK
  • 数据模式双向回环
  • 断连超时清零控制量

故障定位

现象常见原因下一步证据
LED 快闪但手机搜不到/连不上模块角色/绑定模式不符,或手机不支持 Bluetooth 2.0 SPP用 Android/PC SPP 工具测试,AT+ROLE?、AT+CMODE?、AT+BIND? 回读配置。
AT 始终无响应未进入完整 AT 模式、波特率不是 38400、缺 CRLF 或 TX/RX 未交叉KEY 高电平后重新上电,38400 8N1 发送 AT+CRLF,并用逻辑分析仪看 TXD。
能连接但 MCU 收不到数据数据模式波特率已被修改、UART 中断未开或 RX 缓冲逻辑错误AT+UART? 回读参数,先做单字节回环和 RX 中断计数。
长包乱码或越界ISR 直接按字符串处理,没有环形缓冲、长度和帧边界ISR 只入队;主循环按长度/分隔符/CRC 解析,并记录溢出计数。