
立创训练营+使用G3507为主控的简易pid控制项目
简介
使用立创天猛星来完成简易PID控制。在示范案例的基础上将开发板的引脚通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。
简介:使用立创天猛星来完成简易PID控制。在示范案例的基础上将开发板的引脚通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。开源协议
:GPL 3.0
描述
项目简介
本项目使用立创天猛星来完成简易PID控制。作为初学者,我在本次项目的实现中学到了许多,其中关于FlexibleButton库的知识使我大受裨益。在PCB的设计上,我以示范案例将编码器引脚引出作为灵感,将开发板的可供编程引脚均通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。
项目功能
本项目是基于立创·天猛星的简易PID控制系统。立创·天猛星的芯片为MSPM0G3507,作为来自TI的芯片,我对于它的相关应用是比较陌生的。
作为一个简易PID控制系统,我们可以通过五个独立按键去启动or关闭电机,主动去修改kp、ki、kd的数值来观察对电机的影响。同时系统也采用了一块1.9寸的tft显示屏,通过SPI接口,为项目带来了直观的数据曲线以及清晰的菜单显示。
原理解析(硬件说明)
本项目由以下部分组成:
- 电源部分
- 主控部分
- 人机交互部分
- 电机驱动部分

图1--电源部分:

本次项目因为是供以初学者学习使用,所以所有的PCB设计都较为简单,焊接难度较为容易。
电源部分没有采用锂电池这种常见设计,而是直接通过一个4pin的TYPE-C口为整个系统供电。同时串联上一个LED灯作为系统的电源显示。
图2--主控部分:

根据立创·天猛星的引脚定义说明图,不难做出上图设计。将A07,A09,A28,A31等引脚配置为按键输入;将B0,B1设置为编码器引脚等等。

同时在原版开源工程的结构上,我加入了两个双排针,将天猛星的所有引脚引出,为未来的开发设计留下空间。
图3--人机交互部分:

本项目中的人机交互主要有两个功能,一、按键功能,二、tft显示屏。连接都较为简单,按键在设计上设为上拉电阻,显示屏则按照厂家与SPI的连接方式简单的连接即可。
软件部分
在本次项目中最使我惊艳的部分当属TFT屏的ui绘制以及FlexibleButton库了。
首先来看ui绘制部分。
//绘制首页界面
void ui_home_page(void)
{
//关闭背光
LCD_BLK_Clr();
//绘制全局背景
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
//绘制来源
disp_x_center(3,14,BLUE,16,(unsigned char *)"立创天猛星开发板 简易PID控制");
//绘制标题
disp_x_center(3+16+3,8,BLUE,16,(unsigned char *)"Designed by WINE");
int x = 40;
int x_offset = 80;
int y = 65;
int y_offset = 80;
//绘制任务一:PID定速
disp_string_rect(x, x_offset, y, y_offset, 2, 24, "定速", BLUE);
int x2 = 200;
int x2_offset = 80;
int y2 = 65;
int y2_offset = 80;
//绘制任务二:PID定距
disp_string_rect(x2, x2_offset, y2, y2_offset, 2, 24, "定距", BLUE);
//根据首页当前选择内容 绘制选择框
switch( get_default_page_flag() )
{
case 0:
disp_select_box(40,80,65,80,10,5,WHITE);
break;
case 1:
disp_select_box(200,80,65,80,10,5,WHITE);
break;
}
LCD_BLK_Set();//打开背光
}
//根据按键选择绘制首页两个选项的选择框
void ui_home_page_select(int mode)
{
char select_box_seze = 5;
switch(mode)
{
case 0: //选择PID定速模式
disp_select_box(40,80,65,80,10,select_box_seze,WHITE);
disp_select_box(200,80,65,80,10,select_box_seze,BLACK);
break;
case 1: //选择PID定距模式
disp_select_box(40,80,65,80,10,select_box_seze,BLACK);
disp_select_box(200,80,65,80,10,select_box_seze,WHITE);
break;
}
}
typedef struct {
unsigned int start_x;
unsigned int start_y;
unsigned int end_x;
unsigned int end_y;
unsigned int center;
} TXT_OBJECT;
//绘制定速页界面
void ui_speed_page(void)
{
TXT_OBJECT p={0},i={0},d={0};
//关闭背光
LCD_BLK_Clr();
//绘制全局背景
LCD_Fill(0,0,LCD_W,LCD_H,BLACK);
int str_center_x = (24 * 1) / 2;
//显示静态的 P I D 标题
LCD_ShowChar(screen_center_x - str_center_x - 84,87,'P',WHITE,BLUE,16,1);
LCD_ShowChar(screen_center_x - str_center_x, 87,'I',WHITE,BLUE,16,1);
LCD_ShowChar(screen_center_x - str_center_x + 84,87,'D',WHITE,BLUE,16,1);
//显示 P 参数的圆角矩形背景
p.start_x = screen_center_x - str_center_x - 84 - 30;
p.start_y = 60+44;
p.end_x = screen_center_x - str_center_x - 84 + 40;
p.end_y = 60+44+24;
LCD_ArcRect(p.start_x, p.start_y, p.end_x, p.end_y, BLUE);
//显示 I 参数的圆角矩形背景
i.start_x = screen_center_x - str_center_x - 30;
i.start_y = 60+44;
i.end_x = screen_center_x - str_center_x + 40;
i.end_y = 60+44+24;
LCD_ArcRect(i.start_x, i.start_y, i.end_x, i.end_y, BLUE);
//显示 D 参数的圆角矩形背景
d.start_x = screen_center_x - str_center_x + 84 - 30;
d.start_y = 60+44;
d.end_x = screen_center_x - str_center_x + 84 + 40;
d.end_y = 60+44+24;
LCD_ArcRect(d.start_x, d.start_y, d.end_x, d.end_y, BLUE);
//显示静态的 Speed: Target: 标题
LCD_ShowString(20,170-34,"Speed: ",WHITE,BLUE,24,1);
LCD_ShowString(320-150,170-34,"Target: ",WHITE,BLUE,24,1);
LCD_BLK_Set();//打开背光
}
通过基础的点线与色块填充,开源做出效果非常优秀的ui设计,这使我大受震撼。
让我反复钻研的当属FlexibleButton库了,与我此前学习的直接io控制,作为外部触发中断,或者是定时器前后台轮询相比,都更加优秀。其中的结构体,多任务,不同事件触发回调函数等等思想令我耳目一新,这种全新的架构使得裸机开发也可以似操作系统一般有条不紊。
注意事项
本次项目我一共焊接了两套实物,当然是因为第一版在PCB设计上出现了问题。。。
在复刻开源工程时,我错误的将按键引脚连接到了A01,A08(正确的连接为A08,A09)。这直接的导致了,我的一个按键与UART0-RX复用了A01。。。希望大家绘制原理图的时候擦亮双眼。
效果示意图
接下来是项目的一些实拍图
图1:首页设计

图2:定速功能

图3:定距功能

设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










