- 核心定位
- 轻量控制板、备用主控、云台/小执行器子系统
- 代码链路
- CubeMX/CubeIDE 或 Keil 生成外设初始化,业务代码放在 main 循环、定时器回调和串口接收回调里
- 下载调试
- SWD 使用 PA13/PA14,保留 NRST 更利于现场救程序
- 电气边界
- GPIO 为 3.3V 逻辑,电机、激光、步进不能从板载 3V3 取电
代码 3接线 5看图 3排故 3
开发链路 / 适用题型
- 轻量云台
- 串口/I2C 外设验证
- 备用主控
- 单执行器小系统
- 低风险练习板
代码怎么调用
F103 先用生成工具把 GPIO/UART/I2C/TIM 初始化好,再在用户代码区写业务调用;不要在中断里做阻塞打印或长计算。
- 在 CubeMX/Keil 中开启 SWD,避免把 PA13/PA14 改成普通 GPIO。
- 为每个外设先写最小 smoke 函数,例如 UartProbe、I2cScan、MotorLowSpeedTest。
- 主循环只调状态机;串口接收只入缓冲;定时器中断只做计数/置标志。
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(); }
}
原理图证据与标注
- 本页已有 Blue Pill 原理图 PDF 来源和本地接口速查 SVG;接线前先看电源、晶振、BOOT、SWD、USB/CAN 复用。
- PA11/PA12 是 MCU USB/CAN 相关引脚,不等于 CANH/CANL;接 CAN 必须经过收发器。
- 不同 Blue Pill 克隆板 5V、3V3、BOOT0、PC13 LED 细节可能不同,以板上丝印和实物测试为准。
上电调试清单
- SWD 能连接
- 空工程能下载运行
- 串口回环能收到
- I2C 扫描能找到地址
- PWM 空载输出正确
- 核心定位
- 电赛实时控制主控,适合差速底盘、PWM/编码器、传感器融合和安全状态机
- 代码链路
- TI MSPM0 SDK + SysConfig + driverlib,生成外设初始化后写 App 层状态机
- 下载调试
- SWD/RST 优先;必要时 ROM UART BSL,但要先确认 PA18/BSL 和 TX/RX
- 推荐架构
- M0 管实时闭环和急停,MaixCAM/F407/F103 只发送上层目标或辅助信息
代码 4接线 6看图 3排故 3
开发链路 / 适用题型
- 2026 视觉导航定点小车
- 差速底盘
- 传感器融合
- PWM/编码器闭环
- 实时安全控制
代码怎么调用
M0 代码建议分三层:SysConfig/driverlib 初始化、board_app 驱动封装、App 状态机。执行器必须受 DISARM/STOP 统一安全门控制。
- 先在 SysConfig 里固定 UART/I2C/PWM/编码器/ADC 引脚,导出后不要手改生成文件。
- 每个外设写 Init、Poll/Tick、GetSnapshot 或 Command 函数,主循环只调 App_Tick。
- 电机和激光类输出必须先经过 arm/disarm 状态,调试时默认 DISARMED。
int main(void) {
SYSCFG_DL_init();
BoardApp_Init();
while (1) {
BoardApp_Tick();
}
}
原理图证据与标注
- 本页已有天猛星板载资源图、MSPM0G3507 pinout 和开源硬件工程入口;查引脚时先用官方 pinout,再看板上接口丝印。
- CAN_TX/RX 不是 CANH/CANL,必须加 CAN 收发器。
- 电机、步进、激光另供电,和主控共地;不要把板载 3V3 当执行器电源。
上电调试清单
- SDK 能编译
- SWD 能 attach
- 空工程能烧录
- UART 有心跳
- 每个执行器默认 DISARMED
- 核心定位
- 高性能多外设主控,适合多串口视觉协同、复杂云台、多执行器和记录任务
- 代码链路
- STM32CubeMX/CubeIDE 或 Keil,先用官方 Pinout 锁定 P1/P2,再生成 HAL/LL 初始化
- 下载调试
- SWD/JTAG 保留;高速外设和板载资源会占脚,改线前先查原理图
- 典型角色
- 主车/复杂外设汇聚板;实时危险执行仍要写 STOP 和超时保护
代码 4接线 5看图 3排故 3
开发链路 / 适用题型
- 复杂底盘
- 多串口视觉协同
- 云台打靶
- SDIO 记录
- 多执行器系统
代码怎么调用
F407 适合把通信、记录和多外设集中起来,但代码上必须分层:驱动层不做业务决策,App 层统一处理状态和安全。
- 先按官方 Pinout 选 P1/P2 引脚,检查 TF/LCD/音频/按键/LED 是否占用。
- 串口接收优先 DMA/中断 + ring buffer,避免阻塞主循环。
- PWM/编码器通道尽量按 TIM 成组规划,方便同步和频率统一。
void App_Tick(void) {
Vision_Poll();
Imu_Poll();
MotorSafety_Update();
Actuator_Update();
}
原理图证据与标注
- 本页已有官方 Pinout、原理图总览和晶振原理图;接线前先查板载外设占脚。
- F407 IO 仍按 3.3V 逻辑处理;5V 模块输出接入前必须查电平兼容。
- CAN/RS485 都需要外部收发器或板载接口确认,不能把 MCU 引脚直接接总线。
上电调试清单
- Pinout 表已确认
- SWD 能连接
- 串口分配表已写
- 板载占脚已排除
- STOP/超时保护已验证
- 用途
- 两路有刷直流电机 H 桥驱动;主控只给 PWM/GPIO,电机电流走 VM
- 调用方式
- PWM 控速度,AIN/BIN 控方向,STBY 作为总使能
- 接线风险
- VM 和 VCC 分开;编码器线不接 TB6612;电机上电前架空车轮
代码 3接线 6看图 3排故 3
代码怎么调用
把每路电机封装成 setSpeed(-1000..1000),函数内部决定方向脚和 PWM 占空比;所有输出受 motorEnable/stop 统一控制。
- 初始化 PWMA/PWMB 为同频 PWM,AIN1/AIN2/BIN1/BIN2/STBY 为推挽输出。
- 启动前 STBY 拉低、PWM=0;确认方向脚后再 STBY 拉高。
- 速度为正反向时互斥方向脚;速度为 0 时 PWM=0 并按刹车/滑行策略处理。
void Motor_Set(int left, int right) {
Tb6612_SetChannel(MOTOR_A, left);
Tb6612_SetChannel(MOTOR_B, right);
}
原理图证据与标注
- 本页包含 Pololu 最小接线图和原理图,可用来确认 VM/VCC/GND/STBY 关系。
- 红板模块丝印可能不同,先用万用表和丝印确认 VM、VCC、GND。
上电调试清单
- 不接电机测 PWM
- STBY 默认低
- 单路空载低速
- 方向反了记录软件符号
- 再接编码器闭环
- 用途
- 带 A/B 相编码器的直流减速电机,电机线进驱动器,编码器线进主控
- 调用方式
- 驱动器负责给电机供电;主控用定时器编码器模式、GPIO 中断或定时采样读取 A/B 相
- 接线风险
- 6P 线序必须按实物确认,不能把电机线接到主控 IO
代码 3接线 5看图 3排故 3
代码怎么调用
先写 Encoder_GetCount/Encoder_GetDelta,再用定时任务计算速度;闭环前只手转轮子验证计数方向。
- A/B 相接主控成对输入,开启上拉或按模块输出类型配置。
- 固定周期读取 count 差分得到速度,方向由 A/B 相位或 count 正负决定。
- 把方向符号和电机 M+/M- 软件符号统一,再进入速度闭环。
void Encoder_Tick(void) {
int32_t now = Encoder_ReadCount();
motor.speed_count = now - motor.last_count;
motor.last_count = now;
}
原理图证据与标注
- 本页已有 MG310 6P 线序图和装配参考图;真正接线前仍要对照你手上插头方向。
- A/B 相反接不会烧,但闭环方向会错;电机线接错到 IO 才危险。
上电调试清单
- 只接编码器供电
- 手转轮看计数
- 记录正方向
- 接驱动器空载低速
- 最后开速度环
- 用途
- 12V 直流减速电机 + 霍尔/GMR 编码器,适合小车底盘速度闭环
- 调用方式
- 电机 M+/M- 接 H 桥;编码器 A/B 接主控计数;速度 PI 在主控里跑
- 接线风险
- 不同版本 6P 插头线序可能不同,先看卖家/实物线序图
代码 3接线 4看图 3排故 3
代码怎么调用
推荐直接参考 AT8236 + MG513X 例程,把驱动器输出、编码器计数、速度 PI 三件事拆开。
- 移植 at8236_motor.c/h 或等价 H 桥驱动,只负责输出方向和 PWM。
- 移植 mg513x_encoder.c/h 或用定时器编码器模式读取 A/B 相。
- 固定周期调用 motor_speed_pi.c,把目标速度换成 PWM 输出。
Motor_SetTarget(left_target, right_target);
Encoder_UpdateDelta();
MotorSpeedPi_Tick();
At8236_ApplyPwm();
原理图证据与标注
- 本页已有 MG513X 6P 接线示意、产品参数表和编码器参数图;它们用于确认版本差异。
- 闭环发散时优先查方向符号:M+/M-、A/B 相、左右轮坐标三者必须统一。
上电调试清单
- 手转计数方向
- 单轮空载
- 左右轮符号
- 低速 PI
- 堵转/过流保护
- 用途
- 双路直流电机驱动,适合带编码器底盘;标准版把电机和编码器接口集中到板上
- 调用方式
- 和普通 H 桥一样写方向/PWM;编码器反馈仍进主控计数
- 接线风险
- 标准版和 Lite 版排针不同,5V/3V3 是输入还是输出要看丝印
代码 3接线 5看图 3排故 3
代码怎么调用
把 AT8236 当成双路 H 桥:控制输入由主控输出,编码器 A/B 由主控读取,驱动板不替你做闭环。
- 先按 wiring.md 区分标准版/Lite 版接口。
- AIN/BIN 或 PWM/DIR 接主控输出,E1/E2 编码器线接主控输入。
- 单路低速 smoke 通过后再双路同向、反向、差速测试。
At8236_SetMotor(LEFT, pwm_left);
At8236_SetMotor(RIGHT, pwm_right);
left_delta = Encoder_LeftDelta();
right_delta = Encoder_RightDelta();
原理图证据与标注
- 本页已有标准版接口说明、接线示例和 Lite 版引脚图;接线时先确认自己是哪一版。
- 如果板上提供 5V 输出,不要反向把主控 5V 强灌进去,先查丝印/手册。
上电调试清单
- 版本确认
- VM/GND 确认
- 单路空载
- 编码器计数
- 速度闭环
- 用途
- 视觉协处理器,负责识别目标并把少量结果发给实时主控
- 调用方式
- MaixPy/OpenMV 风格脚本识别目标,UART 输出 valid/dx/dy/id
- 接线风险
- 不要让视觉板直接控制危险执行器;主控必须有丢帧停车策略
代码 3接线 5看图 3排故 3
代码怎么调用
视觉侧只输出结构化小帧,主控侧解析后进入状态机;先不要传大图片或复杂 JSON。
- 视觉脚本计算目标是否有效、中心偏差 dx/dy、目标编号 id。
- UART 每 20-50ms 发一帧简短文本或二进制帧。
- 主控超过 100-300ms 没收到有效帧就降级或停车。
# MaixCAM side
uart.write(f"V,{valid},{dx},{dy},{target_id}\n")
// MCU side
if (VisionFrame_Parse(line, &vision)) App_SetVision(vision);
原理图证据与标注
- 本页已有 MaixCAM Pro 完整 IO 图;A16/A17、A15/A27 等编号以官方 IO 图为准。
- 视觉板 IO 多为 3.3V 逻辑,和 5V 主控/模块相接前查电平。
上电调试清单
- USB 调试正常
- 脚本能跑
- UART 文本可读
- 主控丢帧保护
- 现场曝光参数可调
- 用途
- 快速获得姿态角/角速度的 UART 模块,适合先把车跑起来
- 调用方式
- 串口收 WIT 帧,调用 wit_c_sdk 更新寄存器,再读取 Roll/Pitch/Yaw
- 接线风险
- TX 接主控 RX;只读姿态时 RX 可先不接;坐标系方向要贴标签
代码 3接线 4看图 3排故 3
代码怎么调用
移植 REG.h、wit_c_sdk.c/h,把 UART 收到的每个字节喂给 WitSerialDataIn,再从回调或寄存器读角度。
- 初始化 UART 波特率,常见先试 9600 或 115200。
- 串口中断/DMA 收字节后调用 WitSerialDataIn(byte)。
- 收到角度寄存器更新后换算 Roll/Pitch/Yaw,注意单位和坐标系。
void Uart_RxByte(uint8_t b) {
WitSerialDataIn(b);
}
yaw_deg = sReg[Yaw] / 32768.0f * 180.0f;
原理图证据与标注
- 本页已有立创接线参考图和 UART 接线 SVG;接线图重点是 TX/RX 交叉和共地。
- JY61P 输出角度不等于车体控制坐标,安装方向要固定并在代码里统一符号。
上电调试清单
- 串口有帧
- 帧头正确
- 静置 yaw 漂移可接受
- 转动方向正确
- 异常丢帧不阻塞控制
- 用途
- 裸 6 轴 IMU,适合练 I2C、滤波和姿态解算
- 调用方式
- I2C 写 PWR_MGMT_1 唤醒,再连续读加速度/陀螺仪寄存器
- 接线风险
- SCL/SDA 需要上拉;AD0 决定 0x68/0x69 地址
代码 3接线 5看图 3排故 3
代码怎么调用
先做 I2C 扫描确认地址,再写初始化,最后定时读取原始量并做零偏/滤波。
- 扫描 0x68/0x69,确认 VCC/GND/SCL/SDA。
- 写 0x6B=0x00 唤醒,配置量程和滤波。
- 周期读取 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]);
原理图证据与标注
- 本页已有 MPU6050 Pinout、原理图和 Arduino 接线参考;先看地址、上拉和电源域。
- 如果同一 I2C 上还有 OLED,先确认地址不冲突,再降低线长和速率。
上电调试清单
- I2C 扫描
- WHO_AM_I 正确
- 静态零偏
- 姿态方向
- 控制环非阻塞读取
- 用途
- 自带融合的姿态模块,适合少调参拿稳定姿态
- 调用方式
- I2C/SPI 用库读取 report;UART-RVC 模式可直接解析姿态帧
- 接线风险
- PS0/PS1 决定接口模式,必须和例程一致
代码 3接线 5看图 3排故 3
代码怎么调用
比赛快调优先 UART-RVC:串口收固定帧,解析 yaw/pitch/roll;需要完整 report 再上 I2C/SPI 库。
- 按 PS0/PS1 选择 UART-RVC 或 I2C 模式。
- UART 模式先确认波特率和帧头,再解析欧拉角。
- I2C 模式先跑官方/Adafruit 示例,再移植到主控。
if (Bno08xRvc_ParseByte(byte, &pose)) {
app.yaw = pose.yaw_deg;
app.pitch = pose.pitch_deg;
}
原理图证据与标注
- 本页已有 Adafruit Pinout 图;不同 BNO08x 模块 PS0/PS1 丝印和默认上拉可能不同。
- UART-RVC 适合先跑通,完整融合参数和高频 report 再考虑 I2C/SPI。
上电调试清单
- 模式脚确认
- 串口/I2C 有数据
- 静置稳定
- 转动方向正确
- 丢帧有保护
- 用途
- 高性能 6 轴 IMU,适合高速采样和自写滤波
- 调用方式
- I2C/SPI 读写寄存器,配置量程/ODR/FIFO 后读原始加速度和角速度
- 接线风险
- 它没有磁力计,yaw 需要融合/约束,不能指望长期绝对航向
代码 3接线 5看图 3排故 3
代码怎么调用
先用 I2C 低速验证 WHO_AM_I 和原始数据,再切 SPI/FIFO 提高采样率。
- 读 WHO_AM_I 验证通信。
- 配置陀螺/加速度量程、ODR、滤波。
- 周期读取原始量,做零偏标定,再进入姿态/速度估计。
ICM42688_Init(&imu, bus);
ICM42688_ReadRaw(&imu, &raw);
ImuFilter_Update(&filter, raw.gyro, raw.accel);
原理图证据与标注
- 本页 Pinout 来源于开源 ICM-42688-P 模块;其他模块需重新确认 CS、INT、SA0 丝印。
- 高速采样时线束、地线和电机噪声会明显影响数据。
上电调试清单
- WHO_AM_I
- 静态零偏
- 采样周期稳定
- 方向轴定义
- 控制环非阻塞
- 用途
- 现场调试显示:模式、阈值、速度、误差、故障码
- 调用方式
- I2C 写 SSD1306 命令和显存 buffer,主循环低频刷新
- 接线风险
- 显示刷新不要阻塞控制环,I2C 地址常见 0x3C/0x3D
代码 3接线 3看图 3排故 3
代码怎么调用
初始化 SSD1306 后维护一块显存,业务层只改文本/数值,统一低频刷新。
- I2C 扫描确认 0x3C/0x3D。
- 发送初始化命令序列,清屏。
- 周期刷新关键状态,刷新频率低于控制环。
OLED_Init();
OLED_Printf(0, 0, "mode:%d", app.mode);
OLED_Printf(0, 2, "spd:%d", speed);
OLED_Update();
原理图证据与标注
- 本页已有 SSD1306 实物参考;具体 I2C/SPI 版本以排针数量和丝印为准。
- I2C OLED 和 MPU6050 共总线时注意地址、上拉和刷新频率。
上电调试清单
- I2C 地址
- 初始化亮屏
- 不阻塞控制
- 显示故障码
- 比赛前固定字段
- 用途
- 巡线、边界、角点、丢线检测
- 调用方式
- 数字模块读 GPIO;模拟模块读 ADC;多路传感器转换成 line position 和 confidence
- 接线风险
- 5V 供电时输出电平可能也是 5V,接 3.3V 主控前确认
代码 3接线 3看图 3排故 3
代码怎么调用
先把每路黑白值读出来,再计算加权线位;不要一上来直接套 PID。
- 读取 OUT0..OUTn,记录白底/黑线阈值。
- 把多路值转换成 line_pos、line_seen、confidence。
- 丢线时进入搜索/减速/停车状态,不让 PID 乱打方向。
Line_ReadRaw(raw);
Line_CalcPosition(raw, &line);
if (!line.seen) Chassis_RequestSlowSearch();
原理图证据与标注
- 本页已有 8 路接口示意;实际 5/7/12 路模块按同样思路扩展。
- 模块高度、角度、遮光和线材固定会比代码更影响阈值。
- 用途
- 主控用 EN/PWM 控制激光,驱动板承担限流/开关功率
- 调用方式
- GPIO 控亮灭,PWM 控功率;必须有 arm/disable 安全门
- 接线风险
- GPIO 不能直接给激光头供电;不要照射人眼或反光面
代码 3接线 4看图 3排故 3
代码怎么调用
激光输出必须独立封装,默认关闭;只有目标锁定、用户允许、安全状态满足时才允许短时点亮。
- 初始化 PWM/EN 后立即 Laser_Off。
- 调试先用低占空比短脉冲,不连续长亮。
- 和云台联动时先验证云台 STOP/限位,再允许激光输出。
Laser_Init();
Laser_Off();
if (app.armed && target.locked) Laser_SetDuty(120);
原理图证据与标注
- 本页已有激光驱动板原理简图和激光舵机控制参考图;正式接线仍要补实拍丝印。
- 限流方式未知时,不要长时间高占空比点亮。
上电调试清单
- 默认关闭
- 低占空比短亮
- 极性确认
- 云台 STOP
- 安全提示
- 用途
- 闭环步进云台/机构执行器,可走 TTL 或 CAN 协议
- 调用方式
- 主控按驱动器协议发位置/速度/停止命令;每个轴地址必须唯一
- 接线风险
- TTL 和 CAN 不能混接;MCU CAN_TX/RX 不能直接接 CANH/CANL
代码 3接线 5看图 3排故 3
代码怎么调用
先封装 sendFrame 和 Stop,再做 MoveRel/MoveAbs;任何运动前先验证停止命令确实有效。
- TTL 模式:主控 TX/RX 交叉接驱动器 RX/TX,GND 共地。
- CAN 模式:主控 CAN_TX/RX 先接收发器,再接 CANH/CANL,并按总线加终端电阻。
- 先单轴低速点动,再做双轴联动;每条命令都要有超时和 STOP 回退。
Zdt_Init(&yaw, addr_yaw);
Zdt_Stop(&yaw);
Zdt_MoveRelative(&yaw, speed, steps);
原理图证据与标注
- 本页已有 ZDT/Emm 驱动板接口说明图和 TTL/CAN 接口示意;先按自己驱动器版本确认端子。
- 云台打靶必须先禁激光测步进 STOP 和限位。
上电调试清单
- 地址唯一
- 单轴 STOP
- 低速点动
- 位置回读/状态
- 双轴联动前禁激光