41. 硬件初始化、车型选择与接口¶
41.1 学习目标¶
把控制板外设初始化与实机接口一一对应,确认车型选择如何改变电机数、运动学和转向结构。
UART是微控制器中的串行通信外设。它按约定的波特率和帧格式逐位收发数据,常用于控制板调试或与 ROS 主控交换命令。日常所说的“串口”通常指 UART 外设及其电气接口、线缆和软件配置组成的整条链路。
本节代码:UART 实验
仓库目录:stm32/labs/uart/stm32f103-stdperiph。完整文件集见 metadata/code-resource-manifests/uart.txt。验收:能定位串口初始化。边界:仅静态核对。
41.2 适用范围¶
C30D、C50 系列等资料覆盖的底盘控制板。引脚和电位器位置按板卡版本核对。
PWM在固定周期内改变有效电平所占时间。控制板用它表达电机驱动强度,也可以控制舵机或灯光;微控制器引脚输出的 PWM 信号本身不能直接为电机供电。
本节代码:PWM 实验
仓库目录:stm32/labs/pwm/stm32f103-stdperiph。完整文件集见 metadata/code-resource-manifests/pwm.txt。验收:能定位定时器与占空比。边界:仅静态核对。
41.3 操作前检查¶
- 断电拍摄控制板和线缆。
- 查原理图、资源分配表和当前源码宏。
- 不用其他板卡的引脚表推断本机。
本节代码:编码器实验
仓库目录:stm32/labs/encoder/stm32f103-stdperiph。完整文件集见 metadata/code-resource-manifests/encoder.txt。验收:能定位编码器计数。边界:仅静态核对。
41.4 工作原理¶
初始化把芯片引脚和内部外设配置成软件可用资源。GPIO引脚读取开关量或输出方向、使能信号;定时器产生 PWM,也能读取编码器;UART 与主控通信;CAN 连接扩展总线;I²C或SPI常用于读取 IMU。车型选择进一步决定轮号、运动学、转向、显示和自检阈值。
R680 C50C 的 TYPE 可由车型选择电位器决定,并在重新上电后生效。错误 TYPE 会让同一组接口按错误底盘解释。
41.5 外设最小实验¶
实验一:串口收发与回环¶
目标与基线¶
目标是把串口问题拆成时钟、GPIO、帧格式、中断接收和应用处理五层。基线工程使用USART的第 1 组外设 USART1:PA9 为发送端 TX,PA10 为接收端 RX,配置为 9600 bit/s、8 数据位、1 停止位、无校验、无硬件流控;接收中断读取一个字节后原样发回。
USB-TTL 串口模块把电脑的 USB 数据转换为微控制器可用的TTL电平串口信号。它只负责信号转换,不会自动修正接反的 TX/RX、错误波特率或不兼容电压。
操作前检查¶
- 查当前板卡原理图,确认调试串口连接的是 USART1,并排除 USB 下载口、其他 UART 或 RS-232 电平接口。
- 优先使用 3.3 V TTL。USB-TTL 的 TX 不得输出 5 V,也不能把 RS-232 正负电压直接接到 MCU。
- 除非已确认供电方案,不连接 USB-TTL 的 VCC,只连接 TX、RX、GND;接线和改线均在断电状态完成,避免双路供电和反灌电。
- TX 与 RX 交叉连接并共地。先短接 USB-TTL 自身 TX/RX 做适配器回环,再断电连接 MCU。
- 断开会占用同一串口的主控、蓝牙、下载器或其他模块。
- 在工程设置中确认目标为实际 MCU,先不改源码完成一次干净构建。
- 串口工具关闭自动追加未知字节,选择 9600-8-N-1,同时启用十六进制发送和十六进制显示。
实验步骤¶
- 保持电机与执行器失能,烧录已经确认适配当前测试板的串口实验固件。
- 上电后打开对应串口,以十六进制发送模式逐次发送
41、00、7F、55 AA;每组数据都应原样返回。若工具显示 ASCII 字符4、1等,说明当前显示模式不适合检查字节值。 - 每次只改变一个因素:先核对接收字节,再核对是否原样回传。
- 改为文本显示,发送带回车换行和不带回车换行的字符串,记录串口工具是否自动附加
0D 0A。 - 仅为诊断帧格式时,可在 PC 端故意选择一个错误波特率,记录乱码特征后立即恢复 9600。
- 在
PA9/TX上观察发送波形,保存串口配置、发送字节、接收字节和时间戳。 - 每组至少重复 20 次;本实验的通信通过门槛是字节值、顺序和数量全部一致,不能用“多数正确”代替。
预期观察¶
- 9600-8-N-1 下,每个发送字节只返回一次,数值和顺序不变。
00与7F能在十六进制模式下正确显示,证明不是只处理可打印字符。- 选择错误波特率时出现乱码或无有效回显,恢复后回显正常。
- 逻辑分析仪或示波器上能看到空闲高电平、起始位、8 个数据位和停止位;位宽约为 \(1/9600\ \text{s}\),即约 \(104\ \mu\text{s}\)。
实验二:PWM 频率与占空比¶
目标与基线¶
目标是证明“定时器配置 → 比较寄存器 → 引脚波形”的链路。本实验只测量微控制器引脚,不接入电机功率级。基线工程使用定时器 2 的第 1 通道 TIM2_CH1 和 A 组第 0 号引脚 PA0。预分频寄存器 PSC 把定时器输入时钟降频,自动重装载寄存器 ARR 决定一个 PWM 周期包含多少个计数,捕获/比较寄存器 CCR1 决定第 1 通道在何处切换电平。这里设置 ARR=999、PSC=71。若定时器输入时钟为 72 MHz,则:
工程每 1 ms 把比较值改变 1,使 CCR1 在约 0~1000 之间往返,因此非饱和区约每秒走完一个方向。由于 PWM 模式、极性和有效电平会影响高低电平占比,应以示波器测量为准,不只根据 CCR/ARR 猜测亮度或电机输出。
对边沿对齐、向上计数且 \(0\le CCR\le ARR+1\) 的常见情况,PWM1 的活动占比约为 \(CCR/(ARR+1)\),PWM2 为其补值 \(1-CCR/(ARR+1)\);输出极性再决定活动状态表现为高电平还是低电平。
操作前检查¶
- 查原理图确认
PA0没有连接电机驱动、传感器或会被损坏的外设。 - 只用高阻示波器或逻辑分析仪观察;GPIO 不能直接连接电机。
- 从时钟树确认 TIM2 的实际输入时钟。APB1 分频不为 1 时,定时器时钟可能是 APB1 外设时钟的两倍。
- 检查定时器通道、GPIO 复用模式、
PSC、ARR、PWM 模式、极性和CCR1初值。 - 探头地夹接系统地,不夹到 PWM 输出或电源正极。
实验步骤¶
- 保持所有执行器断开,烧录与当前测试板匹配的 PWM 实验固件。
- 先把比较值固定在 500 附近,测
PA0的频率和电压上下限;按时钟误差和仪器精度预先写下允许频率误差。 - 再启用步长为 1、每 1 ms 更新一次的扫描,分别截取非饱和的 25%、50%、75% 比较值和两个端点波形。
- 根据实际定时器时钟、
PSC和ARR手算频率,与示波器结果比较。 - 根据 PWM 模式和极性解释
CCR1增大时高电平或低电平时间怎样变化。 - 只在个人工作副本中把
CCR1固定为 250、500、750,逐次重新构建;根据 PWM1/PWM2 和极性分别预测活动占比及高电平占比,再与实测比较。不要直接修改教材仓库检出的基线。
预期观察¶
- 在 72 MHz 定时器时钟假设成立时,非饱和比较值处频率接近 1 kHz,且比较值变化不会改变基本周期。
- 固定比较值为 250、500、750 时,PWM1 的活动占比约为 25%、50%、75%,PWM2 为其补值 75%、50%、25%;输出极性决定示波器看到的高电平占比。
- 基线扫描中,占空比约每秒走完一个方向,再反向变化;频率保持稳定。
CCR=0或CCR=ARR+1附近可能成为恒定电平,示波器频率读数为 0 或无定义;频率只在非饱和占空比处验收,端点只验收直流电平。- 实测频率超出预先记录的允许误差时,优先检查时钟树、预分频、自动重装载值和探头设置。
实验三:编码器计数与方向¶
目标与基线¶
目标是证明“两路正交信号 → 定时器编码器模式 → 有符号增量”的链路。两路正交信号相位相差约四分之一周期,控制器根据哪一路先变化判断旋转方向。基线工程把 TIM4 的 PB6/PB7 配置为两路浮空输入,使用同时读取两路输入的 TI12 编码器模式;主循环每 200 ms 读取一次计数增量,打印到 9600 bit/s 串口,然后清零计数器。
操作前检查¶
- 查当前板卡和编码器文档,确认 A/B 相电压、供电、输出类型和每转计数定义。
- 开漏输出需要上拉到 MCU 允许的逻辑电源,通常是经板卡确认的 3.3 V;不能因基线代码使用浮空输入就省略电气核对。
- 确认 A/B 相接到实际 TIM4_CH1/TIM4_CH2 引脚;如果板卡重映射或被其他外设占用,停止实验。
- 先用逻辑分析仪或示波器独立观察 A/B 两相,确认幅值、相位和无明显毛刺。
- 电机不通电。优先手动转动编码器轴或用隔离的逻辑信号源输入。
实验步骤¶
- 烧录与当前测试板匹配的编码器实验固件,打开 9600-8-N-1 串口。
- 保持轴静止至少 2 s,记录每个 200 ms 窗口的计数。
- 缓慢正向转动固定角度,记录每个窗口的计数符号;由 PC 端把各窗口的有符号增量求和得到本段总量。停止并取得静止窗口后,再开始反向段。
- 必须断电后交换 A/B 相:断电并确认无反灌电,交换两相后重新上电测试符号;随后再次断电并恢复原接线,禁止带电换线。
- 用逻辑分析仪统计一段已知脉冲,与串口计数比较,注明计数模式是否对每个边沿计数。
- 对 16 位计数器,可在每次读取时把原始计数按
int16_t解释为有符号增量并清零;前提是单个窗口的绝对计数小于 32768。也可以使用中点偏置和模差,但必须记录具体算法,不能把下溢后的大无符号数直接当作正向计数。 - 用 PC 时间戳或硬件定时器测量每个实测时间窗 \(\Delta t\)。若已知同一机械轴每转对应的定时器有效计数 \(N\),用
$$ \omega=\frac{2\pi\,\Delta n}{N\,\Delta t} $$
计算角速度。\(N\) 必须包含当前 TI12 模式的有效边沿倍频和减速比定义;基线代码中的普通 200 ms 延时只给出名义窗口,串口打印等开销会改变实测时间窗,因此不能直接把 0.2 s 当成精确值。
预期观察¶
- 输入信号稳定时,连续 10 个静止窗口的增量应为 0;跳变表示输入悬空、接地/供电错误或噪声过大。
- 同一方向转动时计数符号稳定;反向转动或交换 A/B 相后符号反转。
- 相同角度、相近速度下,多次计数结果应落在实验前写下的允许偏差内;已知脉冲源测试则应按编码器模式预测准确计数。
- 逻辑分析仪边沿数、所选编码器模式和串口计数能解释彼此差异。
41.6 验收标准¶
- 每个已接接口都有正确初始化函数。
- 车型 TYPE 与底盘机械结构一致。
- 编码器轮号、PWM 输出和驱动器通道一一对应。
- IMU 原始轴经过软件转换后符合机器人坐标。
- 未使用的接口处于安全状态。
41.7 故障排查¶
| 现象 | 检查 |
|---|---|
| 串口无数据 | 端口、引脚复用、波特率、收发方向 |
| 编码器不计数 | 定时器通道、线序、上拉和供电 |
| TYPE 调整后不变 | 是否重启、电位器范围和读取逻辑 |
| 某车型轮号错乱 | 车型分支、接口映射和线束 |
本章代码:外设最小实验
使用 stm32/labs/uart/stm32f103-stdperiph/main.c、stm32/labs/pwm/stm32f103-stdperiph/main.c 与 stm32/labs/encoder/stm32f103-stdperiph/main.c 及各自完整依赖目录。验收:能定位串口、PWM、编码器初始化;边界:静态阅读,不作硬件适配结论。