极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10523|回复: 0

有四组数据,但是为什么串口绘图器只画一个数据的图

[复制链接]
发表于 2016-7-15 23:02:48 | 显示全部楼层 |阅读模式
请教各位大神,有四组数据,两个电位器和两个传感器,但是为什么使用串口绘图器只画一个数据的图?使用其他什么软件可以监视串口数据绘图啊?谢谢各位大神了


//PINs setting  
int adjust1Pin = 15;    //用来调节A的电位器  
int adjust2Pin =16;    //用来调节B的电位器  
int read1Pin = 17;      //用来连接输入A传感器  
int read2Pin = 18;      //用来连接输入B传感器  
int i1Pin = 6;        //连接电机驱动板的I1接口  
int i2Pin =9;        //连接电机驱动板的I2接口  
int i3Pin = 10;        //连接电机驱动板的I3接口  
int i4Pin = 11;        //连接电机驱动板的I4接口  
int power1Pin = 3;     //连接电机驱动板的EA接口  
int power2Pin = 5;     //连接电机驱动板的EB接口  


boolean debug = false;  
boolean writeLog = false;  
double setKd1 =3.3;  
double setKd2 =3.3;  
double setKp = 1;  
int offset = 70;  
int delayMs = 1;  
int tick = 0;
//int myLog[3500];
int *myLog = new int[3500];

//PID structure  
typedef struct {  
  double target;  
  double aver;  
  double Kp;  
  double Kd;  
  int preError;  
  int power;  
  boolean flag;  
  double v;  
} PID;  

PID Pid1, Pid2;  

void setup()  
{  
  pinMode(i1Pin, OUTPUT);     //I1和I2都是数字信号  
  pinMode(i2Pin, OUTPUT);     //通过设置I1和I2来控制电流方向  
  pinMode(i3Pin, OUTPUT);     //I1和I2都是数字信号  
  pinMode(i4Pin, OUTPUT);     //通过设置I1和I2来控制电流方向  
  pinMode(power1Pin, OUTPUT);  //按占空比方式输出的模拟信号  
  pinMode(power2Pin, OUTPUT);  //按占空比方式输出的模拟信号  


  //analogWrite(rotatePin, 128);  

  Serial.begin(9600);          //设置波特率  
  TCCR0B = 0x01;   // Timer 0: PWM 5 &  6 @ 16 kHz  
  TCCR1B = 0x01;   // Timer 1: PWM 9 & 10 @ 32 kHz  
  TCCR2B = 0x01;   // Timer 2: PWM 3 & 11 @ 32 kHz  
  Pid1.Kp = setKp;  
  Pid1.preError = 0;  
  Pid1.Kd = setKd1;  
  Pid1.power = 0;  
  Pid1.flag = true;  
  Pid1.target = 300;  
  Pid1.aver = 0;  
  Pid1.v = 0;  
  Pid2.Kp = setKp;  
  Pid2.preError = 0;  
  Pid2.Kd = setKd2;  
  Pid2.power = 0;  
  Pid2.flag = true;  
  Pid2.target = 300;  
  Pid2.aver = 0;  
  Pid2.v = 0;  
  tick = 0;  
}  

int tick2 = 0;  
//boolean rotateFlag = true;  
void loop()  
{  
  //digitalWrite(rotatePin, rotateFlag);  
  //rotateFlag = ! rotateFlag;  
  //delay(16000);  
  //return;  

  if(false) tick = 0;  
  tick++;  
  if(tick==500)  
  {  
    tick2++;  
    if(tick2<50) {tick = 0;return;}  
    tick2 = 0;  
    if(writeLog)  
    {  
      for(int i=0;i<500;i++)  
      {  
        Serial.print(myLog[i*7 + 0]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 1]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 2]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 3]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 4]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 5]);  
        Serial.print("  ");  
        Serial.print(myLog[i*7 + 6]);  
        Serial.println("  ");  
      }  
      Serial.println(Pid1.target);  
      Serial.println(Pid1.preError);  
      Serial.println(Pid2.target);  
      Serial.println(Pid2.preError);  
    }  
    return;  
  }  
  else if(tick>500)  
  {  
    tick = 0;  
    //delay(990000);  
    return;  
  };  

  //=======第一组电位器和传感器========  
  int readValue1 = 0;  
  for(int i = 0; i < 4; i++) readValue1 += analogRead(read1Pin);  
  readValue1 >>= 2;  
  //readValue1 += (Pid1.flag ? 1 : -1) * Pid1.power / 17;  
  int adjustValue1 = analogRead(adjust1Pin); //410 analogRead(adjust1Pin);  
  Pid1.aver = Pid1.aver * 0.9995 + readValue1 * 0.0005;  
  Pid1.target = Pid1.target + (Pid1.target - Pid1.aver) / 100.0;  
  Pid1.target = max(0, max(adjustValue1 - offset, Pid1.target));  
  Pid1.target = min(755, min(adjustValue1 + offset, Pid1.target));  

  //=======第二组电位器和传感器=======  
  int readValue2 = 0;  
  for(int i = 0; i < 4; i++) readValue2 += analogRead(read2Pin);  
  readValue2 >>= 2;  
  //readValue2 += (Pid2.flag ? 1 : -1) * Pid2.power / 6;  
  int adjustValue2 = analogRead(adjust2Pin); //240 analogRead(adjust2Pin);  
  Pid2.aver = Pid2.aver * 0.9995 + readValue2 * 0.0005;  
  Pid2.target = Pid2.target + (Pid2.target - Pid2.aver) / 1000.0;  
  Pid2.target = max(0, max(adjustValue2 - offset, Pid2.target));  
  Pid2.target = min(755, min(adjustValue2 + offset, Pid2.target));  

  if(true)  
  {  
   Serial.println(adjustValue1);  
   Serial.println(adjustValue2);  
   Serial.println(readValue1);  
   Serial.println(readValue2);  
    Pid1.flag = adjustValue1 > 512;  
    Pid1.power = abs(adjustValue1 - 512) / 2;  
    if(Pid1.power > 255) Pid1.power = 255;  
    digitalWrite(i1Pin, Pid1.flag);  
    digitalWrite(i2Pin, !Pid1.flag);  
    analogWrite(power1Pin, Pid1.power);  
    Pid2.flag = adjustValue2 > 512;  
    Pid2.power = abs(adjustValue2 - 512) / 2;  
    if(Pid2.power > 255) Pid2.power = 255;  
   digitalWrite(i3Pin, Pid2.flag);  
    digitalWrite(i4Pin, !Pid2.flag);  
    analogWrite(power2Pin, Pid2.power);  
    delay(32000);  
    return;  
  }  

  //Calculate power values  
  double v, error;  
  error = readValue1 - Pid1.target;  
  v = error - Pid1.preError;  
  Pid1.v = (Pid1.v * 6 + v) / 7;  
  Pid1.power = (int)error * Pid1.Kp + Pid1.v * Pid1.Kd;  
  Pid1.flag = Pid1.power > 0;  
  Pid1.power = abs(Pid1.power);  
  if(Pid1.power>255) Pid1.power = 255;  
  Pid1.preError = error;  

  error = readValue2 - Pid2.target;  
  v = error - Pid2.preError;  
  Pid2.v = (Pid2.v * 6 + v) / 7;  
  Pid2.power = (int)error * Pid2.Kp + Pid2.v * Pid2.Kd;  
  Pid2.flag = Pid2.power < 0;  
  Pid2.power = abs(Pid2.power);  
  if(Pid2.power>255) Pid2.power = 255;  
  Pid2.preError = error;  

  //Write PMW to control the floa  
  digitalWrite(i1Pin, Pid1.flag);  
  digitalWrite(i2Pin, !Pid1.flag);  
  analogWrite(power1Pin, Pid1.power);  

  digitalWrite(i3Pin, Pid2.flag);  
  digitalWrite(i4Pin, !Pid2.flag);  
  analogWrite(power2Pin, Pid2.power);  

  myLog[tick * 7 + 0] = tick;  
  myLog[tick * 7 + 1] = (int)Pid1.target;  
  myLog[tick * 7 + 2] = readValue1;  
  myLog[tick * 7 + 3] = Pid1.power;  
  myLog[tick * 7 + 4] = (int)Pid2.target;  
  myLog[tick * 7 + 5] = readValue2;  
  myLog[tick * 7 + 6] = Pid2.power;  

  /*
  for(int i=0;i<8;i++)
  {
    digitalWrite(rotatePins[i] , 0);
    digitalWrite(rotatePins[(i + 1) % 8] ,1);
    delay(1);
  }
  digitalWrite(rotatePins[0] , 0);
  */  

  delay(delayMs);  
}  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-20 10:02 , Processed in 0.051256 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表