# FPGA平衡车 **Repository Path**: whpUp/fpga-balanced-vehicle ## Basic Information - **Project Name**: FPGA平衡车 - **Description**: 使用FPGA实现的平衡小车 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 10 - **Forks**: 2 - **Created**: 2023-11-19 - **Last Updated**: 2025-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FPGA平衡小车 #### 一. 硬件介绍 底板资源: 1. TB6612电机驱动芯片 * 2 2. MPU6050陀螺仪 3. WS2812 RGB彩色灯 * 4 4. 红外接收头 5. ESP-01S WIFI 核心板 1. 微相 A7_Lite Artix-7 FPGA开发板 电机采用的是平衡小车之家的MG310(GMR编码器)电机。底板上有两个TB6612芯片,可以驱动四个电机,除了做平衡小车之外,也可以用来作为四驱车的底板,非常nice,同时支持两种控制方式,推荐通过红外遥控进行控制,实现起来非常简单,红外遥控器也非常便宜。 ## 二. RTL 介绍 本次设计分为三大部分: **MPU6050姿态解算 , 电机驱动(PWM+编码器) , 平衡控制**,遥控器控制的模块另外算。其中MPU6050姿态解算为设计的核心,解算出来的角度越稳,平衡控制就越容易,小车也就越稳定。平衡控制其核心是调节PID的参数,参数调的好,小车没烦恼。 这里只对框架上做一个简单的介绍,具体的实现说明可以在我的微信公众号上获取: FPGA之旅 整体架构如下 ![整体架构](https://gitee.com/whpUp/fpga-balanced-vehicle/raw/master/4.%20Image/整体架构.png) ##### 1. MPU6050姿态解算 模块数据流如下图所示,将获取到的角度进行一个8阶的FIR滤波,加速度进行一个2阶的IIR滤波,即可得到相对平滑一点的数据,然后经过Cordic算法进行姿态解算,即可得到roll和pitch角度,为了得到更加平滑一点的roll和pitch数据,这里将得到的角度再进行了一个1阶的均值滤波(本来使用的是3阶的均值滤波,但是相位延时有点大,所以修改为1阶的了) ![mpu6050](https://gitee.com/whpUp/fpga-balanced-vehicle/raw/master/4.%20Image/mpu6050.png) ##### 2. 电机驱动(PWM+编码器) 框图如下,在实际使用的时候,只使用了速度的检测,角度检测这部分功能就去掉了,PWM生成模块另算,这部分的代码是比较简单的,就不作过多的说明了。 ![编码器](https://gitee.com/whpUp/fpga-balanced-vehicle/raw/master/4.%20Image/编码器.png) ##### 3. 平衡控制 平衡车的控制采用三环: 直立环、速度环、转向环,来进行控制,直立环采用的是PID进行控制,速度环采用的是PI进行控制,而转向环由于yaw在MPU6050解算的时候,误差较大,所以没有使用PID来进行控制转向的速度,而是直接输出的两轮的速度差进行控制。框图如下,三环通过PID进行调节后,相加得到最终的PWM值进行输出。三5环的具体实现可以参考开源的平衡小车C语言实现,所以难点不在代码实现上,而在于PID的调参上面,没有经验且没有人指导的情况下,那简直是噩梦,如果长时间没有调好的话,容易怀疑是不是小车的结构有问题(但小车的结结构一般是没有问题的,哈哈哈)。 ![平衡控制](https://gitee.com/whpUp/fpga-balanced-vehicle/raw/master/4.%20Image/平衡控制.png) ##### 4. 遥控控制 本来想使用低成本高效率的红外遥控来对小车进行控制的,但是出现了意外,接收到的红外遥控值不稳定,按同一个按键,接收到值居然不一样。没办法,还好弄了个esp-01S,可以通过tcp进行连接,之前弄四轴飞机的有程序,可以拿来直接使用,美滋滋。 ## 三. 总结 FPGA平衡小车的基本架构就已经介绍完了,很多模块在都已经实现过,拿来通过简单的修改就可以直接用了,代码实现上还是比较轻松的,难点在于PID的调参上,也是花了非常多的时间。 项目开源gitee链接: https://gitee.com/whpUp/fpga-balanced-vehicle/tree/master 演示视频: https://www.bilibili.com/video/BV19j411E7MA/?spm_id_from=333.999.0.0&vd_source=ff49aebe9f63248ee9e81ca05d813c39