ฉันพยายามควบคุมเฟดเดอร์เชิงเส้นด้วยมอเตอร์ (Linear Slide Potentiometer) โดยใช้ Arduino
การควบคุมแบบ PID ให้ผลลัพธ์ที่ดีสำหรับ "การกระโดด" ไปยังตำแหน่งเป้าหมายที่เฉพาะเจาะจง แต่การติดตามทางลาดเป็นปัญหามันไม่ราบรื่นเลย การเคลื่อนไหวนั้นกระตุกมากไม่ว่าฉันจะพยายามทำอะไร
นี่คือพล็อตของตำแหน่งอ้างอิงตำแหน่งที่วัดได้และเอาท์พุทมอเตอร์เมื่อติดตามทางลาด:
และนี่คือวิดีโอของการทดสอบเดียวกันนั้น
สำหรับระบบเชิงพาณิชย์ดูเหมือนว่าจะราบรื่นกว่ามากดูนี่สิ
รายละเอียด :
เฟดเดอร์มอเตอร์เป็นเทือกเขาแอลป์ RSA0N11M9A0K ในการขับเคลื่อนฉันใช้ST L293D H-bridge ขับเคลื่อนโดยแหล่งจ่ายไฟ 10 V DC ( XL6009 )
ใน Arduino UNO (ATmega328P) ฉันใช้พิน 9 และ 10 ด้วยความถี่ PWM ที่ 31.372 kHz เพื่อให้ไม่ได้ยินเสียง (Timer1 กับ prescaler 1, TCCR1B = (TCCR1B & 0b11111000) | 0b001
)
โพเทนชิออมิเตอร์นั้นเชื่อมต่อระหว่างกราวด์และ 5V โดยที่ที่ปัดน้ำฝนจะไปที่ ADC0 ตามปกติ
ตัวควบคุม :
ฉันใช้ตัวควบคุม PID แบบง่ายที่มีการป้องกันการอัปเดตซึ่งอัปเดตในอัตรา 1 kHz (Ts = 1e-3 s):
float update(int16_t input) {
int16_t error = setpoint - input;
int16_t newIntegral = integral + error;
float output = k_p * error
+ k_i * newIntegral * Ts
+ k_d * (input - previousInput) / Ts;
if (output > maxOutput)
output = maxOutput;
else if (output < -maxOutput)
output = -maxOutput;
else
integral = newIntegral;
previousInput = input;
return output;
}
เอาต์พุตของคอนโทรลเลอร์เป็นค่าตั้งแต่ -127 ถึง 127 เอาต์พุต PWM ถูกสร้างขึ้นดังนี้:
const int8_t knee = 48;
uint8_t activation(int8_t val) {
if (val == 0)
return 0;
else {
return map(val, 0, 127, 2 * knee, 255);
}
}
void writeMotor(int8_t val) {
if (val >= 0) {
analogWrite(forward, activation(val));
digitalWrite(backward, 0);
} else {
analogWrite(backward, activation(-val));
digitalWrite(forward, 0);
}
}
ฉันเพิ่ม 48 ถึงสัญญาณ PWM 7 บิตเพราะนั่นคือที่ที่มอเตอร์เริ่มเคลื่อนที่ที่ 31 kHz และจากนั้นฉันปรับขนาดเป็น 8 บิต (เพราะนั่นคือสิ่งที่analogWrite
ฟังก์ชั่นคาดหวัง):
สิ่งที่ฉันได้ลอง :
ฉันได้ลองเพิ่มตัวกรอง EMA ไปยังอินพุตสัญญาณควบคุมไปยังองค์ประกอบที่มาของตัวควบคุม PID แต่ไม่มีประโยชน์ ฉันยังพยายามลดความละเอียดของอนาล็อกที่ใช้hysteresisที่จะหยุดมันจากการพลิกระหว่างสองค่าเมื่อนิ่ง ดูเหมือนจะไม่ส่งผลกระทบอะไรเลย การเพิ่มขั้นตอนเวลาเป็น 10 ms ดูเหมือนจะไม่ช่วยอะไรเช่นกัน
ฉันได้ลองทำการระบุระบบใน MATLAB และลองปรับใน Simulink (ติดตามวิดีโอซีรีย์นี้) ฉันมีโมเดลที่มี 91% แต่ฉันไม่รู้วิธีจัดการกับอินพุตและเอาต์พุตที่ไม่ใช่เชิงเส้นของโมเดล MATLAB วิธีที่พวกมันมีผลต่อการปรับจูน PID และวิธีใช้งานบน Arduino
สิ่งสุดท้ายที่ฉันได้ลองทำคือสร้างคอนโทรลเลอร์ที่แตกต่างกันสองตัวอันแรกสำหรับการกระโดดขนาดใหญ่ในตำแหน่งอ้างอิงและอีกอันสำหรับข้อผิดพลาดเล็ก ๆ เมื่อติดตามทางลาด ดูเหมือนว่าจะช่วยได้เล็กน้อยเพราะหลังจากนั้นฉันสามารถเพิ่มค่าสัมประสิทธิ์การติดตามได้โดยไม่ต้องเพิ่มแรงเกินเมื่อกระโดด
อย่างไรก็ตามโดยการเพิ่มการได้รับอินทิกรัล (และสัดส่วน) ตอนนี้มอเตอร์ก็ทำอะไรบางอย่างอยู่เสมอแม้ว่ามันควรจะอยู่กับที่และการอ้างอิงก็ไม่เปลี่ยนแปลง (มันไม่เคลื่อนไหว แต่คุณสามารถรู้สึกได้ว่ามันสั่นสะเทือน)
ฉันแทบจะไม่ได้รับผลกระทบใด ๆ เพราะการเพิ่มมันสูงกว่า 1e-4 ดูเหมือนจะทำให้มันกระตุกยิ่งขึ้นและฉันไม่สังเกตเห็นความแตกต่างระหว่าง 0 และ 1e-4
ฉันเดาว่ามันต้องการพลังมากขึ้นในการเอาชนะแรงเสียดทานแบบคงที่จากนั้นแรงเสียดทานแบบไดนามิกจึงน้อยกว่าดังนั้นมันจึงขับมอเตอร์ไปข้างหลังทำให้หยุดอีกครั้งจากนั้นจึงต้องเอาชนะแรงเสียดทานแบบคงที่อีกครั้ง ฯลฯ
คอนโทรลเลอร์เชิงพาณิชย์เอาชนะปัญหานี้ได้อย่างไร
พื้นหลังของฉัน :
ฉันอยู่ในปีที่สามของฉันในวิชาวิศวกรรมไฟฟ้าฉันได้ติดตามหลักสูตรเกี่ยวกับทฤษฎีการควบคุมการประมวลผลสัญญาณดิจิตอลการควบคุม LQR ฯลฯ ดังนั้นฉันจึงมีพื้นฐานทางทฤษฎี แต่ฉันมีปัญหาในการประยุกต์ใช้ทฤษฎีเหล่านั้นทั้งหมด ระบบในโลกแห่งความจริงนี้
แก้ไข :
ฉันได้ทดสอบการวัดเซ็นเซอร์วงเปิดตามที่แนะนำในแล็ปท็อป 2d และฉันค่อนข้างประหลาดใจกับผลลัพธ์: ที่ความถี่ PWM สูงมียอดเขาที่น่ารังเกียจในการอ่าน ที่ 490 เฮิร์ตซ์ไม่มีเลย
และนี่คือรอบการทำงานที่สม่ำเสมอดังนั้นฉันจึงไม่สามารถจินตนาการได้ว่าจะได้รับเสียงรบกวนแบบไหนเมื่อมอเตอร์หมุนกลับทิศทางอย่างรวดเร็ว
ดังนั้นฉันจะต้องหาวิธีกรองสัญญาณรบกวนนั้นก่อนที่ฉันจะเริ่มทำงานกับคอนโทรลเลอร์อีกครั้ง
แก้ไข 2 :
การใช้ตัวกรองค่าเฉลี่ยเคลื่อนที่ชี้แจงแทนไม่เพียงพอที่จะกรองสัญญาณรบกวน
ฉันลองกับเสาใน 0.25, 0.50 และ 0.75 เสาขนาดเล็กไม่มีผลกระทบมากนักและเสาที่ใหญ่กว่าก็เพิ่มความหน่วงมากเกินไปดังนั้นฉันจึงต้องลดผลกำไรลงเพื่อให้มันคงที่ส่งผลให้ประสิทธิภาพโดยรวมแย่ลง
ฉันได้เพิ่มตัวเก็บประจุ 0.1 µF ข้ามโพเทนชิออมิเตอร์ (ระหว่างที่ปัดน้ำฝนและพื้นดิน) และดูเหมือนว่าจะทำความสะอาด
สำหรับตอนนี้มันใช้งานได้ดีพอ ในขณะเดียวกันผมอ่านผ่านกระดาษโพสต์โดยทิม Wescott
ขอบคุณทุกท่านสำหรับความช่วยเหลือของคุณ
This device is suitable for use in switching applications at frequencies up to 5 kHz.
แต่ลักษณะทางไฟฟ้าในหน้า 3 แนะนำให้ใช้สูงสุด 690kHz หากคุณเพิ่มความล่าช้าทั้งหมด (บรรทัดล่างสุด 4 บรรทัด) โดยส่วนตัวแล้วฉันจะช้ากว่านั้นมาก แต่ฉันคิดว่า 31kHz น่าจะเพียงพอ ... ถ้ามันไม่ใช่โน้ตในหน้า 1