-โค้ด PID ที่สามารถทำงานได้และควบคุมความเร็วได้สมบูรณ์ทำงานโด้วยการส่งserail ไปควบคุมPWM ได้หรือควบคุมความเร็วมอเตอร์
int pwm = 9; // PWM connected to digital pin 9
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 latter1 = 0; //set pwm out 0-50
int s
void setup() {
Serial.begin(9600);
attachInterrupt(0,Millis,RISING);
//LOW to trigger the interrupt whenever the pin is low,
//CHANGE to trigger the interrupt whenever the pin changes value
//RISING to trigger when the pin goes from low to high,
//FALLING for when the pin goes from high to low.
pinMode(pwm,OUTPUT); //PWM
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}
void loop()
{
String latter =""; //พิมพ์ส่ง serial ไม่เกิน50
if(Serial.available()>0)
{
while(Serial.available()>0)
{
latter += char(Serial.read());
}
Serial.println(latter);
latter1=latter.toInt();
}
if(latter1 <=50 ) //send to serial over 50
{
Serial.print("latter1:"); Serial.print(latter1); Serial.print("\t");
Cur_time = millis(); //set Cur_time is millis
s = Cur_time-Prev_time;
if(s >= 10)
{
j = (counter*10.0)/360.0;
k = j/(s*0.001);
rpm = k*60.0; //rpm
Serial.print("rpm:"); Serial.print(rpm); Serial.print("\t");
err = latter1*1 - rpm/100;
sum_err += err;
u = Kp*err + Ki*sum_err + Kd*(err-old_err);
old_err = err;
pwm_set = u*1.2;
analogWrite(pwm,pwm_set);
Serial.print("pwm_set:"); Serial.print(pwm_set); Serial.println("\t");
pwm_set+=0;
counter=0;
Prev_time = Cur_time;
pwm_set=0;
}
}
}
void Millis()
{
counter++;
}
-Electrical Conductivity Kit
-ตัวนี้ติดปัญหา คือ cralibrate ยังไม่ได้
แหล่งที่มา https://www.sparkfun.com/products/retired/11193
int pwm = 9; // PWM connected to digital pin 9
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 latter1 = 0; //set pwm out 0-50
int s
void setup() {
Serial.begin(9600);
attachInterrupt(0,Millis,RISING);
//LOW to trigger the interrupt whenever the pin is low,
//CHANGE to trigger the interrupt whenever the pin changes value
//RISING to trigger when the pin goes from low to high,
//FALLING for when the pin goes from high to low.
pinMode(pwm,OUTPUT); //PWM
digitalWrite(7,HIGH);
digitalWrite(8,LOW);
}
void loop()
{
String latter =""; //พิมพ์ส่ง serial ไม่เกิน50
if(Serial.available()>0)
{
while(Serial.available()>0)
{
latter += char(Serial.read());
}
Serial.println(latter);
latter1=latter.toInt();
}
if(latter1 <=50 ) //send to serial over 50
{
Serial.print("latter1:"); Serial.print(latter1); Serial.print("\t");
Cur_time = millis(); //set Cur_time is millis
s = Cur_time-Prev_time;
if(s >= 10)
{
j = (counter*10.0)/360.0;
k = j/(s*0.001);
rpm = k*60.0; //rpm
Serial.print("rpm:"); Serial.print(rpm); Serial.print("\t");
err = latter1*1 - rpm/100;
sum_err += err;
u = Kp*err + Ki*sum_err + Kd*(err-old_err);
old_err = err;
pwm_set = u*1.2;
analogWrite(pwm,pwm_set);
Serial.print("pwm_set:"); Serial.print(pwm_set); Serial.println("\t");
pwm_set+=0;
counter=0;
Prev_time = Cur_time;
pwm_set=0;
}
}
}
void Millis()
{
counter++;
}




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