跳转至

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、错误波特率或不兼容电压。

操作前检查

  1. 查当前板卡原理图,确认调试串口连接的是 USART1,并排除 USB 下载口、其他 UART 或 RS-232 电平接口。
  2. 优先使用 3.3 V TTL。USB-TTL 的 TX 不得输出 5 V,也不能把 RS-232 正负电压直接接到 MCU。
  3. 除非已确认供电方案,不连接 USB-TTL 的 VCC,只连接 TX、RX、GND;接线和改线均在断电状态完成,避免双路供电和反灌电。
  4. TX 与 RX 交叉连接并共地。先短接 USB-TTL 自身 TX/RX 做适配器回环,再断电连接 MCU。
  5. 断开会占用同一串口的主控、蓝牙、下载器或其他模块。
  6. 在工程设置中确认目标为实际 MCU,先不改源码完成一次干净构建。
  7. 串口工具关闭自动追加未知字节,选择 9600-8-N-1,同时启用十六进制发送和十六进制显示。

实验步骤

  1. 保持电机与执行器失能,烧录已经确认适配当前测试板的串口实验固件。
  2. 上电后打开对应串口,以十六进制发送模式逐次发送 41、00、7F、55 AA;每组数据都应原样返回。若工具显示 ASCII 字符 4、1 等,说明当前显示模式不适合检查字节值。
  3. 每次只改变一个因素:先核对接收字节,再核对是否原样回传。
  4. 改为文本显示,发送带回车换行和不带回车换行的字符串,记录串口工具是否自动附加 0D 0A。
  5. 仅为诊断帧格式时,可在 PC 端故意选择一个错误波特率,记录乱码特征后立即恢复 9600。
  6. 在 PA9/TX 上观察发送波形,保存串口配置、发送字节、接收字节和时间戳。
  7. 每组至少重复 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,则:

\[ f_{\mathrm{PWM}}=\frac{72\ \mathrm{MHz}}{(71+1)(999+1)}=1\ \mathrm{kHz}. \]

工程每 1 ms 把比较值改变 1,使 CCR1 在约 0~1000 之间往返,因此非饱和区约每秒走完一个方向。由于 PWM 模式、极性和有效电平会影响高低电平占比,应以示波器测量为准,不只根据 CCR/ARR 猜测亮度或电机输出。

对边沿对齐、向上计数且 \(0\le CCR\le ARR+1\) 的常见情况,PWM1 的活动占比约为 \(CCR/(ARR+1)\),PWM2 为其补值 \(1-CCR/(ARR+1)\);输出极性再决定活动状态表现为高电平还是低电平。

操作前检查

  1. 查原理图确认 PA0 没有连接电机驱动、传感器或会被损坏的外设。
  2. 只用高阻示波器或逻辑分析仪观察;GPIO 不能直接连接电机。
  3. 从时钟树确认 TIM2 的实际输入时钟。APB1 分频不为 1 时,定时器时钟可能是 APB1 外设时钟的两倍。
  4. 检查定时器通道、GPIO 复用模式、PSC、ARR、PWM 模式、极性和 CCR1 初值。
  5. 探头地夹接系统地,不夹到 PWM 输出或电源正极。

实验步骤

  1. 保持所有执行器断开,烧录与当前测试板匹配的 PWM 实验固件。
  2. 先把比较值固定在 500 附近,测 PA0 的频率和电压上下限;按时钟误差和仪器精度预先写下允许频率误差。
  3. 再启用步长为 1、每 1 ms 更新一次的扫描,分别截取非饱和的 25%、50%、75% 比较值和两个端点波形。
  4. 根据实际定时器时钟、PSC 和 ARR 手算频率,与示波器结果比较。
  5. 根据 PWM 模式和极性解释 CCR1 增大时高电平或低电平时间怎样变化。
  6. 只在个人工作副本中把 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 串口,然后清零计数器。

操作前检查

  1. 查当前板卡和编码器文档,确认 A/B 相电压、供电、输出类型和每转计数定义。
  2. 开漏输出需要上拉到 MCU 允许的逻辑电源,通常是经板卡确认的 3.3 V;不能因基线代码使用浮空输入就省略电气核对。
  3. 确认 A/B 相接到实际 TIM4_CH1/TIM4_CH2 引脚;如果板卡重映射或被其他外设占用,停止实验。
  4. 先用逻辑分析仪或示波器独立观察 A/B 两相,确认幅值、相位和无明显毛刺。
  5. 电机不通电。优先手动转动编码器轴或用隔离的逻辑信号源输入。

实验步骤

  1. 烧录与当前测试板匹配的编码器实验固件,打开 9600-8-N-1 串口。
  2. 保持轴静止至少 2 s,记录每个 200 ms 窗口的计数。
  3. 缓慢正向转动固定角度,记录每个窗口的计数符号;由 PC 端把各窗口的有符号增量求和得到本段总量。停止并取得静止窗口后,再开始反向段。
  4. 必须断电后交换 A/B 相:断电并确认无反灌电,交换两相后重新上电测试符号;随后再次断电并恢复原接线,禁止带电换线。
  5. 用逻辑分析仪统计一段已知脉冲,与串口计数比较,注明计数模式是否对每个边沿计数。
  6. 对 16 位计数器,可在每次读取时把原始计数按 int16_t 解释为有符号增量并清零;前提是单个窗口的绝对计数小于 32768。也可以使用中点偏置和模差,但必须记录具体算法,不能把下溢后的大无符号数直接当作正向计数。
  7. 用 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、编码器初始化;边界:静态阅读,不作硬件适配结论。

章节导航

上一章:固件架构与 FreeRTOS 任务 · 返回本篇 · 下一章:电机控制与 PID 实现