# pid-tutorial **Repository Path**: littlewatermoon/pid-tutorial ## Basic Information - **Project Name**: pid-tutorial - **Description**: 嘉立创 PID 入门项目 - **Primary Language**: C - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-09 - **Last Updated**: 2025-06-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 嘉立创电赛 TI 训练营 - 简易 PID 项目 硬件白小纯的第一个 PID 项目,终于完成了,✿✿ヽ(°▽°)ノ✿ ![img](./img.png) ## 项目地址 [嘉立创开源广场-pid-tutorial](https://oshwhub.com/littlewatermoon/pid-tutorial) ## 功能演示视频 [Bilibili 演示视频](https://www.bilibili.com/video/BV1CHTvz6En6) ## 原理图说明 * 主主控是天猛星自带的 TI 芯片 MSPM0G3507 * 电机驱动是 BDR6126D,电机买的是 1:90 减速比的编码器电机 * 屏幕则是金逸晨的 1.28吋圆形 SPI 屏幕,分辨率 240x240, 驱动是 GC9A01 * 其它相对于嘉立创给出的原理图的修改 * 22uF 电容改成了贴片的 * Type-C USB 改成之前剩的卧贴16P 的 * 电源开关也改成之前剩的 SK12D07VG3 * 按键开关换成更便宜 KH-6X6X5H-TJ(感觉不好按, 果然便宜没好货?) ## 物料购买和装配说明 * 打板必须是必须得大赞的嘉立创免费打板了(活动还送了两张免费券,外加本来就每月可以领的 2 张, 绝对的良心企业) * 元件除了电机和屏幕在淘宝外,都是商城买的。天猛星开发板、其它元件的话,送的券能买好几份元件,而且这个的焊接难度不大,基本不太会出现浪费 * 装配的话,如果买的是活动推荐的屏幕直接插上去即可。不过我用的是自己买的一块屏幕,只有 7 根线(没 BLK),而且线序和天猛星不太一样,但是对着接就好 ## 功能说明 * 主界面(开机自动进入) * 屏幕上方显示标题(中文、 中英混排) * 通过左右两个按键选择功能按钮 * 中间按键进入功能子界面 * 输入说明 * 按键接入的是 flexible_button 库(感谢原作者 MurphyZhao 贡献了这么好用的库并开源) * 本工程指使用了按键的**单击**、**双击**和**长按**功能 * 单击: 选择功能、调整 PID 参数、开始和暂停 PID 算法调整电机 * 双击: 返回上一层界面,目前只在定速或者定距子界面会有用 * 长按:快速调整 PID 参数 * PID 定速功能 * 屏幕上方 * 默认为空白 * 开始用 PID 调速后(通过单机中间按键开始和暂停),会显示出以下信息: * 速度曲线边框(黄色)和中间点(0 点, 在边框两侧用小短横线标识) * 当前时刻点(横轴 x)目标曲线点的**目标速度**(红色标出),调整 Target 后这个点也会随之变化 * 当前时刻点时,电机的**实时速度** * 屏幕下方 * 里面有三个可调参数按钮(P/I/D),对应 PID 算法的三个静态参数 * 此外还有一个目标参数 Target,即希望将通过 PID 算法将电机调整到的速度值 * 另外,在 Target 按钮上方会以文本的形式实时显示电机当前速度 * 说明: * 这里提到的速度是指每 20ms 周期内采集到的电机 A、B 相的编码器值 * 实际测试时最大值约为 110,所以程序中的可调范围设为了 110(可修改 app/piddemo.h 中的宏 MAX_SPEED_TARGET 进行修改) * PID 定距功能 * 功能和定速大同小异, 区别在于调整的是电机的转动角度而不是速度 * 最大角度设为了 360 度(MAX_ANGLE_TARGET) ## 代码目录说明 * empty.c - 入口文件 * ti_msp_dl_config.h/c - 芯片配置,由 SysConfig 工具生成 * app - 本工程主要逻辑,包括 * app 控制"类" * 主界面 main_window.c * 定速界面 fix_speed_window.c * 定距界面 fix_distance_window.c * PID 控制电机相关 - piddemo.h/piddemo.c * 工程中用到的文本字符串 - text.h * hareward - 硬件相关驱动代码 * encoder.h/c: 编码器相关代码 * key.h/c: 读取按键相关的 GPIO 输入来判断按键是否按下 * lcd*: LCD 显示相关驱动, 包括中文显示、字符显示,中文字模在 lcdfont.h,为了节省内存值保留了 FONT_SIZE 为 16 的字模 * 注意驱动是 GC9A01,一般问淘宝商家要即可 * motor.h/c: 点击驱动 * uart.h/c: 串口初始化和发送字符串, printf 调试接口依赖 * mid - 对 hardware 的一些封装, 但是与具体项目无关可以复用的代码 * input: 输入相关,目前只有按键 * widgets: UI 控件的封装, 包括控件的构建、属性更新以及渲染 * 控件目前实现了简单的`Label`和`Button` * window 作为特殊的控件,属于控件容器,每个 window 都有`Render`、`Update`和`ProcessInput`三个函数 * printf.h/c: printf 函数输出到串口,方便调试 * pid.h/c: PID 算法实现 * ui.h/c: UI 管理器,用于整个 app 的窗口系统,包括窗口的驱动更新、输入事件派发、以及窗口路由跳转 * uitls.h/c: 辅助函数的实现 * 中英文混合显示 * 绘制 PID 曲线等 ## 心得体会 这个项目设计的硬件部分不对,相对简单 主要的精力在于 UI 的绘制 一开始想移植 lvgl 进来的,编译完,发现了 link 的时候提示芯片内存不够了。后面发现时间有点紧就放弃了继续查具体什么原因了 PID 的调试还是不太容易,尤其是按键不太好按的情况下,经常调个半天曲线还是在目标线上线波动 ## 致谢 感谢嘉立创的这个 PID 活动以及送的 PCB 券和元件券,让我这个硬件小白也体验了一把高大上的 PID 是怎么玩的(虽然还没怎么玩明白)。