상세 컨텐츠

본문 제목

서보 드라이버에서 실시간성 구현 방법

펌웨어 설계

by Zin9 2023. 1. 29. 19:34

본문

728x90

우리는 서보 드라이버를 개발하는 입장이다.

그렇다면 서보 드라이버에서 RTOS를 심거나 그와 비슷하게 기능을 구현해야 한다.

 

서보 드라이버에서 실시간성을 구현해야 하는 이유?
MCU 내부의 타이머 인터럽트를 사용하여 나름대로 실시간성을 구현해도 좋다.
그러나 까다롭게(?) 매 실행 주기를 일정하게 한다면, 제어 시스템의 정밀도는 더 높아질 것이다.

주기가 1[ms], 2[ms], 4[ms], 8[ms], ... 등 무엇이 되었던 간에 매 주기마다의 시간 간격은 거의 동일해야 한다.

동일하지 않다면, 동작은 하겠지만 제어 정밀도는 다소 떨어질 것이다.

 

목적은 하나이다.

 

위치 제어기로 전달되는 "목표 위치정보"는 매 주기마다 동일한 간격으로 전달되고, 관련 함수가 실행되어야 한다.

 

 

 

우리는 이산 시간계로 시스템을 구현할 것이기 때문에 일정한 시간 간격으로 제어 루프를 구동해야 한다.

 

그렇다면, 어떻게 시스템을 만들어야 할까?

2가지 방법이 있다.

 

  1. EtherCAT의 Sync0 인터럽트를 사용한다.
  2. RTOS의 태스크를 사용한다.

 

두 가지 방법은 상황에 따라 유용하게 사용하면 된다.

 

첫 번째 방법인 Sync0 인터럽트의 경우는 1개의 MCU가 1개의 서보 제어 루프를 실행할 때 사용하면 좋다.

굳이 RTOS 코드를 추가해서 복잡하게 사용할 필요가 없는 것이다.

Sync0 인터럽트는 EtherCAT 마스터에 의해 거의 일정한 1[ms] 주기로 전달된다.

실행 주기의 오차는 거의 1[us] 정도이니 거의 완벽한 RTOS 실행 주기라고 봐도 무방하다.

 

두 번째 방법은 다중 코어 시스템을 사용하는 경우에 유용할 것이다.

TMS320F28xxx MCU를 보면 외부 통신(EtherCAT 등)을 관장하는 코어가 있고, 메인 연산을 관장하는 CPU 코어가 있다.

이러한 경우에는 Sync0 인터럽트로 실시간성을 구현하기엔 다수 무리가 있다.

왜냐하면 코어 간 통신을 해야 하므로 실시간성을 지키기 어렵다.

따라서, CPU 코어에서 매 1[ms] 주기로 동작하는 태스크를 생성한 뒤, 태스크 실행 초기에 "코어 간 통신(IPC)"으로 매 1[ms]마다 전송된 PDO 데이터를 읽어와서 서보 제어 루프를 실행하도록 설계하는 편이 좋다.

 

이 밖에도 여러 방법이 있을 것이다.

무엇이 맞고 틀리다는 없다.

이러한 방법도 있구나 라는 걸 배우는 것이 중요하다.

 

728x90

관련글 더보기