Arduino를 사용하여 전동식 페이더 (선형 슬라이드 전위차계)를 제어하려고합니다.
PID 제어는 특정 목표 위치로의 "점핑"에 대한 좋은 결과를 제공하지만, 경사로 추적은 문제가 될 수 있습니다. 내가 무엇을 시도하든 운동은 매우 불안정합니다.
램프를 추적 할 때 기준 위치, 측정 된 위치 및 모터 출력의 플롯이 있습니다.
그리고 여기 같은 테스트 의 비디오 가 있습니다.
상용 시스템에서 훨씬 부드러운 것, 볼 이 .
세부 사항 :
모터 페이더는 알프스 RSA0N11M9A0K 입니다. 이를 구동하기 위해 조정 된 10V DC 전원 공급 장치 ( XL6009 )로 구동되는 ST L293D H 브리지를 사용하고 있습니다.
Arduino UNO (ATmega328P)에서 핀 9와 10을 사용하고 31.372kHz의 PWM 주파수를 사용하여들을 수 없게 만듭니다 (프리스케일러가 1 인 타이머 1 ).
전위차계는 평소와 같이 접지와 5V 사이에 연결되며 와이퍼는 ADC0로 이동합니다.TCCR1B = (TCCR1B & 0b11111000) | 0b001
컨트롤러 :
1 kHz (Ts = 1e-3 s)의 속도로 업데이트되는 안티 와인딩 기능이있는 간단한 PID 컨트롤러를 사용하고 있습니다.
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);
}
}
7 비트 PWM 신호에 48을 추가했는데, 그 이유는 모터가 31 kHz에서 움직이기 시작한 다음 8 비트 수까지 확장 할 수 있기 때문입니다 analogWrite
.
내가 시도한 것 :
입력, 제어 신호, PID 컨트롤러의 미분 구성 요소에 EMA 필터를 추가하려고했지만 아무 소용이 없습니다. 또한 정지시 두 값 사이에서 플립되는 것을 방지하기 위해 히스테리시스 를 사용하여 아날로그 입력의 해상도를 낮추려고 시도 했습니다. 이것은 아무것도 영향을 미치지 않는 것 같습니다. 시간 단계를 10ms로 늘리는 것도 도움이되지 않는 것 같습니다.
또한 MATLAB에서 시스템 식별을 시도하고 Simulink에서이 비디오 시리즈를 따라 튜닝을 시도했습니다 . 91 %에 맞는 모델을 얻었지만 MATLAB 모델의 입력 및 출력 비선형 성을 처리하는 방법, PID 튜닝에 미치는 영향 및 Arduino에서 구현하는 방법을 몰랐습니다.
마지막으로 시도한 것은 두 개의 다른 컨트롤러를 만드는 것입니다. 하나는 기준 위치에서 큰 점프를위한 것이고 다른 하나는 램프를 추적 할 때 작은 오류를위한 것입니다. 점프 할 때 오버 슈트를 증가시키지 않고 추적 할 때 적분 계수를 증가시킬 수 있기 때문에 약간 도움이 될 것 같습니다.
그러나 적분 (및 비례) 게인을 증가시킴으로써 모터는 정지 상태 여야하고 기준이 변경되지 않더라도 항상 무언가를 수행합니다. (실제로 움직이지는 않지만 진동을 느낄 수 있습니다.)
사실상 1e-4보다 높을수록 파생물 이득이 더 적을 것으로 보이므로 실제로 0과 0의 차이를 느끼지 못합니다. 1e-4.
내 생각에 정적 마찰을 극복하기 위해 더 많은 힘이 필요하고, 동적 마찰이 적으므로 오버 슈트가 발생하여 모터를 뒤로 구동하여 다시 멈추게 한 다음 정적 마찰을 다시 극복해야합니다. 등
상용 컨트롤러는이 문제를 어떻게 극복합니까?
저의 배경 :
저는 전기 공학 학사 3 학년 때, 제어 이론, 디지털 신호 처리, LQR 제어 등의 과정을 밟았으므로 이론적 배경이 있지만 모든 이론을 적용하는 데 어려움을 겪고 있습니다. 이 실제 시스템.
편집 :
laptop2d가 권장하는 개방 루프 센서 측정을 테스트했으며 결과에 놀랐습니다. 높은 PWM 주파수에서는 판독 값에 심한 피크가 있습니다. 490Hz에서는 아무것도 없습니다.
그리고 이것은 일정한 듀티 사이클에 있으므로 모터가 방향을 매우 빠르게 반전시킬 때 어떤 종류의 소음이 발생하는지 상상할 수 없습니다.
따라서 컨트롤러에서 다시 작업하기 전에 노이즈를 필터링하는 방법을 찾아야합니다.
편집 2 :
지수 이동 평균 필터를 사용하여 노이즈를 필터링하기에 충분하지 않았습니다.
0.25, 0.50 및 0.75의 극으로 시도했습니다. 작은 극은 큰 영향을 미치지 않았고 큰 극은 대기 시간을 너무 많이 추가하여 게인을 낮추어 안정적으로 유지해야 전반적인 성능이 저하되었습니다.
전위차계 (와이퍼와 접지 사이)에 0.1 µF 커패시터를 추가했는데, 청소하는 것 같습니다.
현재로서는 충분히 작동합니다. 그동안 Tim Wescott이 게시 한 논문을 읽고 있습니다.
도와 주셔서 감사합니다.
This device is suitable for use in switching applications at frequencies up to 5 kHz.
그러나 3 페이지의 전기적 특성은 모든 지연을 합하면 최대 690kHz를 제안합니다. 개인적으로, 나는 그것보다 훨씬 느리게 갈 것이지만, 31kHz가 적당해야한다고 생각할 것입니다. 1 페이지의 메모에