玩网页游戏的网站,北京网站优化软件,广西住房和城乡建设厅网,网站简繁体转换代码电赛在即#xff0c;每次比赛调PID都是一件比较繁琐的事。每次都要在程序中改完再烧录到板子上#xff0c;特别耗时。正好最近发现实验室的一块串口屏比较好玩。 于是就做了这个调PID的东西。它可以通过串口直接修改PID的值#xff0c;从而达到快速调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 val0;u8 x[3];u8 a0;u8 sta0;u8 fushu0;u8 t;u8 len;if(USART_RX_STA0x8000)//串口1接收到数据{ lenUSART_RX_STA0x3fff;//得到此次接收到的数据长度for(t0;tlen;t){
// USART2-DRUSART_RX_BUF[t];// while((USART2-SR0X40)0);//等待发送结束if(USART_RX_BUF[t]0x0c){ //遇到0c表示数字发完开始发KP/KI/KDsta1;continue;}if(USART_RX_BUF[t]-){ //记录负数fushu1;continue;}if(sta0){valval*10(USART_RX_BUF[t]-0); //读取每一位数字字符转化为数字}else{x[a]USART_RX_BUF[t]; //读取调节的是KP/KI/KD}}if(fushu){ //负数变号val-val;}valval/100; //改为小数USART_RX_STA0;USART_RX_STA20;}if(x[1]P){ //KP/KI/KD赋值*KPval;}else if(x[1]I){*KIval;}else if(x[1]D){*KDval;}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 KP0,KI0,KD0;delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2uart1_init(115200); //串口初始化为9600uart2_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 val0;u8 x[3];u8 a0;u8 sta0;u8 fushu0;u8 t;u8 len;if(USART_RX_STA0x8000)//串口1接收到数据{ lenUSART_RX_STA0x3fff;//得到此次接收到的数据长度for(t0;tlen;t){
// USART2-DRUSART_RX_BUF[t];// while((USART2-SR0X40)0);//等待发送结束if(USART_RX_BUF[t]0x0c){ //遇到0c表示数字发完开始发KP/KI/KDsta1;continue;}if(USART_RX_BUF[t]-){ //记录负数fushu1;continue;}if(sta0){valval*10(USART_RX_BUF[t]-0); //读取每一位数字字符转化为数字}else{x[a]USART_RX_BUF[t]; //读取调节的是KP/KI/KD}}if(fushu){ //负数变号val-val;}valval/100; //改为小数USART_RX_STA0;USART_RX_STA20;}if(x[1]P){ //KP/KI/KD赋值*KPval;}else if(x[1]I){*KIval;}else if(x[1]D){*KDval;}else{return 0;}return 1;
}