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:
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ì analogWrite
chức năng mong đợi):
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.
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.
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.
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.