การควบคุม PID ของมอเตอร์เฟดเดอร์


15

ฉันพยายามควบคุมเฟดเดอร์เชิงเส้นด้วยมอเตอร์ (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ฟังก์ชั่นคาดหวัง): PWM ความเร็ว

สิ่งที่ฉันได้ลอง :
ฉันได้ลองเพิ่มตัวกรอง EMA ไปยังอินพุตสัญญาณควบคุมไปยังองค์ประกอบที่มาของตัวควบคุม PID แต่ไม่มีประโยชน์ ฉันยังพยายามลดความละเอียดของอนาล็อกที่ใช้hysteresisที่จะหยุดมันจากการพลิกระหว่างสองค่าเมื่อนิ่ง ดูเหมือนจะไม่ส่งผลกระทบอะไรเลย การเพิ่มขั้นตอนเวลาเป็น 10 ms ดูเหมือนจะไม่ช่วยอะไรเช่นกัน

ฉันได้ลองทำการระบุระบบใน MATLAB และลองปรับใน Simulink (ติดตามวิดีโอซีรีย์นี้) ฉันมีโมเดลที่มี 91% แต่ฉันไม่รู้วิธีจัดการกับอินพุตและเอาต์พุตที่ไม่ใช่เชิงเส้นของโมเดล MATLAB วิธีที่พวกมันมีผลต่อการปรับจูน PID และวิธีใช้งานบน Arduino

สิ่งสุดท้ายที่ฉันได้ลองทำคือสร้างคอนโทรลเลอร์ที่แตกต่างกันสองตัวอันแรกสำหรับการกระโดดขนาดใหญ่ในตำแหน่งอ้างอิงและอีกอันสำหรับข้อผิดพลาดเล็ก ๆ เมื่อติดตามทางลาด ดูเหมือนว่าจะช่วยได้เล็กน้อยเพราะหลังจากนั้นฉันสามารถเพิ่มค่าสัมประสิทธิ์การติดตามได้โดยไม่ต้องเพิ่มแรงเกินเมื่อกระโดด
อย่างไรก็ตามโดยการเพิ่มการได้รับอินทิกรัล (และสัดส่วน) ตอนนี้มอเตอร์ก็ทำอะไรบางอย่างอยู่เสมอแม้ว่ามันควรจะอยู่กับที่และการอ้างอิงก็ไม่เปลี่ยนแปลง (มันไม่เคลื่อนไหว แต่คุณสามารถรู้สึกได้ว่ามันสั่นสะเทือน)
ฉันแทบจะไม่ได้รับผลกระทบใด ๆ เพราะการเพิ่มมันสูงกว่า 1e-4 ดูเหมือนจะทำให้มันกระตุกยิ่งขึ้นและฉันไม่สังเกตเห็นความแตกต่างระหว่าง 0 และ 1e-4

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

คอนโทรลเลอร์เชิงพาณิชย์เอาชนะปัญหานี้ได้อย่างไร

พื้นหลังของฉัน :
ฉันอยู่ในปีที่สามของฉันในวิชาวิศวกรรมไฟฟ้าฉันได้ติดตามหลักสูตรเกี่ยวกับทฤษฎีการควบคุมการประมวลผลสัญญาณดิจิตอลการควบคุม LQR ฯลฯ ดังนั้นฉันจึงมีพื้นฐานทางทฤษฎี แต่ฉันมีปัญหาในการประยุกต์ใช้ทฤษฎีเหล่านั้นทั้งหมด ระบบในโลกแห่งความจริงนี้


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

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นฉันจะต้องหาวิธีกรองสัญญาณรบกวนนั้นก่อนที่ฉันจะเริ่มทำงานกับคอนโทรลเลอร์อีกครั้ง

แก้ไข 2 :
การใช้ตัวกรองค่าเฉลี่ยเคลื่อนที่ชี้แจงแทนไม่เพียงพอที่จะกรองสัญญาณรบกวน

EMA

ฉันลองกับเสาใน 0.25, 0.50 และ 0.75 เสาขนาดเล็กไม่มีผลกระทบมากนักและเสาที่ใหญ่กว่าก็เพิ่มความหน่วงมากเกินไปดังนั้นฉันจึงต้องลดผลกำไรลงเพื่อให้มันคงที่ส่งผลให้ประสิทธิภาพโดยรวมแย่ลง

ฉันได้เพิ่มตัวเก็บประจุ 0.1 µF ข้ามโพเทนชิออมิเตอร์ (ระหว่างที่ปัดน้ำฝนและพื้นดิน) และดูเหมือนว่าจะทำความสะอาด

สำหรับตอนนี้มันใช้งานได้ดีพอ ในขณะเดียวกันผมอ่านผ่านกระดาษโพสต์โดยทิม Wescott
ขอบคุณทุกท่านสำหรับความช่วยเหลือของคุณ


คุณสามารถควบคุม 31KHz pwm ด้วยความแม่นยำได้หรือไม่?
Hasan alattar

@Hasanalattar: ไม่ความถี่ที่ฉันสามารถใช้ได้อยู่บนกราฟที่สอง (พรีสเกลเลอร์ 1, 8, 64, 256, 1024) ได้ยินเสียง 4 kHz และ 500 Hz ดังนั้นพวกเขาจึงมีเสียงบี๊บที่น่ารำคาญซึ่งผมอยากหลีกเลี่ยง ที่เหลือ 31 kHz, 120 Hz และ 30 Hz และสองหลังช้าเกินไปฉันคิดว่า ความละเอียดของ PWM คือ 8 บิต แต่ฉันใช้น้อยลงเพราะสัญญาณควบคุมของฉันมีเพียง 7 บิตและฉันใช้เฉพาะค่า PWM ที่สูงกว่า 96
tttapa

1
H-bridge ที่คุณเชื่อมโยงมีอยู่ในหน้าแรกของแผ่นข้อมูล: This device is suitable for use in switching applications at frequencies up to 5 kHz. แต่ลักษณะทางไฟฟ้าในหน้า 3 แนะนำให้ใช้สูงสุด 690kHz หากคุณเพิ่มความล่าช้าทั้งหมด (บรรทัดล่างสุด 4 บรรทัด) โดยส่วนตัวแล้วฉันจะช้ากว่านั้นมาก แต่ฉันคิดว่า 31kHz น่าจะเพียงพอ ... ถ้ามันไม่ใช่โน้ตในหน้า 1
AaronD

อย่างไรก็ตามนั่นถือว่าเป็นรอบการทำงานที่แน่นอน (หรือ "ไม่สนใจ" รอบหน้าที่สำหรับความถี่สูงสุดที่แน่นอนที่จะ "เพียงแค่กระดิกมัน" - คุณจะสังเกตเห็นว่ามันไม่สมดุล) สูงและรอบหน้าที่ต่ำสามารถผลิตพัแคบมากบางดังนั้นวิธีการที่กว้างเหล่านั้นเมื่อเทียบกับ ด้านล่างของหน้า 3
AaronD

1
ไม่แน่ใจว่าเป็นปัญหาของคุณหรือไม่ แต่ถ้าการประทับเวลาสามารถเปลี่ยนแปลงได้ฉันคิดว่าคุณควรเพิ่มข้อผิดพลาด * Ts ให้กับอินทิกรัลไม่ใช่แค่ข้อผิดพลาดและอย่าคูณอินทิกรัลโดย Ts (ถ้า Ts เป็นค่าคงที่เสมอมันก็ไม่สำคัญ)
user253751

คำตอบ:


9

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

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


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

ใช้ตัวกรองกลไกหรือดิจิตอล ถ้าคุณทำอย่างนั้นไม่ได้พวกมันอาจจะใช้เซ็นเซอร์คู่ขนานกันก็ได้ meta.stackexchange.com/questions/126180/…
แรงดันไฟฟ้าขนาด

6

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

ฉันไม่รู้ว่าผู้ควบคุมเชิงพาณิชย์ทำอะไรถึงแม้ว่าฉันสงสัยว่ามีวิธีแก้ไขปัญหาที่หลากหลาย สิ่งที่ฉันเคยทำในอดีตกับสิ่งต่าง ๆ เช่นนี้คือเมื่อมอเตอร์ไดรฟ์ส่งสัญญาณออกจากตัวควบคุม PID ของฉันต่ำกว่าขีด จำกัด บางอย่าง (อาจเป็น 60 ถึง 70 จำนวนในกรณีของคุณ) ฉันเริ่มเต้นมอเตอร์ไดรฟ์ที่ธรณีประตู วงจรที่ทำให้ไดรฟ์เฉลี่ยเท่ากับเอาต์พุต PID ฉันมักจะใช้ตัวดัดแปลง sigma-delta-ish สำหรับสิ่งนี้เพราะมันสามารถนำไปใช้งานได้ในไม่กี่บรรทัด แต่คุณสามารถไปกับสิ่งที่เหมาะกับคุณ


4

ดูเหมือนว่าเสียงส่วนใหญ่มาจากสัญญาณไดรฟ์ PWM

คุณลองซิงโครไนซ์การดักจับ ADC กับวัฏจักร PWM หรือไม่ ไมโครคอนโทรลเลอร์ส่วนใหญ่มีวิธีในการทริกเกอร์การจับ ADC บนตัวจับเวลาดังนั้นคุณสามารถทริกเกอร์ที่จุดเดียวกันของวงจร

สำหรับเสียงรบกวนต่ำสุดตำแหน่งการสุ่มตัวอย่างที่เหมาะสมจะถูกต้องก่อนที่จะเปลี่ยนพลังงานไปยังมอเตอร์เปิดเพราะแหลมใด ๆ มีเวลาที่ยาวนานที่สุดในการชำระ แต่ไม่ว่าตำแหน่งใดการซิงโครไนซ์การจับภาพจะลด spikes เนื่องจากจำนวนออฟเซ็ตจะยังคงเท่าเดิมที่จุดเดียวกันของวัฏจักร PWM


3

ดังนั้นฉันจะต้องหาวิธีกรองสัญญาณรบกวนนั้นก่อนที่ฉันจะเริ่มทำงานกับคอนโทรลเลอร์อีกครั้ง

คุณสามารถกรองสัญญาณรบกวนเซ็นเซอร์ (หรือการวัด / ตัวแปรที่มีเสียงรบกวนอื่น ๆ ) ในรหัสด้วยสิ่งเช่นนี้ (การกรองผ่านความถี่ต่ำ):

Sกรอง[k]=αSกรอง[k-1]+(1-α)Sดิบ[k]

0<<α1


ฉันพยายามแล้ว แต่ก็ยังไม่เพียงพอที่จะกำจัดยอดเขาและมันเพิ่มความล่าช้ามากเกินไป
tttapa

@ttapa ฉันเห็น คุณลองใช้ค่าตัวใด (0.8,0.9) มันเป็นไปได้ที่จะปรับจูนซึ่งคุณอาจได้ทำไปแล้วเพียงแค่สงสัย
Big6

ฉันอัปเดตโพสต์ดั้งเดิมของฉันเพื่อเพิ่มพล็อตของตัวกรอง EMA ที่ฉันได้ลอง ฉันได้ลอง 0.9 เช่นกันและยิ่งแย่กว่า 0.75 กำไรจะต้องต่ำกว่ามากเนื่องจากความล่าช้า ฉันคิดว่าฉันจะใช้ EMA ที่ จำกัด เพื่อกำจัดเสียงรบกวนของ ADC แต่สำหรับตอนนี้ตัวเก็บประจุก็เพียงพอแล้ว
tttapa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.