วันอาทิตย์ที่ 26 กรกฎาคม พ.ศ. 2558

วันที่49 ที่Fibo

-วันนี้ก็เริ่มการทำงานคือทำเครื่องเขย่าสาร ทดลองแล้ว พอใช้งานแล้ว เซ็นเชอร์ไม่ทำงาน เป็นเพราบัดกรีสายผิดทำให้เซ็นเชอร์ตัวหนึ่งต้องเสียไปแต่พอทำให้ก็สามารถใช้งานได้เป็นอย่างดี
    -พอเซ้นเชอร์ทำงานได้มีปัญหาอีกคือการควบคุม PID ไม่ทำงานพอส่งให้มอเตอร์ทำงานได้แล้วเมื่อรับโหลดลงไปแล้วPIDไม่ทำงาน
-ทำการแก้ไขคือ ทำการแก้ไขจากการแก้สมการ RPM motor ก่อนแล้วมาหาจุดแก้ไขที่PID พอทำการแก้ไข RPM motorได้ อ่านค่าRPM ได้แล้วติดปัญหาที่ PID พอมีโหลดแล้วไม่ทำงานหรือหมุนช้าลงกว่าเดิมที่เคยทำได้
-เหตุเกิดอาจเกิดจากโค้ดการทำงานคือ มันไม่เข้าไปทำงานในลูปPID นี้คือข้อสันนิฐาน และที่น่าจะคิดอีกอย่างคือ สมการ PID เกิดข้อผิดพลาดเหมือนๆ RPM
-ต้องวัดและแก้ไขวงจรใหม่ พอมาแก้ไขโค้ดตอนแรกนึกว่าจะไม่ได้แก้ไขอพไรนานเท่าไหร่จะได้ควบคุมให้ที่เขย่ากลับมาอยู่เดิมได้เหมือนเดิม พอทำไปทำมาติดปัญหาไปเลือย

-โค้ดที่ใช้ในการทดลอง

//___Pin assigned___//
const int pin_Pwm = 9;
String inputstring = ""; //a string to hold incoming data from the PC
int inputstringLength = 0;
//motor interpreter
float time1 = 0.0;
float time2 = 0.0;
float s = 0.0;
float counter = 0.0;
float j = 0.0;
float k = 0.0;
float rpm = 0.0;
float rpm_set = 0.0;
float err = 0;
float sum_err = 0;
float old_err = 0;
float Kp = 1; //ค่าคงที่ kp
float Ki = 0.5; //ค่าคงที่ki
float Kd = 1; //ค่าคงที่kd
float u = 0;
float pwm_set = 0;
unsigned long Cur_time = 0;
unsigned long Prev_time = 0;
int inputmotor;
bool ismotorON = 0;
bool inPC = 0;
//inputstring
boolean input_stringcomplete = false; //have we received all the data from the PC
String sensorstringPH = ""; //a string to hold the data from the Atlas Scientific product
boolean sensor_stringcompletePH = false; //have we received all the data from the Atlas Scientific product
String PHout = "";
String sensorstringEC = ""; //a string to hold the data from the Atlas Scientific product
boolean sensor_stringcompleteEC = false; //have we received all the data from the Atlas Scientific product
String ECout = "";
void setup()
{
Serial.begin(38400); //Serial with PC to 38400
Serial2.begin(38400); //Serial with pH meter to 38400
Serial3.begin(38400); //Serial with EC meter to 38400
attachInterrupt(0, Millis, RISING);
pinMode(pin_Pwm, OUTPUT);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
Serial.println("Initialize DONE!!!");
}
void Millis()
{
counter++;
}
void loop()
{
//___Receive Command___//
if (Serial.available() > 0)
{
while (Serial.available() > 0)
{
inputstring += char(Serial.read());
inputstringLength += 1;
delay(1);
}
inPC = 1;
}
//read PH
if (Serial3.available() > 0)
{
while (Serial3.available() > 0)
{
PHout += char(Serial3.read());
delay(1);
}
Serial.print("PH:");
Serial.print(PHout);
}
//read EC
if (Serial2.available() > 0)
{
while (Serial2.available() > 0)
{
ECout += char(Serial2.read());
delay(1);
}
Serial.print("\t");
Serial.print("EC:");
Serial.print(ECout);
Serial.print("\t");
Serial.print("inputmotor");
Serial.print(inputmotor);
Serial.print("\t");
Serial.print("rpm");
Serial.println(rpm);
}
PHout = "";
ECout = "";
//___Command Checker___//
if (inPC)
{
Command_Checker();
inPC = 0;
} else {}
if(ismotorON)
{
if (inputmotor <= 200 ) //send to serial over 50
{
Cur_time = millis(); //set Cur_time is millis
s = Cur_time - Prev_time;
if (s >= 50)
{
j = (counter * 20.0) / 360.0;
k = j / (s * 0.001);
rpm = k * 60.0; //rpm
err = inputmotor - rpm / 100;
sum_err += err;
u = Kp * err + Ki * sum_err + Kd * (err - old_err);
old_err = err;
pwm_set = u * 1.2;
analogWrite(pin_Pwm, pwm_set);
pwm_set += 0;
counter = 0;
Prev_time = Cur_time;
pwm_set = 0;
}
}
} else {}
}
void Command_Checker()
{
if (inputstringLength == 6)
{
if ((inputstring[4] == 'Y') && (inputstring[5] == 'U'))
{
if (inputstring[0] == 'M')
{
Serial.print("Motor Command : ");
Serial.println(inputstring);
String temp = "";
temp.reserve(30);
for (int i = 1; i < (inputstringLength - 2); i++)
{
temp += inputstring[i];
}
Serial.println(temp);
inputmotor = temp.toInt();
if(inputmotor == 0)
{
ismotorON = 0;
}
else
{
ismotorON = 1;
}
inputstring = "";
inputstringLength = 0;
}
else if (inputstring[0] == 'P')
{
Serial.print("PH Command : ");
Serial.println(inputstring);
String temp = "";
temp.reserve(30);
for (int i = 1; i < (inputstringLength - 2); i++)
{
temp += inputstring[i];
}
Serial.println(temp);
if (temp == "C04")
{
Serial.println("calibratePH4");
Serial3.print("cal,low,4\r");
}
else if (temp == "C07")
{
Serial.println("calibratePH7");
Serial3.print("cal,mid,7\r");
}
else if (temp == "C10")
{
Serial.println("calibratePH10");
Serial3.print("cal,high,10\r");
}
else if (temp == "L00")
{
Serial.println("Turn off pH LED");
Serial3.print("L,0\r");
}
else if (temp == "L11")
{
Serial.println("Turn on pH LED");
Serial3.print("L,1\r");
}
else if (temp == "X00")
{
Serial.println("Reset PH");
Serial3.print("x\r");
}
inputstring = "";
inputstringLength = 0;
}
else if (inputstring[0] == 'E')
{
Serial.print("EC Command : ");
Serial.println(inputstring);
String temp = "";
temp.reserve(30);
for (int i = 1; i < (inputstringLength - 2); i++)
{
temp += inputstring[i];
}
Serial.println(temp);
if (temp == "12K")
{
Serial.println("calibrateEC12K");
Serial2.print("Cal,low,12880\r");
}
else if (temp == "80K")
{
Serial.println("calibrateEC80K");
Serial2.print("Cal,low,80000\r");
}
else if (temp == "CLE")
{
Serial.println("Clear EC");
Serial2.print("Cal,clear\r");
}
else if (temp == "L00")
{
Serial.println("Turn off pH LED");
Serial2.print("L,0\r");
}
else if (temp == "L11")
{
Serial.println("Turn on pH LED");
Serial2.print("L,1\r");
}
else if (temp == "X00")
{
Serial.println("Reset EC");
Serial2.print("x\r");
}
inputstring = "";
inputstringLength = 0;
}
else
{
Serial.print("Command (heading) ERROR!!! : ");
Serial.println(inputstring);
inputstring = "";
inputstringLength = 0;
}
}
else
{
Serial.print("Command (ending) ERROR!!! : ");
Serial.println(inputstring);
inputstring = "";
inputstringLength = 0;
}
}
else if (inputstringLength == 0)
{
// Do nothing
}
else
{
Serial.print("Command (overall) ERROR!!! : ");
Serial.println(inputstring);
Serial.println(inputstringLength);
inputstring = "";
inputstringLength = 0;
}
}

ไม่มีความคิดเห็น:

แสดงความคิดเห็น