로봇 액추에이터 펌웨어 구조
📌 개요
- 펌웨어(Firmware) = 하드웨어에 밀착되어 비휘발성 메모리(플래시)에 상주하는 소프트웨어
- 액추에이터 제어기 펌웨어의 존재 이유 = 캐스케이드 제어 루프를 MCU의 제약 안에서 정확한 주기로 실행하는 것
- 출제 포인트: 계층 구조(HAL의 목적), 실행 구조 3유형(슈퍼루프·인터럽트 기반·RTOS), 제어 주기별 태스크와 인터럽트 우선순위, 부트로더의 역할
📖 핵심 개념
펌웨어의 계층 구조 — 레이어로 나누는 이유
잘 만든 펌웨어는 하드웨어 의존 부분과 논리 부분을 계층(Layer)으로 분리한다.
-
① 하드웨어 추상화 계층(HAL, Hardware Abstraction Layer) / 디바이스 드라이버: 레지스터 조작을 함수로 감싼 최하층.
pwm_set_duty(0.5)처럼 하드웨어 세부를 감춘 인터페이스를 위층에 제공한다 -
② 미들웨어 계층: 통신 프로토콜 스택(CAN 등), 필터·수학 라이브러리, (사용 시) RTOS
-
③ 응용 계층(Application): 제어 알고리즘(PID·프로파일 처리), 상태 머신, 보호 로직 — 이 제품을 "액추에이터 제어기"로 만드는 본질적 로직
-
계층화의 최대 이점 = 이식성(Portability)·유지보수성
- MCU를 다른 칩으로 바꿔도 HAL만 다시 작성하면 응용 계층은 그대로 재사용
- 각 층을 독립적으로 시험 가능 (모듈화 일반론은 모듈화 프로그래밍)
실행 구조의 3가지 유형
펌웨어 전체가 어떤 뼈대 위에서 돌아가는가에 따라 세 유형으로 나뉜다.
① 슈퍼루프(Super Loop, 베어메탈)
int main(void) {
init_hw(); // 초기화
while (1) { // 무한 루프
read_inputs();
process();
write_outputs();
}
}
- 초기화 후 무한 루프에서 일을 순차 반복하는 가장 단순한 구조
- 이해·예측이 쉽고 오버헤드가 없음
- 단, 한 작업이 길어지면 전체가 밀리고, 작업이 늘수록 타이밍 관리가 어려워짐
- 소규모 장치에 적합
② 전경/배경 시스템(Foreground/Background) — 인터럽트 기반
- 시간이 중요한 일(제어 루프)은 타이머 인터럽트의 ISR(전경) 에서 처리
- 급하지 않은 일(통신 파싱, 모니터링)은 메인 루프(배경) 에서 처리
- 슈퍼루프의 단순함을 유지하면서 실시간성 확보 → 단축 액추에이터 제어기의 가장 일반적인 구조
③ RTOS 기반(Real-Time Operating System)
- 일을 태스크(Task) 로 나누고 스케줄러가 우선순위 기반 선점형(Preemptive) 으로 CPU를 배분
- 높은 우선순위 태스크가 준비되면 낮은 태스크를 즉시 중단(선점)·실행 → 급한 일의 데드라인 보장
- 태스크 간 통신(큐·세마포어) 등 관리 도구를 제공, 단 오버헤드·복잡도(우선순위 역전 등) 수반
- 통신·다축 협조 등 일이 많고 복잡한 제어기에 적합 (상세: 로봇 소프트웨어 운영체제)
제어 주기의 구현 — 시간 축으로 본 구조
캐스케이드 루프의 주기 차이는 펌웨어에서 주기가 다른 태스크(또는 ISR)의 계층으로 나타난다. 전형적인 구성:
| 주기 (예) | 담당 | 하는 일 |
|---|---|---|
| 10~20 kHz | 고속 ISR (PWM/ADC 동기) | 전류 샘플링, 전류 루프, PWM 갱신, 과전류 감시 |
| 1~5 kHz | 중속 ISR/태스크 | 속도 계산, 속도 루프 |
| 0.1~1 kHz | 태스크 | 위치 루프, 프로파일 보간 |
| 10~100 Hz | 배경 태스크 | 통신 응답, 상태 보고, 온도 감시 |
전류는 PWM 스위칭에 맞춰 출렁이므로, PWM 주기의 정해진 시점에 ADC를 트리거해 읽어야 깨끗한 평균 전류를 얻는다. 그래서 전류 제어 ISR은 PWM 하드웨어 이벤트에 묶는다 — 하드웨어와 소프트웨어가 맞물린 대표적 지점이다.
- 인터럽트 우선순위 = 주기가 짧고 급한 것부터: 전류(+보호) > 속도 > 위치 > 통신 > 배경
- 우선순위가 높은 ISR은 낮은 ISR을 중단시키고 실행 (중첩 인터럽트)
메모리 구조와 부트로더
플래시 메모리는 보통 두 영역으로 나눈다.
- 부트로더(Bootloader) 영역: 전원 인가 시 가장 먼저 실행되는 작은 프로그램. 애플리케이션의 유효성을 확인한 후 실행을 넘기며, 통신(CAN·UART)으로 새 펌웨어를 받아 애플리케이션 영역을 다시 쓰는 펌웨어 업데이트 기능을 담당한다 — 로봇을 분해해 디버거를 꽂지 않고도 현장에서 업데이트할 수 있게 하는 장치
- 애플리케이션 영역: 실제 제어 펌웨어
- 파라미터 영역(EEPROM/플래시 일부): 제어 게인, 리미트, 엔코더 오프셋 등 전원이 꺼져도 유지되어야 하는 설정값을 저장 (손상 감지용 체크섬과 함께)
상태 머신 — 펌웨어의 동작 골격
- 제어기는 항상 "지금 어떤 상태인가"를 명확히 하고, 상태에 따라 허용되는 동작만 수행
- 전형적 상태: 초기화 → 대기(서보 OFF) → 운전(서보 ON) → 오류(Fault)
- 상태 머신(State Machine)으로 설계하면 "오류 상태에서는 토크 지령을 받지 않는다" 같은 규칙이 구조적으로 보장
- 설계 방법은 로봇 액추에이터 펌웨어 설계에서 다룸
📊 다이어그램 · 수식
펌웨어 계층 구조
flowchart TD
subgraph APP["응용 계층"]
SM["상태 머신·보호 로직"]
CTRL["제어 알고리즘
(캐스케이드 PID·프로파일)"]
end
subgraph MID["미들웨어 계층"]
COM["통신 스택 (CAN 등)"]
LIB["필터·수학 라이브러리 / RTOS"]
end
subgraph HAL["하드웨어 추상화 계층 (HAL·드라이버)"]
D1["PWM"]
D2["ADC"]
D3["엔코더"]
D4["통신 컨트롤러"]
end
HW["MCU 하드웨어 (레지스터)"]
APP --> MID --> HAL --> HW주기 태스크와 인터럽트 우선순위
flowchart LR
subgraph FG["전경 (ISR, 우선순위 높음 → 낮음)"]
T1["전류 루프 ISR
10~20 kHz (PWM 동기)"]
T2["속도 루프
1~5 kHz"]
T3["위치 루프
0.1~1 kHz"]
end
subgraph BG["배경 (메인 루프)"]
T4["통신 처리·상태 보고
온도 감시·로깅"]
end
T1 --> T2 --> T3 -.-> T4🎯 핵심 요약 · 암기 포인트
✏️ 예상문제
1. 펌웨어에서 하드웨어 추상화 계층(HAL)을 두는 주된 목적은?
① 실행 속도를 높이기 위해 ② 하드웨어 세부를 감춰 상위 계층의 이식성과 유지보수성을 높이기 위해 ③ 메모리 사용량을 줄이기 위해 ④ 인터럽트 응답 시간을 줄이기 위해
정답 및 해설
정답: ② HAL은 레지스터 수준의 조작을 함수 인터페이스로 감싼다. 하드웨어가 바뀌어도 HAL만 다시 쓰면 제어 알고리즘 등 상위 계층을 그대로 재사용할 수 있다. 추상화는 오히려 약간의 오버헤드를 수반하므로 ①④는 목적이 아니다.
2. 슈퍼루프(super loop) 구조의 설명으로 옳지 않은 것은?
① 초기화 후 무한 루프에서 작업을 순차적으로 반복한다 ② 구조가 단순해 동작 예측이 쉽다 ③ 우선순위 기반 선점형 스케줄러가 태스크를 관리한다 ④ 한 작업의 처리가 길어지면 다른 작업이 지연된다
정답 및 해설
정답: ③ 선점형 스케줄러와 태스크는 RTOS 기반 구조의 특징이다. 슈퍼루프는 스케줄러 없이 루프가 도는 순서대로 처리하므로, 긴 작업 하나가 전체 타이밍을 무너뜨릴 수 있다.
3. 액추에이터 제어 펌웨어에서 인터럽트 우선순위를 가장 높게 부여해야 하는 것은?
① 통신 명령 수신 처리 ② 상태 모니터링 전송 ③ 전류 제어 및 과전류 보호 루틴 ④ 위치 프로파일 보간
정답 및 해설
정답: ③ 전류 루프는 주기가 가장 짧고(수십 µs~), 과전류 보호는 소자 파손·안전과 직결되는 하드 실시간 작업이다. 주기가 짧고 치명도가 높을수록 우선순위를 높게 둔다.
4. 부트로더(bootloader)의 역할로 가장 적절한 것은?
① 제어 루프의 주기를 생성한다 ② 전원 인가 시 애플리케이션을 검증·실행하고, 통신을 통한 펌웨어 업데이트를 수행한다 ③ 모터의 초기 위치를 탐색한다 ④ 제어 게인을 자동으로 튜닝한다
정답 및 해설
정답: ② 부트로더는 플래시의 독립 영역에 상주하는 작은 프로그램으로, 리셋 직후 가장 먼저 실행된다. 애플리케이션이 유효하면 실행을 넘기고, 업데이트 요청이 있으면 통신으로 새 펌웨어를 받아 애플리케이션 영역을 다시 쓴다. 덕분에 장비를 분해하지 않고 현장 업데이트가 가능하다.
5. 전류 제어 루틴을 PWM 캐리어 주기에 동기된 ADC 트리거로 실행하는 이유는?
① 통신 프로토콜과 시각을 맞추기 위해 ② 스위칭에 따라 맥동하는 전류를 정해진 시점에 샘플링해 정확한 값을 얻기 위해 ③ 플래시 메모리 수명을 늘리기 위해 ④ 부트로더와의 충돌을 피하기 위해
정답 및 해설
정답: ② 모터 전류는 PWM ON/OFF에 맞춰 리플이 생긴다. 아무 때나 읽으면 리플의 꼭대기·바닥이 섞여 값이 튀므로, PWM 주기 중 일정한 시점(예: 캐리어 중앙)에 ADC를 하드웨어 트리거해 평균에 해당하는 전류를 얻는다.
🔗 관련 노트
- 임베디드 프로그래밍 특성 — 이 구조의 전제가 되는 MCU·실시간 특성
- 로봇 액추에이터 펌웨어 설계 — 이 구조를 실제로 설계하는 절차
- 액추에이터 제어구조 설계 — 주기 태스크로 구현되는 제어 루프
- 로봇 소프트웨어 운영체제 — RTOS 스케줄링 상세
- 모듈화 프로그래밍 — 계층화·모듈화의 일반 원칙
- _MOC 모션소프트웨어