มิถุนายน 18, 2019, 11:39:13 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1] 2   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: ถามแอดมินเรื่องการ tune หาค่า Kp,Ki,Kd หน่อยครับ  (อ่าน 26249 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« เมื่อ: กุมภาพันธ์ 18, 2012, 12:54:56 am »

ขอเล่า background ก่อนแล้วกัน
ตอนนี้ ผมกำลังทำระบบตัวทำร้อน ทำเย็น ด้วย Peltier ถ่ายเทความร้อนไปที่ แท่นรองอลูมิเนียมหลักการจะคล้ายเครื่อง K49

ใส่รูป ขยายเมื่อเมาส์ชี้

ผมก็อาศัยมองจากการทำงานภายนอกของมัน แล้วก็พยายามสร้างระบบเลียนแบบมันหน่ะครับ

ผมลองอ่านค่าอุณหภูมิที่มันทำได้ โดยบันทึกค่าทุกๆ 1 วินาที ลองพล๊อตกราฟดู พบว่า ที่ Setpoint ของเครื่องนี้ มันนิ่งมากๆ เลย (แทบไม่น่าเชื่อ) อยู่ที่ 55 องศา แทบไม่กระดิกเลยค่ามัน (ไม่รู้เครื่องมันหลอกผมหรือเปล่า)

ผมก็พยายามที่จะแปลงระบบ close loop feedback ของผม ให้กลายเป็น PID controller โดยหวังว่า อย่างน้อยเครื่องที่เราทำเองได้ จะมีประสิทธิภาพใกล้เคียง

เริ่มต้นก็เริ่มศึกษาการ Implement การนำภาษาซีมาเขียนโปรแกรมให้มันเป็น PID จากตัวอย่างนี้
http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

แล้วก็เริ่มแปลงโค๊ดจาก Library C++ ให้เป็น CCS C ของ PIC  อันนี้เป็นหน้าตาในส่วนการทำ PID ของผมครับ โดยที่
maxDuty คือ ค่า PR2 สูงสุดที่ทำให้ duty cycle = 100%
error = ค่าอุณหภูมิที่ตั้ง - ค่าอุณหภูมิที่อ่านได้จาก DS18B20 ในที่นี้ผมให้มันคูณ 10 เพื่อปัดเศษมาก่อน เช่น 25.0 จะได้ 250
timeInSec มาจาก ms ซึ่งเป็นค่าที่นับมาจาก Timer0 ให้ interrupt ทุกๆ 100ms ให้เข้ามาทำในฟังก์ชั่นนี้ ซึ่งอาจจะมีเกินบ้างเป็น 110, 105ms ประมาณนี้

ข้อสงสัยแรก คือ
ผมไม่แน่ใจว่า หน่วยที่ผมเอามาคำนวณ ควรจะเป็นอย่างนี้หรือเปล่า หน่ะครับ

 
Code: (c)

void compute(void)
{
    float i,d;
    static long lastError = 0;
    float timeInSec = (float)ms / 1000.0;
    i = ki * timeInSec;
    d = kd / timeInSec;
    ITerm += (i * error/10);
    ITerm = (ITerm>=maxDuty)?maxDuty:ITerm;
    ITerm = (ITerm<minDuty)?minDuty:ITerm;
    dError = (error - lastError);
    Output =  (long)(kp*error/10) + ITerm + (kd*dError/10);
    Output = (Output>=maxDuty)?maxDuty:Output;
    Output = (Output<minDuty)?minDuty:Output;    
    lastError = error;
    ms = 0;
    set_timer0(100);
}

ต่อมา
ก็คือ เราจะหาค่า Kp,Ki,Kd ที่เหมาะสมได้อย่างไร ก็มีทฤษฎีของหลายคนอยู๋ ผมเลือกที่จะทำตาม ของ Ziegler–Nichols method ที่เค้าใช้กับ Close loop โดยการเพิ่มค่า Ultimating gain จนมัน Steady Oscillate ก่อน แล้ววัดหาค่าคาบเวลาที่มัน Oscillate

ที่สงสัยที่สองก็คือ ค่าอุณหภูมิเท่าไหร่ที่่ใช้ทดลองหาค่า Ultimating gain ผมก็ไม่รู้เหมือนกัน ว่าเท่าไหร่ โดยผมหวังว่า ค่า kp,Ki,Kd ที่หาได้มันควรจะ cover range -5 ถึง 75 องศาเซลเซียส หน่ะครับ ผมก็เลยพยายามลอง ที่ 50 องศาเซลเซียสก่อน

จากข้อมูลที่ผมเก็บได้ โดยผ่านการส่งออกมาทาง RS232 โดยเก็บมาทุกวินาที ผมหาค่า Ultimating gain ได้ 400  Shocked แล้วค่าคาบเวลาที่มัน Oscillate ได้ประมาณ 49 วินาที



จากค่าที่ได้ ผมก็เริ่มทำตาม โดยผมลองเลือกที่ ค่าในตารางที่เป็น P, PI ,PID




ผลลัพท์ที่ได้ก็คือ ค่าที่ Steady state ผมก็ยัง Oscillate ที่ +/- 1 องศาของ Setpoint อยู่ดี  cry

ผมไม่แน่ใจว่าผมทำถูกหรือเปล่า แล้วค่าที่ควรเอามาใส่ใน PID หน่วยผมทำถูกหรือเปล่าครับ ช่วยชี้แนะหน่อยครับ

บันทึกการเข้า

ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #1 เมื่อ: กุมภาพันธ์ 18, 2012, 07:50:33 am »

- Temperature เป็นอะไรที่ถือว่าเปลี่ยนแปลงช้ามาก จึงทำให้ควบคุมง่ายที่สุดแล้วเมื่อเทียบกับ Flow, Speed, Position และอื่นๆ
- เครื่องที่เขาขายถ้าแกว่งมากก็ขายไม่ได้ และผมค่อนข้างมั่นใจว่าเครื่องนั้นไม่ได้หลอกแน่นอน ด้วยเหตุผลที่บอกไปข้างต้นว่า Temperature เราจัดการกับมันได้ง่ายมาก
- จาก code ตาม link นั้น ดูแล้วน่าจะทำงานได้ดีสำหรับกสรควบคุมอุณหภูมิ แต่น่าจะมีการกำหนดย่าน [MIN, MAX] ของ Output ด้วย


ไม่เช่นนั้นความเสี่ยงในการนำ Output ไปใช้คำนวณเพื่อทำอย่างอื่นเช่น PWM จะมีโอกาศผิดพลาดได้สูงมาก

- DS18B20 สามารถวัดอุณหภูิมได้ละเอียดที่สุดด้วย Resolution 0.5 องศา ใช่หรือเปล่า (ตรวจสอบ datasheet ด้วย) ถ้าใช่ นั่นหมายความว่าระบบ Error มาตั้งแต่ Input แล้ว


- ตัว Sensor มีความละเอียดต่ำ กำหนด Sampling Rate สูงไปมากแค่ไหนก็ไร้ค่าอย่างสิ้นเชิง

- แต่การ Sampling ที่ต่ำเกินไปเมื่อเทียบกับการเปลี่ยนแปลงของอุณหภูมิ ก็เป็นสาเหตุให้เกิด Error ร้ายแรงได้ยิ่งกว่าการใช้ Sensor ความละเอียดต่ำเสียอีก ยกตัวอย่างเช่นใน 1 วินาที อุณหภูมิเปลี่ยนได้ 1 องศา และเรา Sampling มา 1Hz นั่นหมายความว่ายอมรับ Error 1 องศานี้เป็นค่าต่ำสุดของระบบไปโดยไม่รู้ตัวเสียแล้ว และเมื่อรวมกับความละเอียดของ Sensor เข้าไปอีกก็ไปกันใหญ่

- ตอนนี้ผมเองก็ไม่รู้ว่าโปรแกรมผิดถูกอย่างไร แต่แนะนำการทดสอบง่ายๆ โดยการอ่านค่าแรงดันจากตัวต้านทานปรับค่าได้ เข้าไปยัง ADC จำลองว่าค่าแรงดันจากต้นทานปรับค่านี้เป็นอุณหภูมิ แล้วลองปรับ ลองเล่น ลองทดสอบ algorithm ดู ก็จะวิเคราะห์ และมองเห็นอะไรอีกหลายอย่าง

- หากการทดสอบวิธีนี้ไปได้สวย นั่นชี้ชัดว่า Algorithm ของเราใช้งานได้ ใฟ้เพ่งเล็กไปที่ Sensor เป็นลำดับต่อไป (แต่ส่วนอื่นก็อย่าไว้วางใจ)

- Ziegler–Nichols และอื่นๆ เป็นวิธีการที่ใช้ได้ผลจริงแน่นอน เชื่อในวิธีการนั้นได้




ลุยต่อไปครับ ผมเชื่อว่าอีกไม่นานจะสร้างเครื่องนี้ได้สำเร็จอย่างแน่นอน
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #2 เมื่อ: กุมภาพันธ์ 24, 2012, 10:34:13 pm »

ขอเล่าถึงสิ่งที่ผมทำลงไป และได้คิดเอาเองก่อนนะครับ
จากสมการ ของตัวควบคุม Type C >>> http://bestune.50megs.com/type_ABC.htm
อันนี้ คือสิ่งที่ผมเข้าใจ คือ ควรจะแปลงหน่วยของอุณหภูมิที่อ่านได้ อุณหภูมิที่กำหนดมาจาก Setpoint เทียบกับค่าอุณหภูมิสูงที่สุดที่เครื่องเราทำได้ ในที่นิ้ผมต้องการสร้างเครื่องที่ทำอุณหภูมิได้ 75 องศาเซลเซียส  (หรือ ค่า 750 นั่นเอง)

จากนั้น ผมนำมาเข้าสมการ PID Type C (ที่เค้าแนะนำว่าดีที่สุดแล้ว) ด้วยการแปลงให้อยู่ในรูปของการ Sampling ค่ามาเก็บไว้
ตรงนี้ น่าจะเรียกว่า Z domain หรือเปล่าไม่แน่ใจ ( อ่อน math U_U ) เมื่อมาเขียนเป็นโค้ด จะได้ว่า


Code: (c)
void compute(void)
{
    float T = (float)ms / 1000.0;
    Sp = (float)((float)(Setpoint)/750.0*100.0 );
    PV[k] = (float)((float)(Input)/750.0*100.0 );    
    if(PV[k]>100){PV[k]=100;}    
    CO[k] = CO[K-1] - (Kp*(PV[k] - PV[k-1])) + (Ki*T*ERROR(k)) - ((Kd/T)*(PV[k]-2*PV[k-1]+PV[k-2]));
    PV[k-2] = PV[k-1];
    PV[k-1] = PV[k];
    CO[k-2] = CO[k-1];
    CO[k-1] = CO[k];
    if(CO[k] > 100){
       CO[k] = 100;
    }else if(CO[k] < 0){
       CO[k] = 0;
    }
    
    Output = (CO[k]*(float)maxDuty/100.0);
    ms = 0;
    set_timer0(100);
}

ค่า CO คือค่า % ที่ PID คำนวณให้ว่าต้องไปเร่ง PWM เท่าไหร่ ในที่นี้ ผมเอาไปคูณกับค่า PR2 สูงสุดอีกที

จากการลองทำด้วยวิธีนี้ ผมเห็นพฤติกรรมของเครื่อง ได้อย่างรูปตัวอย่างที่ผมแสดงให้ดูหน่ะครับ อาจจะไม่สวยงามเหมือนในรูป แต่ก็มีแนวโน้ม



แต่ ค่า Kp,Ki,Kd ที่ผมเอามาใส่ลงไปนั้นเป็นค่าที่ยังไม่ถูกต้องนัก ซึ่งจากวิธีของ Ziegler–Nichols method
ผมได้ Kp = 200 และค่าคาบเวลาในการแกว่ง มันเท่ากับ 49 วินาที ผมกำลังคิดว่า ผมมาผิดทางแล้วหล่ะ

คือด้วย Ziegler–Nichols method ผมอ่านๆ ดูแล้วก็ไม่ค่อยเคลียร์เท่าไหร่ ผมได้ทดลองดังนี้ครับ

เริ่มจากระบบหยุดนิ่ง (25 องศาเซลเซียส) แล้วผมทำการเพิ่มค่า p เริ่มจาก 10 แล้วก็ให้มันทำอุณหภูมิจาก 25 ไปจนถึง 50 องศา ด้วยสมการ P-control

Output = P คูณ  Error

แล้วก็รอให้มัน Oscillate ปรากฎว่า มันไม่ยอม Oscillate (หรืออาจจะแกว่างตัวเล็กน้อย จนสังเกตไม่เห็น) ในสภาวะคงตัวมันไปไม่ถึง 50 องศา  ด้วยซ้ำ ผมก็เลย เพิ่มค่า P ใหม่ แล้วก็ทดลองเหมือนเดิม จาก 25 ไป 50 องศา อีกครั้ง แล้วก็รอดูผล

ทำซ้ำไปเรื่อยๆ จน ค่า P=200 ซึ่งผมคิดว่ามันแปลกๆ แล้วหล่ะ เหมือนๆ จะมาผิดวิธียังงัยไม่ทราบ

ไม่ทราบว่า ผมมีตรงไหน เข้าใจยังไม่ตรงคอนเซ๊ปต์หรือเปล่าครับ อยากให้ช่วยแนะนำให้หน่อยครับ
บันทึกการเข้า

ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #3 เมื่อ: กุมภาพันธ์ 25, 2012, 07:48:56 am »

ก่อนจะอ่านต่อขอถามเพิ่มความชัดเจนก่อนว่า
Code: (c)
Sp = (float)((float)(Setpoint)/750.0*100.0 );  
PV[k] = (float)((float)(Input)/750.0*100.0 );

- ค่าของ Sp อยู่ในช่วงไหน (ค่า minimum and maximum)
- ค่า minimum ของ PV[k] คือเท่าไร่?
- ตัวแปรแบบ float รองรับค่า minimum, maximum ช่วงนั้นได้ถูกต้องหรือเปล่า?
- a/b*c, (a/b)*c และ a/(b*c) เหมือนกันหรือแตกต่างกันอย่างไร และสิ่งที่เหมือนเหรือต่างกันนั้น ใช่สิ่งที่ต้องการหรือเปล่า?
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #4 เมื่อ: กุมภาพันธ์ 25, 2012, 08:53:47 am »


ค่า Setpoint อยู่ในช่วง >25 ถึง 75 องศา ครับ (ผมบล๊อกไว้ ไม่ให้เซตเกินนั้น)
และอีกช่วงหนึ่งก็คือ <25 ถึง -5 องศา ครับ (ตรงนี้ผมใช้วิธีกลับ H-bridge แล้วให้ Error = เซนเซอร์ - Setpoint  เพื่อให้ได้ค่า Error เป็นบวกไว้ ครับ)

ค่าต่ำสุดของ PV[k] คื่ือ ช่วงที่ทำเย็นหน่ะครับ ก็หวัีงว่ามันจะอ่านค่าอุณหภูมิจาก ศูนย์ไปจนถึง ลบห้า องศา ครับ

ตรงนี้ ผมพยายาททำให้มันอยู่ในรูปของเปอร์เซ็นต์ หน่ะครับ
Sp = (float)((float)(Setpoint)/750.0*100.0 ); 
PV[k] = (float)((float)(Input)/750.0*100.0 );   

เพราะเวลา บวก ลบ คูณ หาร แล้ว ค่าที่ได้มันจะไม่เวอร์เกินไปหน่ะครับ เพราะตอนนี้ อุณหภูมิผมอ่านมา แล้ว คูณด้วย 10 อยู่ครับ เช่น 25.0 แต่เก็บค่าไว้  250  ก็เลยทำเป็น ก็เลยคิดว่า แปลงทั้งหมดให้อยู่ใน รูป % ดีกว่า โดยเทียบกับค่าสูงสุด 75 องศา ไว้หน่ะครับ

เดี๋ยวช่วงที่ทำเย็น ผมอาจจะต้องแก้ไขเรื่องค่า maximum ใหม่ ตอนนี้ ผมคิดทำฝั่งร้อนก่อนหน่ะครับ คิดว่ามันทำง่ายกว่า การรบกวนน้อยกว่าฝั่งเย็น
เพราะฝั่งเย็น มันเย็นยากกว่า กว่าจะเข้า Setpoint นี่นานเลยหล่ะ เพราะอากาศร้อนภายนอกมันเข้าไปรบกวน หน่ะครับ ก็เลยพยายามคิดทำฝั่งร้อนให้ค่ามันได้นิ่งๆ ก่อน





บันทึกการเข้า

ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8272


ShadowWares


| |
« ตอบ #5 เมื่อ: กุมภาพันธ์ 25, 2012, 11:29:00 am »

ตอนนี้ Sensor ความละเอียดอยู่ 0.5 องศาเซลเซียส ค่าสูงสุดที่สนใจคือ 75 แต่จากสมการนั้นเป็นการทำให้ค่าสูงสุดเป็น 100 นั่นไม่เป็นการเพิ่มความหยาบของ Sensor ให้มากกว่า 0.5 หรอกหรือ? การเพิ่มความหยาบของ Sensor เหมือนการเพิ่มค่า k โดยอ้อม แต่ส่งผลโดยตรง ส่วนนี้ต้องรับรู้ไว้ว่าเรามีค่า k แอบแฝงอยู่แล้ว 1 ตัว

ผมว่าในกรณีนี้ไม่ต้องไปพยายามเปลี่ยนค่าที่อ่านได้จาก Sensor ก็ได้ครับ ได้เท่าไร่ก็เท่านั้นเลย 0-100% เรารู้อยู่ในใจว่ามันเท่าไร่ ไม่ต้องไปปรับเปลี่ยนเชิงเลขให้เสียเวลาคำนวณก็ได้

ทำฝั่งร้อนให้ work ก่อนก็ดีครับ เพราะฝั่งเย็นก็คงคล้ายกัน เล่นที่ค่า k ต่างๆ อย่างเดียว
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #6 เมื่อ: มีนาคม 06, 2012, 11:44:21 am »

ขอบคุณครับ แอดมิน  kiss kiss



บันทึกการเข้า

Calvadoz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 9


| |
« ตอบ #7 เมื่อ: มีนาคม 07, 2012, 03:52:10 pm »

สวัสดีค่ะ ขอเข้ามาถามต่อในเรื่องนี้ต่อค่ะ พอดีหาใน google แล้วมาเจอกระทู้นี้ค่ะ
ซึ่งเป็นเรื่องที่ทำเหมือนกันพอดีเลยค่ะ คือทำความเย็นจากตัวเพลเทียร์
แต่ว่าตัว sensor ที่ใช้เป็นตัว DS1620 นะคะ
ค่าที่ได้ออกมาจะเป็น digital อยู่แล้วค่ะ ซึ่งสามารถเขียนโค้ดวัดค่าและเอาออก LCD ได้แล้วค่ะ
ทีนี้ก็มาถึงช่วงที่ต้องทำการควบคุมอุณหภูมิแล้วค่ะ ซึ่งคิดไว้ว่าจะใช้ PID แบบเขียนโค้ดเอา(ไม่ต่ออุปกรณ์นอก)
ซึ่งยังงงๆอยู่ว่าจะเขียนโค้ดซียังไง และจะควบคุมแบบไหน คำนวณยังไงค่ะ
ซึ่งอุณหภูมิที่ต้องการจะควบคุมอยู่ที่ 5 องศาค่ะ
(ขอถามค่ะว่าถ้าอุณหภูมิที่เพลเทียร์ทำได้ยังลงมาไม่ถึง 5 องศาก็ไม่สามารถควบคุมมาให้ถึง 5 องศาได้ใช่มั้ยค่ะ)
ตอนแรกคิดว่าจะใช้ H-bridge เหมือนกันค่ะ แต่มันจะไม่เป็นการสลับขั้วการจ่ายไฟหรอค่ะ กลายเป็นว่าจากด้านเย็นเป็นด้านร้อนแทน
โดยการควบคุมอุณหภูมินี้จะเอาไปปรับลดกระแสที่เข้าตัวเพลเทียร์ใช่มั้ยค่ะ (ตามความคิดค่ะ)
ตอนนี้ยังงงอยู่มากเลยค่ะ (เหลือเวลาทำเพียงสองอาทิตย์เท่านั้นด้วย)
รบกวนปรึกษาทั้งสองท่าน ช่วยมาตอบหน่อยนะค่ะ
ขอบคุณมากค่ะ
บันทึกการเข้า
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #8 เมื่อ: มีนาคม 07, 2012, 04:26:49 pm »

ขอตอบแบบเป็นข้อๆ นะครับ

การเขียนโค๊ด ก็ไม่ได้มีไรยุ่งยาก ที่ยากก็คือการหาค่า Kp,Ki ที่จะมาใส่เข้าไปในโค๊ดหน่ะครับ ซึ่งจะต้องหาด้วยวิธีของ Ziegler–Nichols method (มีอยู่ 2 วิํธี)  ซึ่งวิธีที่ผมเลือกใช้คือ Open-loop หน่ะครับ หวังว่าคงเข้าใจนะครับ Open loop test , Close loop test เป็นยังงัย มีเรียนในวิชาคอนโทรล
สามารถดูโค๊ดตัวอย่างการคำนวณ PID ได้จาก appnote นี่เลยครับ http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en011782

H-bridge เอาไว้สำหรับเป็นขับกระแสให้กับ Peltier และกลับทิศทางกระแส ผมใช้ H-bridge เพื่อเวลาที่ต้องการเลือกโหมดว่าจะทำร้อน หรือ เย็น ก็ให้ไมโคร คอนโทรล มาที่ H-bridge เพื่อกลับทิศทางกระแส และใช้ PWM ทำการควบคุมปริมาณกระแสที่ไหลผ่าน Peltier ผ่านทาง H-bridge ครับ

การที่ Peltier ทำความเย็นได้ไม่ถึง 5 องศา สาเหตุใหญ่คือ ระบายความร้อนไม่ทัน(ด้านตรงข้ามกับทำเย็น)  กับ กระแสจากพาวเวอร์ซัพพลายไม่พอ (ต้องการกระแสมากถึง 6A dc ครับ)

สิ่งสำคัญของ PID คือ Feedback ที่ป้อนกลับ ควรจะัควบคุมไม่ให้มี error ในที้นี้เราใช้ sensor temp DS1620 เป็นตัวป้อนกลับ การอ่านค่าอุณหภูิมิกลับมาแต่ละครั้ง ระวังอย่าให้เกิด Error ครับ เพราะจะทำให้ PID มันคำนวณผิดพลาดครับ

ลองเข้าไปศึกษาเรื่อง PID เพิ่มเติมได้จาก PID Labview ก็ได้ครับ เขียนง่ายดี www.ni.com/pdf/manuals/322192a.pdf

อันนี้เป็นการใช้ PID Module สำเร็จรูปใน Labview ครับ แต่สุดท้ายเราก็ต้องมาหาค่า Kp,Ti ให้เหมาะสมกับระบบอยู่ดีครับ

บันทึกการเข้า

Calvadoz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 9


| |
« ตอบ #9 เมื่อ: มีนาคม 07, 2012, 11:18:52 pm »

ถ้าใช้ open loop มันก็จะไม่มีการนำ error มาคิดด้วยไม่ใช่หรอค่ะ??

ส่วนเรื่อง H-bridge นี่คืออย่างเช่นว่าต้องการควบคุมอยู่ที่ 5 องศา ถ้าเกินกว่านี้ก็กลับขั้วให้ด้านเย็นทำงาน แต่พอต่ำกว่าก็ให้ด้านร้อนทำงานใช่มั้ยค่ะ?

ส่วนที่ไม่ถึง 5 องศาน่าจะมาจากเหตุนั้นแหละคะ เพราะได้ลองเพลเทียร์ทั้งสองขนาดเลย โดยตัวที่รับได้ 5A นั้น กอนไฟเพียง 4A เท่านั้นเองค่ะ แต่ว่ามีการระบายความร้อนดีคะ (ใช้ heat sink&fan ขนาด 5 นิ้วทั้งคู่ค่ะ) พอมันลงไปไม่ถึงเลยลองใช้ตัวที่รับได้มากสุด 10A แต่ใช้ heat sink&fan ขนาดเท่าเดิม ซึ่งมันกินไฟประมาณ 7A ได้ค่ะ แต่ heat sink ร้อนมาก ระบายความร้อนไม่ทัน และถ้าเพิ่มขนาดก็จะทำให้น้ำหนักเพิ่มมากขึ้นอีก
ขอถามหน่อยค่ะ ว่าคุณdynamic ใช้heat sink ระบายความร้อนขนาดไหนคะ
แล้วใช้เพลเทียร์กี่ตัว ที่กะไว้ว่าจะใช้สี่ตัว (จำนวนตัวเยอะขึ้นทำให้มันเย็นขึ้นด้วยรึเปล่าค่ะ?)

ขอบคุณมากคะ คงมารบกวนอีกบ่อยๆเลยละคะ อย่าเพิ่งรำคาญไปก่อนนะคะ
บันทึกการเข้า
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #10 เมื่อ: มีนาคม 07, 2012, 11:35:52 pm »

อ้างถึง
ถ้าใช้ open loop มันก็จะไม่มีการนำ error มาคิดด้วยไม่ใช่หรอค่ะ??
ถูกต้องครับ ตอนเราทำ open loop เราไม่ต้องเอา Error มาคิดครับ จ่ายพลังงานเข้าไประดับหนึ่ง ไม่จำเป็นต้องเป็น 100% เพื่อต้องการหาค่า Kc กับค่า Time constant ของระบบก่อนการปรับปรุงหนะ่ครับ หลังจากได้ค่าแล้วคำนวณค่า Kc,Ti,Td แล้วค่อยแก้โค๊ดให้มันเป็น PID  ครับ

อ้างถึง
ส่วนเรื่อง H-bridge นี่คืออย่างเช่นว่าต้องการควบคุมอยู่ที่ 5 องศา ถ้าเกินกว่านี้ก็กลับขั้วให้ด้านเย็นทำงาน แต่พอต่ำกว่าก็ให้ด้านร้อนทำงานใช่มั้ยค่ะ?
ถ้าเป็นอุปกรณ์อิเล็กทรอนิกส์อย่างอื่นก็อาจจะสามารถทำได้ครับ แต่สำหรับ Peltier แล้ว ผมว่าตอนที่มันร้อนเกิน ระบบมัน Overshoot ขึ้นไป เราควรปล่อยให้มันลงมาเองดีกว่าครับ ไม่ต้องไปกลับขั้วมันหรอก เพราะการกลับขั้วทันทีทันใด ในขณะที่มีกระแสค้างอยู่ใน Peltier จะทำให้มันเสียไว ครับ ไม่เชื่อลองดูก็ได้ครับ ไม่ต้องไปกังวลเรื่อง Overshoot ที่เกินมาครับ เพราะมันจะเกิดแค่ช่วงแรกเท่านั้น จริงๆ ระบบความร้อนพวกนี้ มัน order 1 ครับ แทบจะไม่เห็น overshoot เลยก็ว่าได้ (อันนี้ผมคิดเองนะ)

อ้างถึง
แต่ heat sink ร้อนมาก ระบายความร้อนไม่ทัน
อย่าปล่อยให้มันระบายความร้อนไม่ทัน หากเราต้องการทำความเย็นครับ เพราะมันจะพังง่ายมาก ตัวที่พัง วัดความต้านทานดูครับ เกิน 3 โอห์มขึ้นไป ก็เขวี้ยงเข้าป่า ได้เลยครับ

อ้างถึง
ขอถามหน่อยค่ะ ว่าคุณdynamic ใช้heat sink ระบายความร้อนขนาดไหนคะ
ผมใช้ตัวนี้ครับ corsair H50 ขนาดเกือบพอดีกับ peltier ที่มีขายอยู่เลยครับ 1 อันก็ได้ 1 ตัว (เปลือง แพง แต่ประสิทธิภาพ ผมทำได้ อุณหภูมิติดลบ เลยครับ)
บันทึกการเข้า

Calvadoz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 9


| |
« ตอบ #11 เมื่อ: มีนาคม 08, 2012, 04:18:10 am »

ขอบคุณมากค่ะ ที่แนะนำเรื่องระบายความร้อน ขอถามต่อหน่อยค่ะ ว่าตัวนี้ที่คุณdynamic ใช้ระบายความร้อนเนี่ยติดไว้ด้านร้อนใช่มั้ยค่ะ แล้วด้านเย็นละค่ะ คุณdynamic ได้ติดอะไรไว้ด้วยหรือเปล่าหรือปล่อยไว้เฉยๆ

ว่าแต่ corsair H50 นี่ราคาประมาณเท่าไรคะ หาในเนตไม่ค่อยมีบอกราคาเลย มีแต่รีวิวเอาไว้

ขอบคุณเรื่องควบคุมด้วยค่ะ เดี๋ยวขอไปศึกษาดูก่อนค่ะ ไม่เข้าใจแล้วจะมาถามใหม่ค่ะ
บันทึกการเข้า
วิสิทธิ์ แผ้วกระโทก
Global Moderator
Sr. Member
*****
ออฟไลน์ ออฟไลน์

กระทู้: 307



| |
« ตอบ #12 เมื่อ: มีนาคม 08, 2012, 08:20:07 am »

ผมเลียนแบบโครงสร้างคล้ายๆ เครื่อง K49 (กระทู้บนสุด) เลยครรับ แต่ไม่เหมือน เพราะโดนบังคับด้วยอุปกรณ์เท่าที่หาได้

เวลาทำร้อน ด้านร้อนถูกเปิดออกสู่อากาศภายนอกผ่านอลูมิเนียมที่ทำเป็นแท่นวางงาน (เป็นด้านที่เอาไว้ใช้งาน)
เวลาทำเย็น ด้านเย็นก็ถูกเปิดออกสู่อากาศภายนอกเหมือนเดิม แต่ด้านที่ร้อนถูกดึงความร้อนออกผ่านทางตัวระบายความร้อน H50

ตัว H50 ราคาประมาณ 3000 กว่าบาทครับ ลองไปหาที่ Banana IT ดูครับ เห็นเพื่อนผมซื้อมาตัวหนึ่ง โมเดล H50 มันอาจจะเก่าแล้ว ลองดูตัวอื่นที่คล้ายๆ ครับ


บันทึกการเข้า

Calvadoz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 9


| |
« ตอบ #13 เมื่อ: มีนาคม 09, 2012, 04:59:39 pm »

คือจริงๆแล้ว peltier ฝั่งเย็น ที่ผิวมันทำอุณหภูมิได้ติดลบค่ะ แต่ตอนที่ใส่ heatsinkกับพัดลมแล้วนำไปทดลองในกล่องโฟม(ใช้ชุดทำความเย็นpeltier 2ชุด) ปรากฎว่าทำให้น้ำอุณหภูมิลดลงได้เหลือแค่ 13 องศาในเวลา 30นาที แต่ที่ต้องการคือ อยากให้น้ำมีอุณหภูมิ 5 องศา เลยอยากถามว่า มันจะทำความเย็นได้ไหมถ้าเกิดว่าใช้ ชุดทำความเย็น4ชุด(peltier4ตัว) ในกล่องที่มีปริมาตร 30x30x60 cm โดยน้ำที่แช่มีปริมาตรประมาณ 100cm^3
บันทึกการเข้า
Calvadoz
Newbie
*
ออฟไลน์ ออฟไลน์

กระทู้: 9


| |
« ตอบ #14 เมื่อ: มีนาคม 09, 2012, 05:01:41 pm »

รูปค่ะ ลงแล้วรูปไม่ขึ้น
บันทึกการเข้า
หน้า: [1] 2   ขึ้นบน
  พิมพ์  
 
กระโดดไป: