基于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;
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-27 01:54:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-27 01:54:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-27 01:54:01       82 阅读
  4. Python语言-面向对象

    2024-03-27 01:54:01       91 阅读

热门阅读

  1. 跟我学C++中级篇——STL的中的删除

    2024-03-27 01:54:01       46 阅读
  2. Web使用基础

    2024-03-27 01:54:01       43 阅读
  3. 【Vue】实现的底层原理

    2024-03-27 01:54:01       42 阅读
  4. Qt 事件

    Qt 事件

    2024-03-27 01:54:01      35 阅读
  5. 代码随想录刷题随记6-哈希表2,双指针

    2024-03-27 01:54:01       48 阅读
  6. Vue 与 React 的区别

    2024-03-27 01:54:01       43 阅读
  7. 搭建Kafka集群

    2024-03-27 01:54:01       44 阅读
  8. 简单讲讲spring事务的传播机制

    2024-03-27 01:54:01       41 阅读
  9. 一个好用的文档部署工具-VitePress

    2024-03-27 01:54:01       39 阅读
  10. ChatGPT 3.5和ChatGPT 4.0之间有哪些区别?

    2024-03-27 01:54:01       161 阅读
  11. C++类的定义

    2024-03-27 01:54:01       36 阅读