ขอคำแนะนำเกี่ยวกับ โค้ด หน่อยครับ

Started by JAY, March 15, 2017, 08:32:02 PM

Previous topic - Next topic

JAY

ก่อนอื่นอธิบายคร่าวๆก่อนครับ คือผมมีค่า Output ที่ได้จากการคำนวณฟัซซี่ลอกจิก ซึ่งเป็นค่า + 0 - (-15 ถึง 15)
คือผมติดปัญหาที่จะเอา Output นี้ไปเป็นคำสั่งควบคุม PWM (0-255)
**กรณีสมมุติ**
เมื่อ Output คำนวณค่าได้ +15 ก็นำค่า +15 ไปเป็นค่า PWM
ต่อมา Output คำนวณค่าได้ +10 ก็นำค่า +10 ไปรวมกับค่า PWM ก่อนหน้า
คือ 15 + 10 = 25  ค่า PWM ก็จะเท่ากับ 25
ต่อมา Output ก็ส่งค่ามาเรื่อยๆ อาจจะเป็นได้ทั้งค่าบวก และค่าลบ
ก็นำค่า Output ไปบวกลบกับค่า PWM ก่อนหน้า
ประมาณนี้ ผมต้องเขียนโค้ดยังไงครับ ขอคำแนะนำหน่อยครับ
ขอบคุณครับ

avr_lover

code ของ Arduino หรือเปล่าครับ ลองเขียนโค้ดเท่าที่คุณเข้าใจแล้วเอาโค้ดมาวางที่นี่ครับ เดี๋ยวมีคนช่วยแก้ ช่วยอธิบายให้ แต่ถ้าลอยๆแบบนี้ไม่มีใครนึกออกว่าจะทำยังไงให้คุณเข้าใจรวมถึงคาดเดาไม่ได้หรอกว่าคุณเข้าใจแค่ไหนด้วยครับ

crywolf

ตามที่ท่าน avr_lover บอกครับ เอาโค๊ดมา เดี๋ยวมีคนช่วยแก้
เขียน Fuzzy ได้ PWM ก็เป็นเรื่องง่ายแล้วครับ
ถ้ามาลอยๆแบบนี้ผมจะตอบว่าใช้โค๊ดนี้ครับ

PWM += FuzzyOutput;


JAY

void loop()                        //ในส่วนของโค้ดผมขอยกมาแค่นี้ เนื่องจากในของโค้ด Fuzzy โค้ดยาวมาก แต่ค่อนข้างโอเคแล้ว
{                                                          และที่ติดปัญหาคือในส่วนของค่า Output คือตัวแปร Duty ที่จะนำค่านี้ไปเป็น
  fuzzy->setInput(1,Error);                      คำสั่งควบคุม PWM (0-255) 
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);                  //ค่า Duty เป็นค่าที่ได้หลังจากการคำนวณ Fuzzy เป็นค่าอยู่ในช่วง -15 ถึง 15

  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
                                                                 
  analogWrite(PWMPin, PWMValue);
  delay(1000);
}
***ผมทำแบบนี้แล้วค่าไม่ได้อย่างที่ต้องการครับ

พอดีผมไม่ถนัดด้านนี้ครับ แต่จำเป็นต้องทำ



crywolf

น่าจะประมาณนี้

int PWMValue;

void loop()
{
  fuzzy->setInput(1,Error);
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);
/*
  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
*/
if((PWMValue+Duty)>=0)&&((PWMValue+Duty)<=255)
{
PWMValue += Duty;
}

  analogWrite(PWMPin, PWMValue);
  delay(1000);
}

az

PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
เพราะแสวงหา..  มิใช่เพราะรอคอย
เพราะเชี่ยวชาญ..  มิใช่เพราะโอกาส
เพราะสามารถ..  มิใช่เพราะโชคช่วย
ดังนี้แล้ว "ลิขิตฟ้า  หรือจะสู้มานะตน..."

JAY

Quote from: az on March 16, 2017, 07:14:18 PM
PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
ต้องการใช้ทั้งช่วง 0 ถึง 255 เลยครับ

az

Quote from: JAY on March 16, 2017, 07:20:38 PM
Quote from: az on March 16, 2017, 07:14:18 PM
PWM ที่ต้องการใช้งานมีทั้งหมด กี่ค่าครับ หรือใช้ทั้งช่วง 0..255
ต้องการใช้ทั้งช่วง 0 ถึง 255 เลยครับ

Quote from: crywolf on March 16, 2017, 04:25:20 PM
น่าจะประมาณนี้

int PWMValue;

void loop()
{
  fuzzy->setInput(1,Error);
  fuzzy->setInput(2,dError);         

  fuzzy->fuzzify();

  Duty = fuzzy->defuzzify(1);
/*
  DutyPrevious = DutyNow;       
  DutyNow = Duty;
  PWMValue = DutyPrevious + DutyNow;   
*/
if((PWMValue+Duty)>=0)&&((PWMValue+Duty)<=255)
{
PWMValue += Duty;
}

  analogWrite(PWMPin, PWMValue);
  delay(1000);
}



ตามท่าน crywolf เลยครับ

ปล. ตรวจสอบประเภทตัวแปลต้วยนะครับ ว่าเป็น unsigned หรือ signed


int PWMValue;  // -32,768 to 32,767
int Duty;  // -32,768 to 32,767

.
.
.

if ( (PWMValue+Duty) > 255 )  {
  PWMValue = 255;
}
else if ( ((PWMValue+Duty)>=0) && ((PWMValue+Duty)<=255) )  {
  PWMValue += Duty;
}
else {
  PWMValue = 0;
}


เพราะแสวงหา..  มิใช่เพราะรอคอย
เพราะเชี่ยวชาญ..  มิใช่เพราะโอกาส
เพราะสามารถ..  มิใช่เพราะโชคช่วย
ดังนี้แล้ว "ลิขิตฟ้า  หรือจะสู้มานะตน..."