Điều khiển động cơ fader điều khiển


15

Tôi đang cố gắng điều khiển một fader cơ giới (chiết áp trượt tuyến tính) bằng Arduino.
Kiểm soát PID mang lại kết quả tốt cho việc "nhảy" đến một vị trí mục tiêu cụ thể, nhưng theo dõi các đường dốc là một vấn đề, nó không được suôn sẻ chút nào. Chuyển động rất giật, không có vấn đề gì tôi cố gắng.

Đây là sơ đồ vị trí tham chiếu, vị trí đo và đầu ra động cơ khi theo dõi đoạn đường nối: Theo dõi đoạn đường nối

Và đây là một video của bài kiểm tra tương tự.

Trên các hệ thống thương mại, có vẻ mượt mà hơn nhiều, hãy xem điều này .

Chi tiết : Fader
động cơ là một Alps RSA0N11M9A0K . Để lái nó, tôi đang sử dụng cầu ST L293D H, được cung cấp bởi nguồn điện 10 V DC quy định ( XL6009 ).
Trên Arduino UNO (ATmega328P), tôi đang sử dụng các chân 9 và 10, với tần số PWM là 31.372 kHz để làm cho nó không nghe thấy được (Timer1 với bộ đếm trước 1, TCCR1B = (TCCR1B & 0b11111000) | 0b001).
Chiết áp được nối giữa mặt đất và 5V, với cần gạt đi đến ADC0, như thường lệ.

Bộ điều khiển :
Tôi đang sử dụng bộ điều khiển PID đơn giản với khả năng chống gió, cập nhật với tốc độ 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;
}

Đầu ra của bộ điều khiển là một giá trị từ -127 đến 127. Đầu ra PWM được tạo như sau:

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);
  }
}

Tôi đã thêm 48 vào tín hiệu PWM 7 bit, bởi vì đó là nơi động cơ bắt đầu di chuyển ở mức 31 kHz, và sau đó tôi mở rộng nó thành một số 8 bit (vì đó là những gì analogWritechức năng mong đợi): Tốc độ PWM

Những gì tôi đã thử :
Tôi đã thử thêm bộ lọc EMA vào đầu vào, vào tín hiệu điều khiển, vào thành phần phái sinh của bộ điều khiển PID, nhưng không có kết quả. Tôi cũng đã thử hạ độ phân giải của đầu vào tương tự, sử dụng độ trễ để ngăn không cho nó bị lật giữa hai giá trị khi đứng yên. Điều này dường như không ảnh hưởng đến bất cứ điều gì. Tăng bước thời gian lên 10 ms dường như cũng không giúp được gì.

Tôi cũng đã thử thực hiện nhận dạng hệ thống trong MATLAB và đã thử điều chỉnh nó trong Simulink (theo loạt video này ). Tôi có một mô hình với tỷ lệ phù hợp là 91%, nhưng tôi không biết làm thế nào để xử lý các phi tuyến tính đầu vào và đầu ra của mô hình MATLAB, cách chúng ảnh hưởng đến điều chỉnh PID và cách triển khai nó trên Arduino.

Điều cuối cùng tôi đã thử là tạo ra hai bộ điều khiển khác nhau: một cho các bước nhảy lớn ở vị trí tham chiếu và một cho các lỗi nhỏ khi theo dõi đoạn đường nối. Điều này có vẻ giúp một chút, bởi vì sau đó tôi có thể tăng hệ số tích phân khi theo dõi, mà không tăng độ vọt khi nhảy.
Tuy nhiên, bằng cách tăng mức tăng tích phân (và tỷ lệ), động cơ bây giờ luôn luôn làm một cái gì đó, ngay cả khi nó phải đứng yên và tham chiếu không thay đổi. (Nó không thực sự di chuyển, nhưng bạn có thể cảm thấy nó rung.)
Tôi hầu như không có lợi ích phái sinh, bởi vì việc tăng nó cao hơn 1e-4 dường như làm cho nó thậm chí còn giật hơn và tôi thực sự không nhận thấy bất kỳ sự khác biệt nào giữa 0 và 1e-4.

Tôi đoán là nó cần nhiều năng lượng hơn để vượt qua ma sát tĩnh, sau đó ma sát động ít hơn, do đó nó bị quá tải, do đó nó điều khiển động cơ lùi lại, khiến nó dừng lại, sau đó nó phải vượt qua ma sát tĩnh một lần nữa, nó lại bắn về phía trước , Vân vân.

Làm thế nào để kiểm soát thương mại khắc phục vấn đề này?

Nền tảng của tôi :
Tôi đang học năm thứ ba ngành Kỹ thuật điện, tôi đã theo học các khóa về lý thuyết điều khiển, xử lý tín hiệu số, điều khiển LQR, v.v. vì vậy tôi có một số nền tảng lý thuyết, nhưng tôi gặp khó khăn khi áp dụng tất cả các lý thuyết đó vào hệ thống thế giới thực này.


Chỉnh sửa :
Tôi đã thử nghiệm các phép đo cảm biến vòng hở, như laptop2d khuyến nghị và tôi khá ngạc nhiên với kết quả: Ở tần số PWM cao, có các đỉnh khó chịu trong bài đọc. Tại 490 Hz, không có.
Và đây là một chu kỳ nhiệm vụ không đổi, vì vậy tôi không thể tưởng tượng được loại tiếng ồn nào khi động cơ quay ngược chiều rất nhanh.

nhập mô tả hình ảnh ở đây

Vì vậy, tôi sẽ phải tìm cách lọc tiếng ồn đó trước khi bắt đầu làm việc lại với bộ điều khiển.

Chỉnh sửa 2 :
Sử dụng bộ lọc trung bình di chuyển theo cấp số nhân là không đủ để lọc nhiễu.

EMA

Tôi đã thử với các cực trong 0,25, 0,50 và 0,75. Các cực nhỏ không có nhiều tác dụng và các cực lớn thêm quá nhiều độ trễ, vì vậy tôi phải giảm mức tăng để giữ ổn định, dẫn đến hiệu suất tổng thể kém hơn.

Tôi đã thêm một tụ điện 0,1FFF qua chiết áp (giữa cần gạt nước và mặt đất), và điều đó dường như làm sạch nó.

Bây giờ, nó hoạt động đủ tốt. Trong khi đó, tôi đang đọc qua bài báo được đăng bởi Tim Wescott .
Cảm ơn mọi sự giúp đỡ của bạn.


bạn có thể kiểm soát pwm 31KHz một cách chính xác?
Hasan alattar

@Hasanalattar: Không, tần số tôi có thể sử dụng nằm trên biểu đồ thứ hai (bộ đếm trước 1, 8, 64, 256, 1024). 4 kHz và 500 Hz có thể nghe được, vì vậy chúng tạo ra âm thanh tiếng bíp khó chịu, điều mà tôi muốn tránh. Điều đó để lại 31 kHz, 120 Hz và 30 Hz. Và hai cái sau thì quá chậm, tôi nghĩ vậy. Độ phân giải PWM là 8 bit, nhưng tôi đang sử dụng ít hơn, vì tín hiệu điều khiển của tôi chỉ có 7 bit và tôi chỉ sử dụng các giá trị PWM cao hơn 96.
tttapa

1
Cầu H mà bạn đã liên kết có trên trang đầu của biểu dữ liệu: This device is suitable for use in switching applications at frequencies up to 5 kHz. Nhưng Đặc điểm điện ở trang 3 đề xuất mức tối đa tuyệt đối là 690kHz nếu bạn thêm tất cả các độ trễ. (4 dòng dưới cùng) Cá nhân tôi sẽ đi chậm hơn thế nhiều, nhưng tôi nghĩ rằng 31kHz là đủ ... nếu nó không dành cho ghi chú ở trang 1.
AaronD

Tuy nhiên, điều đó giả định một chu kỳ nhiệm vụ cố định. (hoặc một "không quan tâm" chu kỳ nhiệm vụ cho tối đa tần số tuyệt đối để "chỉ lung nó" - bạn sẽ nhận thấy đó là bất đối xứng) cao và chu kỳ nhiệm vụ thấp có thể tạo ra một số xung rất hẹp, vậy làm thế nào rộng được những so với cuối trang 3?
AaronD

1
Không chắc đó có phải là vấn đề của bạn không, nhưng nếu dấu thời gian có thể thay đổi thì tôi nghĩ bạn nên thêm lỗi * Ts vào tích phân, không chỉ lỗi và không nhân số nguyên với Ts. (Nếu Ts luôn là hằng số thì không thành vấn đề)
user253751

Câu trả lời:


9

Một hệ thống điều khiển chỉ tốt như cảm biến của nó, chạy vòng mở cảm biến và loại bỏ đầu vào điều khiển. Tạo đầu vào của riêng bạn cho cảm biến và trượt từ từ (hoặc tìm cách trượt từ từ một cách đáng tin cậy) trong khi lấy dữ liệu vị trí để đảm bảo đó không phải là cảm biến. Nếu cảm biến bị nhiễu, thì hãy cải thiện hiệu suất của cảm biến bằng cách lấy cảm biến mới hoặc song song với nó, hoặc bằng cách lọc đầu ra của cảm biến . Bạn có thể cần một cảm biến với độ phân giải cao hơn.

Nếu cảm biến không ồn thì bạn sẽ cần có một vòng điều khiển khác. PID là hệ thống đặt hàng đầu tiên và không thực sự tuyệt vời trong kiểm soát tỷ lệ.


Cảm ơn bạn, thực sự có rất nhiều tiếng ồn với tần số PWM cao hơn, vì vậy tôi sẽ phải tìm cách cải thiện điều đó. Bạn có tình cờ có cách nào để làm điều đó không?
tttapa

Sử dụng bộ lọc, cơ khí hoặc kỹ thuật số. Nếu bạn không thể làm điều đó thì có lẽ các cảm biến song song sẽ tốt. meta.stackexchange.com/questions/126180/ Mạnh
điện áp

6

Bạn đúng rằng vấn đề là do ma sát, hoặc có thể là sự kết hợp giữa ma sát và phản ứng dữ dội. Đồ thị của bạn về tốc độ trung bình so với chu kỳ nhiệm vụ cho các độ rộng xung khác nhau là đặc trưng của một hệ thống có ma sát. Bài viết này giải thích những gì bạn đang thấy và có một bản tóm tắt các giải pháp đã được sử dụng mãi mãi để giải quyết các vấn đề. Bạn sẽ không thấy chúng trong chương trình giảng dạy kỹ thuật của bạn vì chúng khó phân tích; về cơ bản bạn phải nghịch ngợm với họ trong từng trường hợp cụ thể để khiến họ làm việc.

Tôi không biết những người kiểm soát thương mại làm gì, mặc dù tôi nghi ngờ rằng có nhiều giải pháp khác nhau. Những gì tôi đã làm trong quá khứ với những thứ như thế này là khi tín hiệu ổ đĩa động cơ ra khỏi bộ điều khiển PID của tôi giảm xuống dưới ngưỡng nào đó (có thể là 60 đến 70 đếm trong trường hợp của bạn) Tôi bắt đầu đập ổ đĩa động cơ ở ngưỡng, với nhiệm vụ chu kỳ làm cho ổ trung bình bằng với đầu ra PID. Tôi thường sử dụng một bộ điều biến sigma-delta-ish cho việc này bởi vì nó có thể được thực hiện trong một vài dòng, nhưng bạn có thể đi với bất cứ điều gì phù hợp với bạn.


4

Có vẻ như hầu hết tiếng ồn đến từ tín hiệu ổ đĩa PWM.

Bạn đã thử đồng bộ hóa việc bắt ADC với chu trình PWM chưa? Hầu hết các bộ vi điều khiển đều có cách để kích hoạt ghi ADC trên bộ hẹn giờ, vì vậy bạn luôn có thể kích hoạt tại cùng một điểm của chu kỳ.

Đối với tiếng ồn thấp nhất, vị trí lấy mẫu tối ưu sẽ ở ngay trước khi bật nguồn cho động cơ, bởi vì sau đó bất kỳ gai nào cũng có thời gian dài nhất để xử lý. Nhưng bất kể vị trí nào, đồng bộ hóa việc chụp sẽ giảm đột biến vì lượng bù sẽ vẫn xấp xỉ như nhau tại cùng một điểm của chu kỳ PWM.


3

Vì vậy, tôi sẽ phải tìm cách lọc tiếng ồn đó trước khi bắt đầu làm việc lại với bộ điều khiển.

Bạn có thể lọc nhiễu cảm biến (hoặc bất kỳ phép đo / biến nhiễu nào khác) trong mã bằng một cái gì đó như thế này (lọc thông thấp):

Sđã lọc[k]= =αSđã lọc[k-1]+(1-α)Snguyên[k]

0<<α1


Tôi đã thử điều đó, nhưng nó không đủ để thoát khỏi các đỉnh và nó thêm quá nhiều độ trễ.
tttapa

@tttapa tôi thấy. Giá trị nào cho alpha bạn đã thử? (0.8,0.9) Nó sẽ thực hiện một số điều chỉnh, mà bạn có thể đã thực hiện, chỉ cần tự hỏi.
Big6

Tôi đã cập nhật bài viết gốc của mình để thêm một loạt các bộ lọc EMA mà tôi đã thử. Tôi cũng đã thử 0,9 và thậm chí còn tệ hơn 0,75, mức tăng phải thấp hơn nhiều vì sự chậm trễ. Tôi nghĩ rằng tôi sẽ sử dụng một EMA hạn chế để làm sạch tiếng ồn ADC, nhưng bây giờ tụ điện là đủ.
tttapa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.