สารบัญ:

PID Controller VHDL: 10 ขั้นตอน
PID Controller VHDL: 10 ขั้นตอน

วีดีโอ: PID Controller VHDL: 10 ขั้นตอน

วีดีโอ: PID Controller VHDL: 10 ขั้นตอน
วีดีโอ: PID Controller Implementation in Software - Phil's Lab #6 2024, พฤศจิกายน
Anonim
ตัวควบคุม PID VHDL
ตัวควบคุม PID VHDL
ตัวควบคุม PID VHDL
ตัวควบคุม PID VHDL

โครงการนี้เป็นโครงการสุดท้ายของฉันที่จะสำเร็จการศึกษาระดับปริญญาตรีเกียรตินิยมจากสถาบันเทคโนโลยีคอร์ก บทช่วยสอนนี้แบ่งออกเป็นสองส่วน ส่วนแรกจะครอบคลุมเนื้อหาหลักของรหัส PID ซึ่งเป็นจุดประสงค์หลักของโครงการ และส่วนที่สองครอบคลุมการเชื่อมต่อรหัสซึ่งใช้งานบนกระดานพัฒนา Basys 3 แล้วเชื่อมต่อกับลูกปิงปอง แท่นขุดเจาะลอย แท่นขุดเจาะเชิงทฤษฎีและที่สร้างขึ้นจะแสดงในภาพที่แนบมา

เสบียง

การจำลอง

วิวาโด ดีไซน์ สวีท

การดำเนินการ (ในวงเล็บคือสิ่งที่ใช้สำหรับโครงการของฉัน)

  • บอร์ด FPGA ที่สามารถอินพุตและเอาต์พุตสัญญาณดิจิตอล/อนาล็อก (พื้นฐาน 3)
  • ระบบที่สามารถควบคุมได้ด้วยแหล่งป้อนกลับเดียว (Ping Pong Ball Levitation Rig)

ริก

  • ท่อโพลีคาร์บอเนต
  • พัดลม 5V
  • เซ็นเซอร์อินฟราเรด
  • ฐานพิมพ์ 3 มิติ (บทช่วยสอนนี้จัดทำเอกสารเกี่ยวกับการสร้างแท่นขุดเจาะที่มีการเพิ่มเซ็นเซอร์เพื่อให้ข้อเสนอแนะ แต่โดยทั่วไปแล้วแท่นขุดเจาะจะเหมือนกัน)
  • ตัวต้านทาน 1k
  • เขียงหั่นขนมพร้อม 5V และ GND Rail

ขั้นตอนที่ 1: ทฤษฎีการควบคุมพื้นฐาน

ทฤษฎีการควบคุมพื้นฐาน
ทฤษฎีการควบคุมพื้นฐาน

ฉันคิดว่าการเพิ่มทฤษฎีการควบคุมพื้นฐานจะทำให้ใครก็ตามที่ต้องการลองใช้โค้ดนี้เป็นพื้นฐานที่ดีในการเริ่มต้น

ไดอะแกรมที่แนบมาคือเลย์เอาต์ของคอนโทรลเลอร์ลูปเดี่ยว

r- เป็นข้อมูลอ้างอิง สิ่งนี้กำหนดตำแหน่งที่ต้องการให้คอนโทรลเลอร์ไป

e-เป็นข้อผิดพลาด นี่คือความแตกต่างระหว่างค่าบนเซ็นเซอร์และข้อมูลอ้างอิงของคุณ เช่น. e=r-(d+เอาต์พุตของเซ็นเซอร์)

K-นี่คือตัวควบคุม ตัวควบคุมสามารถประกอบด้วยสามคำ เทอมเหล่านี้คือ P, I และ D ทั้งสามเทอมมีตัวคูณที่เรียกว่า Kp, Ki และ Kd ค่าเหล่านี้กำหนดการตอบสนองของคอนโทรลเลอร์

  • P-สัดส่วน. คอนโทรลเลอร์ P อย่างเคร่งครัดจะมีสัดส่วนเอาต์พุตตามข้อผิดพลาดปัจจุบัน คอนโทรลเลอร์ P นั้นใช้งานง่ายและทำงานได้อย่างรวดเร็ว แต่จะไม่มีวันถึงค่าที่คุณตั้งไว้ (ข้อมูลอ้างอิง)
  • I-อินทิกรัล. ตัวควบคุมอินทิกรัลอย่างเคร่งครัดจะสรุปข้อผิดพลาดก่อนหน้านี้ซึ่งจะไปถึงการอ้างอิงที่ต้องการในที่สุด ตัวควบคุมนี้โดยทั่วไปช้าเกินไปที่จะนำไปใช้ การเพิ่มคำศัพท์ P จะช่วยลดเวลาในการเข้าถึงข้อมูลอ้างอิง เวลาที่ข้อมูลถูกสุ่มตัวอย่างต้องนำมาพิจารณาถึงเงื่อนไขที่ครบถ้วนสมบูรณ์ซึ่งรวมเข้ากับเวลา
  • D-อนุพันธ์. เงื่อนไขอนุพันธ์จะมีผลลัพธ์ซึ่งขึ้นอยู่กับอัตราการเปลี่ยนแปลงของข้อผิดพลาด คำนี้มักใช้กับคำศัพท์ P หรือคำศัพท์ PI เนื่องจากเป็นสัดส่วนกับอัตราการเปลี่ยนแปลงข้อผิดพลาด ซิงเกิลที่มีเสียงดังจะมีการขยายสัญญาณรบกวนซึ่งอาจทำให้ระบบไม่เสถียร ต้องคำนึงถึงเวลาด้วยเนื่องจากคำอนุพันธ์นั้นสัมพันธ์กับเวลาด้วย

U- นี่คือสัญญาณควบคุม สัญญาณนี้เป็นอินพุตไปยังแท่นขุดเจาะ ในกรณีของโครงการนี้ u คืออินพุตสัญญาณ PWM ไปยังพัดลมเพื่อเปลี่ยนความเร็ว

G- นี่คือระบบที่ถูกควบคุม ระบบนี้สามารถสร้างแบบจำลองทางคณิตศาสตร์ในโดเมน S หรือ Z ระบบสามารถอยู่ในลำดับที่ n ได้ แต่สำหรับผู้ที่เริ่มต้นด้วยการควบคุม ระบบลำดับแรกน่าจะได้รับการสมมติขึ้นเนื่องจากเป็นการคำนวณที่ง่ายกว่ามาก มีข้อมูลมากมายเกี่ยวกับระบบการสร้างแบบจำลองที่จะพบได้ทางออนไลน์ ขึ้นอยู่กับเวลาสุ่มตัวอย่างของเซ็นเซอร์ รุ่นของระบบเป็นแบบแยกส่วนหรือต่อเนื่อง สิ่งนี้มีผลกระทบอย่างมากต่อคอนโทรลเลอร์ ดังนั้นควรทำการวิจัยทั้งสองอย่าง

d- นี่คือการรบกวนที่เพิ่มเข้าไปในระบบ การรบกวนคือแรงภายนอกที่แบบจำลองของระบบไม่ได้คำนึงถึง ตัวอย่างง่ายๆ ของสิ่งนี้คือเสียงพึมพำที่คุณต้องการจะลอยขึ้นไปที่ระดับ 5 เมตร ลมกระโชกแรงพัดมา แล้วปล่อยโดรนลงมา 1 เมตร ตัวควบคุมจะปรับตำแหน่งโดรนหลังจากเกิดสิ่งรบกวน สิ่งนี้เรียกว่าการรบกวนเนื่องจากลมไม่สามารถทำซ้ำได้ดังนั้นจึงไม่สามารถจำลองได้

ในการปรับแต่งคอนโทรลเลอร์ มีกฎมากมายเกินกว่าจะตั้งชื่อได้ แต่มีกฎที่ดีบางอย่างที่ฉันเริ่มด้วยคือ Cohen Coon และ Zieger Nichols

การสร้างแบบจำลองระบบโดยทั่วไปเป็นส่วนที่สำคัญที่สุดหากไม่มีแบบจำลองที่ถูกต้อง ตัวควบคุมที่ได้รับการออกแบบจะไม่ตอบสนองตามที่ต้องการ

ควรมีข้อมูลเพียงพอที่นี่เพื่อทำความเข้าใจเกี่ยวกับวิธีการทำงานของคอนโทรลเลอร์ควบคู่ไปกับการวิจัยส่วนบุคคล และโค้ดด้านล่างตัวควบคุมที่มีทั้ง 3 คำรวมกันสามารถนำไปใช้ได้

ขั้นตอนที่ 2: การเขียนรหัส PID

การเขียนรหัส PID
การเขียนรหัส PID

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

  • การทำงานต่อเนื่อง - คอนโทรลเลอร์นั้นแยกจากกันโดยสืบทอดมา ดังนั้นคอนโทรลเลอร์ต้องได้รับการตั้งค่าให้คำนวณทั้ง 3 เงื่อนไขเมื่อมีอินพุตใหม่เท่านั้น วิธีแก้ปัญหาสำหรับการจำลองนี้คือตรวจสอบว่าอินพุตมีการเปลี่ยนแปลงตั้งแต่ครั้งล่าสุดหรือไม่ ใช้งานได้เพื่อจำลองโค้ดที่ทำงานอย่างถูกต้องเท่านั้น
  • เวลาตัวอย่างไม่มีผลต่อปริพันธ์และพจน์อนุพันธ์ - ผู้ควบคุมไม่ได้พิจารณาเวลาที่ตัวอย่างถูกยึด ดังนั้นจึงเพิ่มค่าที่เรียกว่าตัวแบ่งสำหรับเวลาเพื่อให้แน่ใจว่าอินทิกรัลและพจน์อนุพันธ์ทำงานบนค่าที่ถูกต้อง ช่วงเวลา
  • ข้อผิดพลาดอาจเป็นผลบวกเท่านั้น - เมื่อคำนวณข้อผิดพลาดก็มีปัญหาเช่นกันเนื่องจากข้อผิดพลาดไม่เคยมีความหมายเชิงลบเมื่อสัญญาณตอบรับเกินค่าอ้างอิงที่ตัวควบคุมจะเพิ่มเอาต์พุตต่อไปเมื่อควรจะลดลง
  • ค่าที่ได้รับสำหรับ 3 คำนั้นเป็นจำนวนเต็ม - จากประสบการณ์ของฉันฉันมักจะพบว่าค่าสำหรับ 3 คำในคอนโทรลเลอร์จะเป็นตัวเลขทศนิยมเสมอเนื่องจาก Basys 3 ไม่มีเลขทศนิยม ค่าจะต้องได้รับค่าตัวเศษและ ค่าตัวส่วนที่จะทำหน้าที่เป็นวิธีแก้ปัญหานี้

รหัสที่แนบมาด้านล่างมีเนื้อหาหลักของรหัสและ testbench เพื่อจำลองรหัส โฟลเดอร์ zip มีรหัสและชุดทดสอบอยู่ใน Vivado อยู่แล้ว เพื่อให้สามารถเปิดได้เพื่อประหยัดเวลา นอกจากนี้ยังมีการทดสอบจำลองของรหัสซึ่งแสดงผลลัพธ์ที่ติดตามการอ้างอิง ซึ่งพิสูจน์ว่ารหัสทำงานตามที่ตั้งใจไว้

ขั้นตอนที่ 3: วิธีการปรับเปลี่ยนสำหรับระบบของคุณ

ประการแรกไม่ใช่ทุกระบบจะต้องวิเคราะห์อินพุตและเอาต์พุตของระบบ ในกรณีของฉัน เอาต์พุตของแท่นขุดเจาะซึ่งให้ค่าตำแหน่งแก่ฉันนั้นเป็นสัญญาณแอนะล็อก และอินพุตจากระบบเป็นสัญญาณ PWM หมายความว่าจำเป็นต้องมีการแปลง ADC โชคดีที่ Basys 3 มี ADC ในตัว ดังนั้นจึงไม่มีปัญหาที่เอาต์พุตของเซ็นเซอร์ IR จะต้องถูกลดขนาดลงเป็น 0V-1V เนื่องจากเป็นช่วงสูงสุดของ ADC ออนบอร์ด ทำได้โดยใช้วงจรแบ่งแรงดันซึ่งทำจากตัวต้านทาน 1k ที่ตั้งค่าเป็นตัวต้านทาน 3k แบบอนุกรมพร้อมตัวต้านทาน 1k ขณะนี้สัญญาณแอนะล็อกอยู่ในช่วงของ ADC อินพุต PWM ไปยังพัดลมสามารถขับเคลื่อนโดยตรงจากเอาต์พุตของพอร์ต PMOD บน Basys 3

ขั้นตอนที่ 4: การใช้ประโยชน์จาก I/O บน Basy 3

มี I/O จำนวนหนึ่งบน Basys 3 ซึ่งอนุญาตให้ทำการดีบักได้ง่ายขึ้นเมื่อรันโค้ด I/O ถูกตั้งค่าดังนี้

  • Seven Segment Display - ใช้เพื่อแสดงค่าอ้างอิงและค่าบน ADC ในหน่วยโวลต์ ตัวเลขสองหลักแรกของการแสดงผลเจ็ดส่วนจะแสดงตัวเลขสองหลักหลังตำแหน่งทศนิยมของค่า ADC เนื่องจากค่าอยู่ระหว่าง 0-1V ตัวเลขสามและสี่บนจอแสดงผลเจ็ดส่วนแสดงค่าอ้างอิงเป็นโวลต์ และยังแสดงตัวเลขสองหลักแรกหลังตำแหน่งทศนิยมด้วยเนื่องจากช่วงยังอยู่ระหว่าง 0-1V
  • ไฟ LED 16 ดวง - ไฟ LED ถูกใช้เพื่อแสดงค่าของเอาต์พุตเพื่อให้แน่ใจว่าเอาต์พุตอิ่มตัวและเอาต์พุตเปลี่ยนแปลงอย่างถูกต้อง

ขั้นตอนที่ 5: สัญญาณรบกวนบนเอาต์พุตเซ็นเซอร์ IR

มีสัญญาณรบกวนบนเอาต์พุตของเซ็นเซอร์เพื่อแก้ไขปัญหานี้ มีการวางบล็อกเฉลี่ยเข้าที่ เนื่องจากเพียงพอและต้องการงานเพียงเล็กน้อยจึงจะเสร็จสมบูรณ์

ขั้นตอนที่ 6: เค้าโครงโค้ดโดยรวม

เค้าโครงโค้ดโดยรวม
เค้าโครงโค้ดโดยรวม

มีโค้ดชิ้นหนึ่งที่ยังไม่ได้พูดถึง รหัสนี้เป็นตัวแบ่งนาฬิกาที่เรียกว่าทริกเกอร์ โค้ดบิตนี้ทริกเกอร์โค้ด ADC เพื่อสุ่มตัวอย่าง รหัส ADC ใช้เวลาสูงสุด 2us ในการทำให้เสร็จสมบูรณ์ ดังนั้นอินพุตปัจจุบันและอินพุตก่อนหน้าจะถูกหาค่าเฉลี่ย 1us หลังจากนี้ค่าเฉลี่ยคอนโทรลเลอร์จะคำนวณเงื่อนไข P, I และ D เค้าโครงโดยรวมของรหัสและการเชื่อมต่อจะแสดงในไดอะแกรมการเชื่อมต่อชั่วคราว

ขั้นตอนที่ 7: การทดสอบ

การทดสอบ
การทดสอบ

รหัสถูกปรับใช้บน Basys 3 และการตอบสนองต่อไปนี้ถูกบันทึก การอ้างอิงเปลี่ยนไประหว่าง 2 ค่า ซึ่งเป็นกรณีในรหัสโครงการที่เสร็จสมบูรณ์ที่แนบมาด้วย วิดีโอที่แนบมาแสดงการตอบสนองนี้แบบเรียลไทม์ การสั่นจะสลายเร็วขึ้นในส่วนบนของท่อเนื่องจากคอนโทรลเลอร์ได้รับการออกแบบสำหรับภูมิภาคนี้ แต่คอนโทรลเลอร์ไม่ทำงานเช่นกันในส่วนล่างของท่อเนื่องจากระบบไม่เป็นเชิงเส้น

ขั้นตอนที่ 8: การปรับเปลี่ยนเพื่อปรับปรุงโครงการ

โปรเจ็กต์ทำงานได้ตามที่ตั้งใจไว้ แต่มีการปรับเปลี่ยนเล็กน้อยซึ่งฉันจะทำหากโปรเจ็กต์สามารถขยายได้

  • ใช้ตัวกรองดิจิตอลเพื่อลดสัญญาณรบกวนอย่างสมบูรณ์
  • ตั้งค่ารหัส ADC รหัสเฉลี่ย และรหัสการรวมเพื่อทริกเกอร์ตามลำดับ
  • ใช้เซ็นเซอร์อื่นสำหรับการป้อนกลับ เนื่องจากการตอบสนองที่ไม่เป็นเชิงเส้นของเซ็นเซอร์นี้ทำให้เกิดปัญหามากมายในโปรเจ็กต์นี้ แต่ที่มากกว่าในด้านการควบคุม ไม่ใช่ด้านการเข้ารหัส

ขั้นตอนที่ 9: งานพิเศษ

ในช่วงฤดูร้อน ฉันเขียนโค้ดสำหรับตัวควบคุมคาสเคดและดำเนินการแก้ไขที่ฉันแนะนำสำหรับคอนโทรลเลอร์ PID แบบวนซ้ำ

การปรับเปลี่ยนที่ทำกับตัวควบคุม PID ปกติ

· เทมเพลตตัวกรอง FIR ที่ใช้ต้องเปลี่ยนค่าสัมประสิทธิ์เพื่อให้ได้ความถี่ตัดที่ต้องการ การใช้งานปัจจุบันคือตัวกรองเฟอร์ 5 ก๊อก

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

· main for loop ที่ขับเคลื่อนโปรแกรมก็ถูกลดลงเช่นกัน เนื่องจาก for loop ใช้เวลา 7 รอบก่อนหน้านี้ สิ่งนี้ทำให้ความเร็วการทำงานสูงสุดของคอนโทรลเลอร์ช้าลง แต่ด้วยการลดสถานะ for loop t 4 นี่หมายความว่าบล็อกหลักของรหัสสามารถทำงานได้ ภายใน 4 รอบนาฬิกา

การทดสอบ

ตัวควบคุมนี้ได้รับการทดสอบและดำเนินการตามที่ตั้งใจไว้ ฉันไม่ได้ถ่ายรูปการพิสูจน์นี้ เนื่องจากส่วนนี้ของโครงการทำขึ้นเพื่อให้จิตใจตื่นตัว โค้ดสำหรับการทดสอบและ testbench จะพร้อมใช้งานที่นี่ เพื่อให้คุณสามารถทดสอบโปรแกรมก่อนนำไปใช้จริง

ทำไมต้องใช้ตัวควบคุมคาสเคด

ตัวควบคุมคาสเคดจะควบคุมสองส่วนของระบบ ในกรณีนี้ ตัวควบคุมคาสเคดจะมีวงรอบนอกซึ่งเป็นตัวควบคุมที่มีการป้อนกลับจากเซ็นเซอร์ IR วงในมีการตอบสนองในรูปแบบของเวลาระหว่างพัลส์จากเครื่องวัดวามเร็วซึ่งกำหนดความเร็วในการหมุนของพัดลม ด้วยการใช้การควบคุม การตอบสนองที่ดีขึ้นสามารถทำได้จากระบบ

ตัวควบคุมคาสเคดทำงานอย่างไร

วงรอบนอกของตัวควบคุมจะป้อนค่าสำหรับเวลาระหว่างพัลส์กับตัวควบคุมวงใน ตัวควบคุมนี้จะเพิ่มหรือลดรอบการทำงานเพื่อให้ได้เวลาที่ต้องการระหว่างพัลส์

การดำเนินการแก้ไขบนแท่นขุดเจาะ

น่าเสียดายที่ฉันไม่สามารถปรับใช้การแก้ไขเหล่านี้กับอุปกรณ์ได้เนื่องจากไม่มีสิทธิ์เข้าถึง ฉันทดสอบตัวควบคุมลูปเดี่ยวที่แก้ไขแล้วซึ่งทำงานตามที่ตั้งใจไว้ ฉันยังไม่ได้ทดสอบตัวควบคุมคาสเคดเลย ฉันมั่นใจว่าตัวควบคุมจะทำงานได้ แต่อาจต้องมีการปรับเปลี่ยนเล็กน้อยเพื่อให้ทำงานได้ตามที่ตั้งใจไว้

การทดสอบ

ฉันไม่สามารถทดสอบคอนโทรลเลอร์ได้ เนื่องจากจำลองแหล่งอินพุตสองแหล่งได้ยาก ปัญหาเดียวที่ฉันสามารถเห็นได้จากตัวควบคุมคาสเคดคือเมื่อลูปด้านนอกพยายามเพิ่มเซ็ตพอยต์ที่จ่ายให้กับวงใน โดยที่เซ็ตพอยต์ที่ใหญ่กว่านั้นจริง ๆ แล้วเป็น RPS ที่ต่ำกว่าสำหรับพัดลม แต่สิ่งนี้สามารถแก้ไขได้ง่าย หาค่าที่ตั้งไว้จากค่าสูงสุดของสัญญาณที่ตั้งไว้ (4095 - setpoint - tacho_result)

ขั้นตอนที่ 10: สรุป

โดยรวมแล้วโปรเจ็กต์ทำงานได้ตามที่ตั้งใจไว้เมื่อเริ่มโปรเจ็กต์ ดังนั้นฉันจึงพอใจกับผลลัพธ์ที่ได้ ขอบคุณที่สละเวลาอ่านความพยายามของฉันในการพัฒนาตัวควบคุม PID ใน VHDL หากใครกำลังพยายามใช้รูปแบบนี้ในระบบและต้องการความช่วยเหลือเพื่อทำความเข้าใจรหัส โปรดติดต่อฉัน ฉันจะตอบกลับโดยเร็วที่สุด ใครก็ตามที่พยายามทำงานพิเศษที่เสร็จสมบูรณ์แล้ว แต่ไม่ได้ดำเนินการ โปรดติดต่อฉันเพื่อขอความช่วยเหลือ ฉันจะขอบคุณมากถ้าใครใช้มันแจ้งให้เราทราบว่ามันไปอย่างไร

แนะนำ: