Minibalance For Arduino上位机调试(调PID神器)

20 篇文章 2 订阅

最近再搞PID,发现一款不错的软件
Minibalance

链接:https://pan.baidu.com/s/1I9bME3g851ylhY6bTixE0w
提取码:1234
首先将库文件拷贝到您的Arduino安装目录下的Libraries文件夹下。

然后打开arduino软件,进行编译上上传,然后用管理员运行上位机Minibalance,然后点击下面的打开串口,设置好波特率,就可以看到数据变换的波形了:
在这里插入图片描述
官方调试代码:

/****************************************************************************
   作者:平衡小车之家
   产品名称:Minibalance For Arduino
****************************************************************************/
#include <DATASCOPE.h>      //这是PC端上位机的库文件
DATASCOPE data;
unsigned char Send_Count;  //上位机相关变量
float a;
int show1,show2,show3,show4;
/**************************************************************************
函数功能:虚拟示波器往上位机发送数据 作者:平衡小车之家
入口参数:无
返回  值:无
**************************************************************************/
void DataScope(void)
{
  int i;
  data.DataScope_Get_Channel_Data(show1, 1);  //显示第一个数据,角度
  data.DataScope_Get_Channel_Data(show2, 2);//显示第二个数据,左轮速度  也就是每40ms输出的脉冲计数
  data.DataScope_Get_Channel_Data(show3, 3);//显示第三个数据,右轮速度 也就是每40ms输出的脉冲计数
  data.DataScope_Get_Channel_Data(show4, 4);//显示第四个数据,电池电压,单位V
  Send_Count = data.DataScope_Data_Generate(4); 
  for ( i = 0 ; i < Send_Count; i++)
  {
    Serial.write(DataScope_OutPut_Buffer[i]);  
  }
  delay(50);  //上位机必须严格控制发送时序
}
/**************************************************************************
函数功能:初始化 相当于STM32里面的Main函数 作者:平衡小车之家
入口参数:无
返回  值:无
**************************************************************************/
void setup() {

  Serial.begin(128000);       //开启串口,设置波特率为 128000
}
/**************************************************************************
函数功能:主循环程序体
入口参数:无
返回  值:无
**************************************************************************/
void loop() {
      a+=0.1;
    if(a>3.14)  a=-3.14; 
   
    show1=100*sin(a);
//    show2=500* tan(a);
    show3=100*cos(a);
    show4=100*a;
     Serial.begin(128000), DataScope(); //使用上位机时,波特率是128000
     delay(50);
}

官方标志库函数解析:


#ifndef _DATASCOPE_H__      
#define _DATASCOPE_H__

//导入Arduino核心头文件
#include"Arduino.h"  
extern unsigned char DataScope_OutPut_Buffer[42];	   //输出的数据是42字节的


class DATASCOPE                                         //data.的类
{
public:
DATASCOPE();                                            //
void  Float2Byte(float *target,unsigned char *buf,unsigned char beg);       //两个浮点数数据,可以理解为数据处理
void DataScope_Get_Channel_Data(float Data,unsigned char Channel);          //数据获取通道 入口参数分别是 数据存哪 存通道几
unsigned char DataScope_Data_Generate(unsigned char Channel_Number);        //数据生成发送
};

#endif

DATASCOPE:

DATASCOPE();
没搞懂,里面啥都没写

Float2Byte:

 void  Float2Byte(float *target,unsigned char *buf,unsigned char beg);       //数据处理
{
    unsigned char *point;
    point = (unsigned char*)target;	  //得到float的地址
    buf[beg]   = point[0];
    buf[beg+1] = point[1];
    buf[beg+2] = point[2];
    buf[beg+3] = point[3];
}
/*
会在DataScope_Get_Channel_Data中调用,主要是负责处理数据的
将数据存进一个地址里面
*/

DataScope_Get_Channel_Data:

void DATASCOPE::DataScope_Get_Channel_Data(float Data,unsigned char Channel)
{
if ( (Channel > 10) || (Channel == 0) ) return;  //通道个数大于10或等于0,直接跳出,不执行函数
  else
  {
     switch (Channel)
		{
      case 1:  Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;
      case 2:  Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;
		  case 3:  Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;
		  case 4:  Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;
		  case 5:  Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;
		  case 6:  Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;
		  case 7:  Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;
		  case 8:  Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;
		  case 9:  Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;
		  case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;
		}
  }	   
}

/*
选择通道几,最多有10个通道
数据入口参数data,在例程中是int show1,show2,show3,show4;可以自己加

*/

void DATASCOPE::DataScope_Get_Channel_Data(float Data,unsigned char Channel)
{
if ( (Channel > 10) || (Channel == 0) ) return;  //通道个数大于10或等于0,直接跳出,不执行函数
  else
  {
     switch (Channel)
		{
      case 1:  Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;
      case 2:  Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;
		  case 3:  Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;
		  case 4:  Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;
		  case 5:  Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;
		  case 6:  Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;
		  case 7:  Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;
		  case 8:  Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;
		  case 9:  Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;
		  case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;
		}
  }	   
}


unsigned char DATASCOPE::DataScope_Data_Generate(unsigned char Channel_Number)
{
	if ( (Channel_Number > 10) || (Channel_Number == 0) ) { return 0; }  //通道个数大于10或等于0,直接跳出,不执行函数
  else
  {	
	 DataScope_OutPut_Buffer[0] = '$';  //帧头
		
	 switch(Channel_Number)   
   { 
		 case 1:   DataScope_OutPut_Buffer[5]  =  5; return  6;  
		 case 2:   DataScope_OutPut_Buffer[9]  =  9; return 10;
		 case 3:   DataScope_OutPut_Buffer[13] = 13; return 14; 
		 case 4:   DataScope_OutPut_Buffer[17] = 17; return 18;
		 case 5:   DataScope_OutPut_Buffer[21] = 21; return 22;  
		 case 6:   DataScope_OutPut_Buffer[25] = 25; return 26;
		 case 7:   DataScope_OutPut_Buffer[29] = 29; return 30; 
		 case 8:   DataScope_OutPut_Buffer[33] = 33; return 34; 
		 case 9:   DataScope_OutPut_Buffer[37] = 37; return 38;
     case 10:  DataScope_OutPut_Buffer[41] = 41; return 42; 
   }	 
  }
	return 0;
}
/*没看懂。。。*/
/*应该是四字节为1位,调用选择去发送数据,然后在主程序调用void DataScope(void)就可以了*/

cpp.c


#include"DATASCOPE.h"
#include"Arduino.h"
  unsigned char DataScope_OutPut_Buffer[42] = {0};	   //串口发送缓冲区

DATASCOPE::DATASCOPE()
{
}

void DATASCOPE::Float2Byte(float *target,unsigned char *buf,unsigned char beg)
{
    unsigned char *point;
    point = (unsigned char*)target;	  //得到float的地址
    buf[beg]   = point[0];
    buf[beg+1] = point[1];
    buf[beg+2] = point[2];
    buf[beg+3] = point[3];
}
void DATASCOPE::DataScope_Get_Channel_Data(float Data,unsigned char Channel)
{
if ( (Channel > 10) || (Channel == 0) ) return;  //通道个数大于10或等于0,直接跳出,不执行函数
  else
  {
     switch (Channel)
		{
      case 1:  Float2Byte(&Data,DataScope_OutPut_Buffer,1); break;
      case 2:  Float2Byte(&Data,DataScope_OutPut_Buffer,5); break;
		  case 3:  Float2Byte(&Data,DataScope_OutPut_Buffer,9); break;
		  case 4:  Float2Byte(&Data,DataScope_OutPut_Buffer,13); break;
		  case 5:  Float2Byte(&Data,DataScope_OutPut_Buffer,17); break;
		  case 6:  Float2Byte(&Data,DataScope_OutPut_Buffer,21); break;
		  case 7:  Float2Byte(&Data,DataScope_OutPut_Buffer,25); break;
		  case 8:  Float2Byte(&Data,DataScope_OutPut_Buffer,29); break;
		  case 9:  Float2Byte(&Data,DataScope_OutPut_Buffer,33); break;
		  case 10: Float2Byte(&Data,DataScope_OutPut_Buffer,37); break;
		}
  }	   
}


unsigned char DATASCOPE::DataScope_Data_Generate(unsigned char Channel_Number)
{
	if ( (Channel_Number > 10) || (Channel_Number == 0) ) { return 0; }  //通道个数大于10或等于0,直接跳出,不执行函数
  else
  {	
	 DataScope_OutPut_Buffer[0] = '$';  //帧头
		
	 switch(Channel_Number)   
   { 
		 case 1:   DataScope_OutPut_Buffer[5]  =  5; return  6;  
		 case 2:   DataScope_OutPut_Buffer[9]  =  9; return 10;
		 case 3:   DataScope_OutPut_Buffer[13] = 13; return 14; 
		 case 4:   DataScope_OutPut_Buffer[17] = 17; return 18;
		 case 5:   DataScope_OutPut_Buffer[21] = 21; return 22;  
		 case 6:   DataScope_OutPut_Buffer[25] = 25; return 26;
		 case 7:   DataScope_OutPut_Buffer[29] = 29; return 30; 
		 case 8:   DataScope_OutPut_Buffer[33] = 33; return 34; 
		 case 9:   DataScope_OutPut_Buffer[37] = 37; return 38;
     case 10:  DataScope_OutPut_Buffer[41] = 41; return 42; 
   }	 
  }
	return 0;
}


  • 2
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 我可以回答这个问题。匿名上位机波形显示 PID 是一种常见的控制算法,用于控制系统中的稳定性和精度。PID 控制器可以根据系统的反馈信号来整控制输出,以达到期望的控制效果。在匿名上位机中,可以通过波形显示来观察 PID 控制器的输出和系统的反馈信号,以便进行调试和优化。 ### 回答2: 匿名上位机波形显示PID(比例-积分-微分)控制器是一种常用于工业自动化系统中的控制算法。它是通过分析被控对象的反馈信号来实现精确控制的一种方法。 匿名上位机是一种通信工具,可以通过串口或者网络接口与被控对象进行通信,并对其进行监控和控制。波形显示是匿名上位机的一项功能,它可以实时绘制被控对象的输入输出信号的波形图,并通过图像直观地展示出这些信号的特征。 PID控制器是一种经典的控制算法,其通过不断节被控对象的输出信号,使其与期望的输入信号保持一致。PID控制器包括三个参数:比例、积分和微分。比例参数的整会影响响应速度和稳定性,积分参数的整会影响系统的稳态误差,微分参数的整会影响系统的抗干扰能力。 匿名上位机波形显示PID可以帮助工程师实时监测被控对象的输入输出信号,以及PID控制器的节效果。通过观察波形图,可以直观地了解系统的动态特性,判断是否存在超、振荡等问题,并及时PID参数以实现更好的控制效果。 在匿名上位机中,通过设置参数,选择要显示的信号,并将其连续采样并绘制成波形图。这些波形图可以用来评估系统的性能,并且可以与期望的输入信号进行比较,以评估控制器的准确性和稳定性。 总之,匿名上位机波形显示PID是一种非常实用的工具,它可以帮助工程师更好地理解和优化控制系统,提高系统的稳定性和性能。 ### 回答3: 匿名上位机波形显示PID,其实是一种通过匿名上位机软件实现的PID控制系统的可视化展示方式。传统的PID控制系统在运行过程中,往往仅能通过数字或者文本方式显示控制结果和参数整情况,缺乏直观的图形化展示。而通过匿名上位机波形显示PID,可以将控制结果以波形的形式实时展示出来,便于用户直观了解系统的运行情况和控制效果。 匿名上位机软件是一种常用的开源软件,它可以通过串口或者网络连接与控制系统进行通信,实时接收和发送数据。在PID控制系统中,通过匿名上位机软件,可以将系统的输出信号、目标信号、误差信号等数据采集并送给上位机进行处理。上位机根据接收到的数据,可以绘制出相关的波形图,如输出信号、目标信号和误差信号随时间变化的波形图等。 通过匿名上位机波形显示PID,用户可以直观地观察到控制系统的工作状态,判断系统是否正常运行。同时,用户还可以通过对波形的观察,判断控制参数的整效果,并进行相应的优化和改进。通过波形图的展示,可以更加直观地观察和分析PID控制的稳定性、精确度和响应速度等性能指标,从而提高系统的控制质量和性能。 总之,匿名上位机波形显示PID为用户提供了一种直观、可视化的PID控制系统展示方式,方便用户实时观察和分析系统的运行状态和控制效果,提高控制系统的性能和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创客阿蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值