ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

STM32F103C8T6复刻电赛H题:MPU6050+灰度传感器串级PID小车

STM32F103C8T6复刻电赛H题:MPU6050+灰度传感器串级PID小车 用 stm32f103c8t6 复刻 24 年电赛 H 题核心思路说白了就是用 MPU6050 给小车一个“身体姿态”用五路灰度传感器给小车一个“赛道位置”再用角度环和位置环把这两个信息串成一个闭环控制。这个项目最值得看的不是硬件有多新而是它把惯性测量、传感器读取、串级 PID 和状态机这些嵌入式控制基本功全串起来了。适合正在备赛的学生也适合想从点灯进阶到运动控制的开发者。下面按我实际调试的顺序拆一遍尽量把能复现的步骤和容易掉坑的点都写出来。1. 先判断你要复刻的到底是哪种小车1.1 控制链路都一样但机械结构决定调试方法24 年 H 题的具体题目要求不同赛区可能有细节差异。但复刻这个项目时核心控制链路通常是同一个MPU6050 负责实时输出姿态角度五路灰度传感器负责判断车相对赛道的横向位置位置环根据横向偏差给出目标角度角度环再根据目标角度和当前角度计算电机输出。这听起来像经典的“串级 PID”但在落地之前先把机械结构搞清楚更重要。如果你做的是两轮自平衡车角度环不仅管转向还要管直立位置环输出的是目标倾角车靠倾角产生前后运动。如果你做的是四轮或三轮车角度环更多是管车身水平或转向角位置环输出的是目标转向角不直接改变整车的直立状态。我建议先把原题的任务分解成几张纸需要识别哪些赛道元素允许停车还是必须连续跑传感器装在车头还是底盘电机是减速电机还是带编码器。这个分解越细后面选参数时越不容易乱。1.2 MPU6050 在这里不只是一个“陀螺仪”很多新手把 MPU6050 当成“测角度”的单品直接读它给的欧拉角。实际上 MPU6050 内部只输出三轴加速度和三轴角速度并没有直接输出你想要的 pitch 和 yaw。所谓“MPU6050 姿态解算”是把加速度计和陀螺仪的数据融合成一个稳定的角度值。融合方法有很多DMP、互补滤波、Mahony、EKF。对 stm32f103c8t6 这个资源水平的项目我更建议先在串口里打印原始 acc 和 gyro确认数据稳定后再用互补滤波或 DMP。DMP 能省掉自己写滤波的精力但要移植 InvenSense 的库工程会大一点互补滤波代码少调好系数后足够应付大多数赛道场景。注意不要一上来就调 PID。先让 MPU6050 的角度在桌面上稳定不乱跳再谈后面的姿态控制。1.3 五路灰度传感器负责输出“位置偏差”五路灰度传感器常见做法是五个模拟输出或五个数字输出。模拟输出可以接 ADC通过阈值或者插值得到每一路“黑/白”状态数字输出则直接给 GPIO。为了得到连续的位置偏差一般把五路编号从左边到右边设为 -2、-1、0、1、2检测到黑线的加权平均就是当前位置offset (w_left2 * (-2) w_left1 * (-1) w_center * 0 w_right1 * 1 w_right2 * 2) / active_count如果只有一路压线offset 就是对应编号两路压线就取中间值。这个量就是位置环的输入。角度环的输入是姿态角度位置环的输入则是这个赛道偏差。2. stm32f103c8t6 的资源够用但别把引脚规划想得太简单2.1 为什么选 c8t6 而不是更大芯片stm32f103c8t6 是以前最常用的入门芯片64KB Flash、20KB RAM、最高 72MHz内置定时器、I2C、SPI、USART、ADC。现在市面上的“最小系统板”很多是国产兼容型号只要工程里不依赖特殊寄存器大部分场景和原厂行为一致。用它复刻 H 题资源整体够用前提是你别把大量数据放到 RAM 里也别在中断里做重计算。很多人纠结要不要换成引脚更多的 stm32f103zet6。对这个小车项目c8t6 不够用的情况其实是引脚分配问题而不是性能不够。比如 I2C 要接 MPU6050 和 OLED串口要调试PWM 要接电机驱动ADC 要接五路灰度只要把这些外设错开64 脚是完全够用的。2.2 最小系统板的标准接线我先给一个通用接线参考具体引脚要以你自己的板子原理图为准ST-LINK 下载SWDIO 接 PA13SWCLK 接 PA14GND 共地。如果下载器带 3.3V 输出可以给板子供电但电机驱动不能从 SWD 口取大电流。MPU6050I2C1 的 SCL 一般接 PB6SDA 接 PB7模块 VCC 接 3.3VGND 共地。MPU6050 地址由 AD0 决定默认 0x68AD0 拉高为 0x69。五路灰度如果模块输出模拟电压接 PA0-PA4 这类 ADC 引脚如果输出数字电平接普通 GPIO同时确认逻辑电压是 3.3V 还是 5V。电机驱动PWM 引脚尽量选带定时器复用功能的引脚方向引脚随意驱动板 EN 使能要接上不要悬空。OLED如果 I2C 被 MPU6050 占用可以用软件 I2C 接 PB8/PB9或者把两者挂同一条 I2C 总线地址不同就不冲突。最好把最小系统板的原理图也打印一份对照着找引脚。网上能找到很多“stm32f103c8t6 引脚功能”表但不同厂家核心板的丝印位置可能不一样不要靠颜色猜。2.3 供电设计最容易翻车小车刚上电 PWM 还没初始化时电机驱动可能处于不确定状态导致车轮猛转。所以供电顺序很重要先让单片机下载程序并复位再给电机驱动上电或者加一个总开关。电池电压不要直接接到 3.3V 稳压器否则 MPU6050 的数据会抖ADC 的灰度读数也会飘。这里还有一个容易忽略的点MPU6050 模块上如果有稳压芯片可以接受 5V 输入如果是裸芯片就必须 3.3V。I2C 上拉电阻一般模块已经自带裸芯片需要自己加。MPU6050 的外围电路不算复杂但布局上要离电机和驱动板远一点尤其不能让电机的大电流回路经过传感器地线否则姿态数据会非常难看。3. 工程搭建时钟、PWM、I2C 和 ADC 先各自跑通3.1 用标准库还是 HAL 库标准库上手直接HAL 库能用 CubeMX 快速生成。让我选的话没有绝对优劣关键是别混用。调 PID 时需要在中断里读传感器标准库门槛低一些HAL 库在普通 GPIO、串口、I2C 上也很顺手但要注意很多函数会阻塞或者带超时。如果用 HAL尽量把 I2C 的传输错误处理成返回失败而不是死等。无论用哪套库第一步都先确认时钟。最小系统板外部晶振通常是 8MHz配置成 72MHz 主频。如果你的板子是 12MHz 晶振还套用 9 倍频串口波特率和定时器周期全都会偏。这个可以先看原理图再用调试器读时钟寄存器确认。如果英文手册看着费劲可以拿一份 stm32f103c8t6 中文手册速查复用功能表但关键配置还是要以实际芯片和参考手册为准。3.2 TIM1 的 PWM 输出别忘主输出使能stm32f103c8t6 的 TIM1 是高级定时器很多人配置完 PWM 但电机不动原因就是没有使能主输出。标准库下需要调用TIM_CtrlPWMOutputs(TIM1, ENABLE)HAL 库下要调用__HAL_TIM_MOE_ENABLE(htim1)。这是 TIM1/TIM8 和普通定时器 TIM2-TIM4 的明显区别。PWM 频率不要随便设。电机驱动一般用 10kHz 到 20kHz 比较合适太低会有噪声和抖动太高会增大开关损耗。方向引脚用普通 GPIO 控制高低电平PWM 只控制占空比两者不要接反。接线前先查一下定时器复用映射不是随便一个引脚都能输出 TIM1 的 PWM。3.3 I2C 读取 MPU6050 的坑MPU6050 上电后建议先初始化电源管理和采样率再把加速度计和陀螺仪的量程配好。读取时注意MPU6050 的数据寄存器是 16 位有符号数需要把两个 8
返回列表