모터 페이더 PID 제어


15

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. PWM 속도

내가 시도한 것 :
입력, 제어 신호, PID 컨트롤러의 미분 구성 요소에 EMA 필터를 추가하려고했지만 아무 소용이 없습니다. 또한 정지시 두 값 사이에서 플립되는 것을 방지하기 위해 히스테리시스 를 사용하여 아날로그 입력의 해상도를 낮추려고 시도 했습니다. 이것은 아무것도 영향을 미치지 않는 것 같습니다. 시간 단계를 10ms로 늘리는 것도 도움이되지 않는 것 같습니다.

또한 MATLAB에서 시스템 식별을 시도하고 Simulink에서이 비디오 시리즈를 따라 튜닝을 시도했습니다 . 91 %에 맞는 모델을 얻었지만 MATLAB 모델의 입력 및 출력 비선형 성을 처리하는 방법, PID 튜닝에 미치는 영향 및 Arduino에서 구현하는 방법을 몰랐습니다.

마지막으로 시도한 것은 두 개의 다른 컨트롤러를 만드는 것입니다. 하나는 기준 위치에서 큰 점프를위한 것이고 다른 하나는 램프를 추적 할 때 작은 오류를위한 것입니다. 점프 할 때 오버 슈트를 증가시키지 않고 추적 할 때 적분 계수를 증가시킬 수 있기 때문에 약간 도움이 될 것 같습니다.
그러나 적분 (및 비례) 게인을 증가시킴으로써 모터는 정지 상태 여야하고 기준이 변경되지 않더라도 항상 무언가를 수행합니다. (실제로 움직이지는 않지만 진동을 느낄 수 있습니다.)
사실상 1e-4보다 높을수록 파생물 이득이 더 적을 것으로 보이므로 실제로 0과 0의 차이를 느끼지 못합니다. 1e-4.

내 생각에 정적 마찰을 극복하기 위해 더 많은 힘이 필요하고, 동적 마찰이 적으므로 오버 슈트가 발생하여 모터를 뒤로 구동하여 다시 멈추게 한 다음 정적 마찰을 다시 극복해야합니다. 등

상용 컨트롤러는이 문제를 어떻게 극복합니까?

저의 배경 :
저는 전기 공학 학사 3 학년 때, 제어 이론, 디지털 신호 처리, LQR 제어 등의 과정을 밟았으므로 이론적 배경이 있지만 모든 이론을 적용하는 데 어려움을 겪고 있습니다. 이 실제 시스템.


편집 :
laptop2d가 권장하는 개방 루프 센서 측정을 테스트했으며 결과에 놀랐습니다. 높은 PWM 주파수에서는 판독 값에 심한 피크가 있습니다. 490Hz에서는 아무것도 없습니다.
그리고 이것은 일정한 듀티 사이클에 있으므로 모터가 방향을 매우 빠르게 반전시킬 때 어떤 종류의 소음이 발생하는지 상상할 수 없습니다.

여기에 이미지 설명을 입력하십시오

따라서 컨트롤러에서 다시 작업하기 전에 노이즈를 필터링하는 방법을 찾아야합니다.

편집 2 :
지수 이동 평균 필터를 사용하여 노이즈를 필터링하기에 충분하지 않았습니다.

EMA

0.25, 0.50 및 0.75의 극으로 시도했습니다. 작은 극은 큰 영향을 미치지 않았고 큰 극은 대기 시간을 너무 많이 추가하여 게인을 낮추어 안정적으로 유지해야 전반적인 성능이 저하되었습니다.

전위차계 (와이퍼와 접지 사이)에 0.1 µF 커패시터를 추가했는데, 청소하는 것 같습니다.

현재로서는 충분히 작동합니다. 그동안 Tim Wescott이 게시 한 논문을 읽고 있습니다.
도와 주셔서 감사합니다.


31KHz PWM을 정확하게 제어 할 수 있습니까?
Hasan alattar

@Hasanalattar : 아니요, 사용할 수있는 주파수는 두 번째 그래프 (1, 8, 64, 256, 1024의 프리스케일러)에 있습니다. 4 kHz와 500 Hz는 들리므로 귀찮은 경고음이 나므로 피하고 싶습니다. 31kHz, 120Hz 및 30Hz가 남습니다. 후자의 두 개는 너무 느립니다. PWM 해상도는 8 비트이지만 제어 신호가 7 비트에 불과하고 96보다 높은 PWM 값만 사용하기 때문에 사용량이 적습니다.
tttapa

1
연결 한 H 브리지는 데이터 시트의 첫 페이지에 있습니다. This device is suitable for use in switching applications at frequencies up to 5 kHz. 그러나 3 페이지의 전기적 특성은 모든 지연을 합하면 최대 690kHz를 제안합니다. 개인적으로, 나는 그것보다 훨씬 느리게 갈 것이지만, 31kHz가 적당해야한다고 생각할 것입니다. 1 페이지의 메모에
맞지 않았다면

그러나 이는 고정 듀티 사이클을 가정합니다. 그래서 너비, 높고 낮은 듀티 사이클이 매우 좁은 펄스를 생성 할 수 있습니다 - (당신은 비대칭의 알 수 있습니다 또는 "그냥 흔들어"절대 최대 주파수 듀티 사이클을 "상관 없어") 받는 비교 3 페이지 하단?
AaronD

1
그것이 문제인지 확실하지 않지만 타임 스탬프가 다를 수 있다면 오류뿐만 아니라 적분에 error * Ts를 추가하고 적분에 Ts를 곱하지 말아야한다고 생각합니다. (Ts가 항상 상수라면 문제가되지 않습니다)
user253751

답변:


9

제어 시스템은 센서만큼 우수하며 센서 개방 루프를 실행하고 제어 입력을 제거하십시오. 센서에 자신의 입력을 생성하고 센서가 아닌지 확인하기 위해 위치 데이터를 가져 오는 동안 천천히 밀어 넣거나 천천히 밀어 넣는 방법을 찾으십시오. 센서에 노이즈가있는 경우 새 센서를 가져 오거나 병렬로 연결하거나 센서 의 출력을 필터링하여 센서 성능을 개선하십시오 . 더 높은 해상도의 센서가 필요할 수 있습니다.

센서에 소음이 없으면 다른 제어 루프가 필요합니다. PID는 1 차 시스템이며 실제로 속도 제어에는 적합하지 않습니다.


고맙습니다. 실제로 PWM 주파수가 높을수록 많은 노이즈가 발생하므로이를 개선 할 방법을 찾아야합니다. 그렇게하는 방법에 대한 조언이 있습니까?
tttapa

기계식 또는 디지털 필터를 사용하십시오. 그렇게 할 수 없다면 병렬 센서가 좋을 것입니다. meta.stackexchange.com/questions/126180/…
전압 스파이크

6

문제는 마찰에 의한 것, 또는 마찰과 백래쉬의 조합으로 인한 것입니다. 다양한 펄스 폭에 대한 평균 속도 대 듀티 사이클의 플롯은 마찰이있는 시스템의 특징입니다. 이 백서 에는 현재보고있는 내용 설명되어 있으며 문제를 해결하기 위해 영원히 사용 된 솔루션에 대한 개요가 있습니다. 엔지니어링 커리큘럼에서는 분석하기 어렵 기 때문에이를 보지 못할 것입니다. 당신은 기본적으로 그들이 작동하도록 그들을 사례별로 바이올린을해야합니다.

상용 솔루션이 무엇인지 모르겠지만 다양한 솔루션이 있다고 생각합니다. PID 컨트롤러에서 모터 드라이브 신호가 임계 값 아래로 떨어질 때 (귀하의 경우 60 ~ 70 카운트) 모터 드라이브를 임계 값으로 펄싱하기 시작합니다. 평균 드라이브를 PID 출력과 동일하게 만드는 사이클. 나는 일반적으로 sigma-delta-ish 모듈레이터를 사용합니다. 왜냐하면 매우 적은 수의 라인으로 구현할 수 있기 때문입니다.


4

대부분의 노이즈가 PWM 드라이브 신호에서 발생하는 것 같습니다.

ADC 캡처를 PWM 사이클과 동기화하려고 했습니까? 대부분의 마이크로 컨트롤러에는 타이머에서 ADC 캡처를 트리거 할 수있는 방법이 있으므로 항상 사이클의 동일한 지점에서 트리거 할 수 있습니다.

가장 낮은 노이즈의 경우, 모터의 전원을 켜기 직전에 최적의 샘플링 위치가 될 것입니다. 그 이유는 스파이크가 가장 오래 걸리기 때문입니다. 그러나 위치가 어떻든 캡처의 동기화는 PWM 사이클의 동일한 지점에서 오프셋의 양이 거의 동일하게 유지되므로 스파이크가 줄어 듭니다.


3

따라서 컨트롤러에서 다시 작업하기 전에 노이즈를 필터링하는 방법을 찾아야합니다.

다음과 같은 코드로 센서 노이즈 (또는 기타 노이즈 측정 / 변수)를 코드로 필터링 할 수 있습니다 (로우 패스 필터링).

에스거르는[케이]=α에스거르는[케이1]+(1α)에스노골적인[케이]

0<<α1


나는 그것을 시도했지만 피크를 제거하기에 충분하지 않으며 너무 많은 지연을 추가합니다.
tttapa 2019

@tttapa 알겠습니다. 어떤 알파 값을 사용해 보셨습니까? (0.8,0.9) 이미 조정했을 수도 있습니다.
Big6

내가 시도한 EMA 필터 플롯을 추가하기 위해 원래 게시물을 업데이트했습니다. 나는 0.9도 시도했지만 0.75보다 훨씬 나빴습니다. 지연으로 인해 이득이 훨씬 낮아야합니다. ADC 노이즈를 정리하기 위해 제한된 EMA를 사용할 것이라고 생각하지만 지금은 커패시터로 충분합니다.
tttapa 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.