基于stm32与TJC3224T124_011串口屏的PID调参器(附完整工程)

        电赛在即,每次比赛调PID都是一件比较繁琐的事。每次都要在程序中改完再烧录到板子上,特别耗时。正好最近发现实验室的一块串口屏比较好玩。

                                

        于是就做了这个调PID的东西。它可以通过串口直接修改PID的值,从而达到快速调PID的目的。下面我将完整工程分享给大家。

一、串口屏

        想要详细学串口屏的同学直接点击下面的官方文档学习就行。但对于大部分同学来说,只要会用就行。

淘晶驰资料中心 — 淘晶驰资料中心 1.1.0-2024-03-19 11:50:47 文档 (tjc1688.com)

        下面就是PID调参器的主页面。(大家洗不洗欢嘞!!!)

        PID的调节可以支持21000000.00~-21000000.00以内,可支持2位小数(这个可以设置,下面会说明)

                            

二、STM32函数

int changePID(double *KP,double *KI,double *KD)
{
	
	double val=0;
	u8 x[3];
	u8 a=0;
	u8 sta=0;
	u8 fushu=0;
	u8 t;
	u8 len;
	if(USART_RX_STA&0x8000)//串口1接收到数据
	{					   
		len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
		for(t=0;t<len;t++)
		{
//			USART2->DR=USART_RX_BUF[t];
			
//			while((USART2->SR&0X40)==0);//等待发送结束
			
			if(USART_RX_BUF[t]==0x0c){	//遇到0c表示数字发完,开始发KP/KI/KD
				sta=1;
				continue;
			}
			
			if(USART_RX_BUF[t]=='-'){	//记录负数
				fushu=1;
				continue;
			}
			
			if(sta==0){
				val=val*10+(USART_RX_BUF[t]-'0');	//读取每一位数字字符转化为数字
			}else{
				x[a++]=USART_RX_BUF[t];		//读取调节的是KP/KI/KD
			}
			
		}

		if(fushu){		//负数变号
			val=-val;
		}
		
		val=val/100;	//改为小数
		
		USART_RX_STA=0;
		USART_RX_STA2=0;
	}
	if(x[1]=='P'){		//KP/KI/KD赋值
		*KP=val;
	}else if(x[1]=='I'){
		*KI=val;
	}else if(x[1]=='D'){
		*KD=val;
	}else{
		return 0;
	}
	return 1;
}

        调用函数时,需要初始化串口1(也可以设置,下面会说)。使用函数时,传入PID三个参数的地址,成功修改会返回1,失败会返回0。

三、说明

1、修改小数点

        要修改到小数点后几位,首先修改参数vvsl,比如保留小数点后3位,就把vvsl改为3;

        然后代码部分修改此处即可,如果保留小数点后3位,就把100改为1000。我想大家都是能看懂的,就不过多解释了。

2、修改串口

        将changePID中对应的串口1标志位改为其他串口标志位就行。

3、串口屏代码下载不进去

        点击设备更改成自己屏幕的型号,然后编译一下,如果报错修改一下图片的比例。

4、波特率

        使用的都是115200。串口屏的波特率可以在Program.s里修改。

四、完整工程

        串口屏资源放在我主页的资源中了,大家可以自行下载。下面给出的是stm32主函数代码。

        最后浅浅聊一下,串口打印的乱码都给孩子整抑郁了。。。但是看到最终的成品就觉得这一切都是值得的。可能这就是嵌入式的浪漫吧。

 

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usart2.h"
//ALIENTEK Mini STM32开发板范例代码3
//串口实验   
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司

int changePID(double *KP,double *KI,double *KD);

 int main(void)
 {	
	double KP=0,KI=0,KD=0;
	delay_init();	    	 //延时函数初始化	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
	uart1_init(115200);	 //串口初始化为9600
	uart2_init(115200);
	LED_Init();		  	 //初始化与LED连接的硬件接口 
 
	while(1)
	{
		if(changePID(&KP,&KI,&KD)){
			printf("\r\nKP=%lf KI=%lf KD=%lf",KP,KI,KD);
		}
	}	 
}

int changePID(double *KP,double *KI,double *KD)
{
	
	double val=0;
	u8 x[3];
	u8 a=0;
	u8 sta=0;
	u8 fushu=0;
	u8 t;
	u8 len;
	if(USART_RX_STA&0x8000)//串口1接收到数据
	{					   
		len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
		for(t=0;t<len;t++)
		{
//			USART2->DR=USART_RX_BUF[t];
			
//			while((USART2->SR&0X40)==0);//等待发送结束
			
			if(USART_RX_BUF[t]==0x0c){	//遇到0c表示数字发完,开始发KP/KI/KD
				sta=1;
				continue;
			}
			
			if(USART_RX_BUF[t]=='-'){	//记录负数
				fushu=1;
				continue;
			}
			
			if(sta==0){
				val=val*10+(USART_RX_BUF[t]-'0');	//读取每一位数字字符转化为数字
			}else{
				x[a++]=USART_RX_BUF[t];		//读取调节的是KP/KI/KD
			}
			
		}

		if(fushu){		//负数变号
			val=-val;
		}
		
		val=val/100;	//改为小数
		
		USART_RX_STA=0;
		USART_RX_STA2=0;
	}
	if(x[1]=='P'){		//KP/KI/KD赋值
		*KP=val;
	}else if(x[1]=='I'){
		*KI=val;
	}else if(x[1]=='D'){
		*KD=val;
	}else{
		return 0;
	}
	return 1;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/490492.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】学习率调整策略详解和示例

学习率调整得当将有助于算法快速收敛和获取全局最优&#xff0c;以获得更好的性能。本文对学习率调度器进行示例介绍。 学习率调整的意义基础示例无学习率调整方法学习率调整方法一多因子调度器余弦调度器 结论 学习率调整的意义 首先&#xff0c;学习率的大小很重要。如果它…

音乐制作利器 :FL Studio21中文编曲音乐制作软件免费下载

一、引言 在音乐的世界里&#xff0c;每个人都有自己独特的音色和表达方式。而今天&#xff0c;我们要为你推荐一款能让您的音乐创作更上一层楼的神器——FL Studio21中文编曲音乐制作软件。这款功能强大的音乐制作软件&#xff0c;不仅拥有丰富的音色库和高效的编辑功能&#…

Quartz

Quartz 1.核心概念1.1 核心概念图1.2 demo 2.Job2.1为什么设计成JobDetailJob, 而不直接使用Job2.2 间隔执行时, 每次都会创建新的Job实例2.3 定时任务默认都是并发执行的&#xff0c;不会等待上一次任务执行完毕2.3.1 不允许并发执行 2.4 在运行时, 通过JobDataMap向Job传递数…

Python自动化测试环境搭建

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号&#xff1a;互联网杂货铺&#xff0c;回复1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 请事先自行安装好​​Pycharm​​​软件哦&#xff0c;我…

深度学习模型部署(十二)CUDA编程-绪

CUDA 运行时 API 与 CUDA 驱动 API 速度没有差别&#xff0c;实际中使用运行时 API 较多&#xff0c;运行时 API 是在驱动 API 上的一层封装。​ CUDA 是什么&#xff1f;​ CUDA(Compute Unified Device Architecture) 是 nvidia 推出的一个通用并行技术架构&#xff0c;用它…

基于冠豪猪优化器(CPO)的无人机路径规划

该优化算法是2024年新发表的一篇SCI一区top论文具有良好的实际应用和改进意义。一键运行main函数代码自动保存高质量图片 1、冠豪猪优化器 摘要&#xff1a;受冠豪猪(crest Porcupine, CP)的各种防御行为启发&#xff0c;提出了一种新的基于自然启发的元启发式算法——冠豪猪…

视觉轮速滤波融合1讲:理论推导

视觉轮速滤波融合理论推导 文章目录 视觉轮速滤波融合理论推导1 坐标系2 轮速计2.1 运动学模型2.2 外参 3 状态和协方差矩阵3.1 状态3.2 协方差矩阵 4 Wheel Propagation4.1 连续运动学4.2 离散积分4.2.1 状态均值递推4.2.2 协方差递推 5 Visual update5.1 视觉残差与雅可比5.2…

蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接&#xff1a; 0买瓜 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com) &#xff08;蓝桥官网的数据要求会高一些&#xff09; 说明&#xff1a; 这道题可以分析出&#xff1a;对一个瓜有三种选择&#xff1a; 不拿&#xff0c…

Vue3基础笔记(2)事件

一.事件处理 1.内联事件处理器 <button v-on:click"count">count1</button> 直接将事件以表达式的方式书写~ 每次单击可以完成自增1的操作~ 2.方法事件处理器 <button click"addcount(啦啦啦~)">count2</button> 如上&…

每日必学Linux命令:mv命令

mv命令是move的缩写&#xff0c;可以用来移动文件或者将文件改名&#xff08;move (rename) files&#xff09;&#xff0c;是Linux系统下常用的命令&#xff0c;经常用来备份文件或者目录。 一&#xff0e;命令格式&#xff1a; mv [选项] 源文件或目录 目标文件或目录二&am…

Open WebUI大模型对话平台-适配Ollama

什么是Open WebUI Open WebUI是一种可扩展、功能丰富、用户友好的大模型对话平台&#xff0c;旨在完全离线运行。它支持各种LLM运行程序&#xff0c;包括与Ollama和Openai兼容的API。 功能 直观的界面:我们的聊天界面灵感来自ChatGPT&#xff0c;确保了用户友好的体验。响应…

轻松掌握C语言中的sqrt函数,快速计算平方根的魔法秘诀

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

第1章 实时3D渲染流水线

前言 本书所剖析的Unity 3D内置着色器代码版本是2017.2.0f3&#xff0c;读者可以从Unity 3D官网下载这些着色器代码。这些代码以名为builtin_shaders-2017.2.0f3.zip的压缩包的形式提供&#xff0c;解压缩后&#xff0c;内有4个目录和1个license.txt文件。 目录CGIncludes存放了…

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)

目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …

Docker搭建LNMP环境实战(05):CentOS环境安装Docker-CE

前面几篇文章讲了那么多似乎和Docker无关的实战操作&#xff0c;本篇总算开始说到Docker了。 1、关于Docker 1.1、什么是Docker Docker概念就是大概了解一下就可以&#xff0c;还是引用一下百度百科吧&#xff1a; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以…

SE注意力模块学习笔记《Squeeze-and-Excitation Networks》

Squeeze-and-Excitation Networks 摘要引言什么是全局平均池化&#xff1f; 相关工作Deep architectures Squeeze-and-Excitation Blocks3.1. Squeeze: Global Information Embedding3.2. Excitation: Adaptive Recalibration3.3. Exemplars: SE-Inception and SE-ResNet 5. Im…

百科词条编辑必备指南,让你轻松上手创建

1.注册账号&#xff1a;首先&#xff0c;你需要注册一个百科平台的账号。例如&#xff0c;对于百度百科&#xff0c;你需要有一个百度账号。 搜索词条&#xff1a;在百科全书平台上搜索您想要编辑的词条。如果词条已经存在&#xff0c;可以直接编辑&#xff1b;如果词条不存在&…

(已解决)vue3使用富文本出现样式乱码

我在copy代码到项目里面时候发现我的富文本乱码了 找了一圈不知道是哪里vue3不适配还是怎么&#xff0c;后来发现main.js还需要引入 import VueQuillEditor from vue-quill-editor // require styles 引入样式 import quill/dist/quill.core.css import quill/dist/quill.snow…

计算机组成原理(超详解!!) 第三节 运算器(浮点加减乘)

1.浮点加法、减法运算 操作过程 1.操作数检查 如果能够判断有一个操作数为0&#xff0c;则没必要再进行后续一系列操作&#xff0c;以节省运算时间。 2.完成浮点加减运算的操作 (1) 比较阶码大小并完成对阶 使二数阶码相同&#xff08;即小数点位置对齐&#xff09;…

力扣Lc21--- 389. 找不同(java版)-2024年3月26日

1.题目描述 2.知识点 &#xff08;1&#xff09;在这段代码中&#xff1a; // 统计字符串s中每个字符的出现次数for (int i 0; i < s.length(); i) {count[s.charAt(i) - a];}对于字符串s “abcd”&#xff1a; 当 i 0&#xff0c;s.charAt(i) ‘a’&#xff0c;ASCII…
最新文章