站内搜索
发作品签到
立创训练营+使用G3507为主控的简易pid控制项目
专业版

立创训练营+使用G3507为主控的简易pid控制项目

简介

使用立创天猛星来完成简易PID控制。在示范案例的基础上将开发板的引脚通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。

简介:使用立创天猛星来完成简易PID控制。在示范案例的基础上将开发板的引脚通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。
电赛TI训练营-简易PID项目

开源协议

GPL 3.0

创建时间:2025-05-09 13:15:32更新时间:2025-06-17 10:53:21

描述

项目简介

本项目使用立创天猛星来完成简易PID控制。作为初学者,我在本次项目的实现中学到了许多,其中关于FlexibleButton库的知识使我大受裨益。在PCB的设计上,我以示范案例将编码器引脚引出作为灵感,将开发板的可供编程引脚均通过排针引出,为其他项目的开发带来了可能,提高板子的使用率,减少吃灰的可能性。

项目功能

本项目是基于立创·天猛星的简易PID控制系统。立创·天猛星的芯片为MSPM0G3507,作为来自TI的芯片,我对于它的相关应用是比较陌生的。
作为一个简易PID控制系统,我们可以通过五个独立按键去启动or关闭电机,主动去修改kp、ki、kd的数值来观察对电机的影响。同时系统也采用了一块1.9寸的tft显示屏,通过SPI接口,为项目带来了直观的数据曲线以及清晰的菜单显示。

原理解析(硬件说明)

本项目由以下部分组成:

  1. 电源部分
  2. 主控部分
  3. 人机交互部分
  4. 电机驱动部分

PCB设计.jpg

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

图2--主控部分:
image.png
根据立创·天猛星的引脚定义说明图,不难做出上图设计。将A07,A09,A28,A31等引脚配置为按键输入;将B0,B1设置为编码器引脚等等。
image.png
同时在原版开源工程的结构上,我加入了两个双排针,将天猛星的所有引脚引出,为未来的开发设计留下空间。

图3--人机交互部分:
image.png
本项目中的人机交互主要有两个功能,一、按键功能,二、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:首页设计
IMG20250611181750.jpg

图2:定速功能
IMG20250611181837.jpg

图3:定距功能
IMG20250611181852.jpg

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
index.jpg
0
2
原理图.jpg
0
3
PCB设计.jpg
0
4
WINE_PID.zip
0
5
1.2x.mp4
0
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航