4 분 소요

소프트웨어 방향을 고민하는 사이에 하드웨어 시험도 이어 갔다. 오늘은 충전기의 출력 쪽이다. CP로 차와 대화가 끝나면, 결국 릴레이가 붙어야 차에 전기가 간다. 그 릴레이를 리눅스에서 움직일 수 있는지 확인했다.


1. 어떤 핀이 어떤 릴레이를 움직이나

DTS에는 B_AC_ON(PE11)과 C_AC_ON(PB8)이 PWM으로 잡혀 있었다. 이름만으로는 무엇을 켜는지 모른다. 넷리스트를 따라갔다.

PB8  (C_AC_ON, TIM4_CH3) ─R126─┬─ Q4 게이트 ── Q4 → K1 코일 (+12V) ── LD24
                               └─ R125 10kΩ → GND
PE11 (B_AC_ON, TIM1_CH2) ─R129─┬─ Q3 게이트 ── Q3 → K2 코일 (+12V) ── LD23
                               └─ R128 10kΩ → GND

Q3, Q4는 N채널 MOSFET(IRLML6244)이다. 핀이 High면 MOSFET이 켜지고, +12V에서 릴레이 코일로 전류가 흐른다. 코일마다 표시 LED가 달려 있다.

릴레이의 접점은 이렇게 연결돼 있었다.

릴레이 부품 접점 정체
K1 HF170F (2극 대전류) AC_LI → AC_LO, AC_NI → AC_NO 충전 출력 주 릴레이 (L, N 두 선을 동시에)
K2 APAN3112 (1극 소형) AC_LI → J16 1번 보조 출력. 용도는 설계자 확인 필요

K1이 차로 가는 220V를 붙이고 떼는 주인공이다.

게이트의 10kΩ

두 MOSFET 게이트에는 10kΩ 풀다운이 있다. 부팅 중처럼 핀이 아무것도 출력하지 않을 때도 게이트가 GND로 당겨져서 릴레이가 꺼진 상태로 유지된다. 충전기에서는 당연히 있어야 할 부품이다.

U-Boot를 고친 게 여기서도 의미가 있었다

PB8은 MYiR 평가보드에서 LCD 백라이트 핀이었다. 9월에 U-Boot의 LTDC·패널·백라이트를 끈 건 PH12/14/15 입력 충돌 때문이었다. 그런데 원래 U-Boot는 부팅 중에 백라이트, 즉 PB8을 켰다. 그대로 두었다면 부팅할 때마다 충전 출력 주 릴레이가 붙었을 수 있다. 다른 이유로 한 수정이 여기서도 사고를 막고 있었다.


2. PWM 장치 찾기

root@myir:~# ls -l /sys/class/pwm/
pwmchip0  -> .../40000000.timer/...   (TIM2)
pwmchip12 -> .../44001000.timer/...   (TIM8)
pwmchip4  -> .../40002000.timer/...   (TIM4)
pwmchip8  -> .../44000000.timer/...   (TIM1)
장치 타이머 연결 채널
pwmchip0 TIM2 CP pwm0 (CH1)
pwmchip4 TIM4 K1 주 릴레이 pwm2 (CH3)
pwmchip8 TIM1 K2 보조 릴레이 pwm1 (CH2)
pwmchip12 TIM8 외부 워치독 pwm3 (CH4)

번호가 0, 4, 8, 12로 띄엄띄엄인 건 타이머 하나가 채널 4개만큼 번호를 차지하기 때문이다. 채널 번호는 0부터 세니까 CH3은 pwm2다.


3. 시험 — AC를 빼고

K1을 켜면 충전 출력 단자에 220V가 나간다. 그래서 AC 입력을 빼고 12V만 넣은 상태에서 딸깍 소리와 LED로 확인했다.

# K2 (보조)
echo 1 > /sys/class/pwm/pwmchip8/export
echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/period
echo 1000000 > /sys/class/pwm/pwmchip8/pwm1/duty_cycle   # 100%
echo 1 > /sys/class/pwm/pwmchip8/pwm1/enable              # 딸깍 + LD23
echo 0 > /sys/class/pwm/pwmchip8/pwm1/enable

# K1 (주)
echo 2 > /sys/class/pwm/pwmchip4/export
echo 1000000 > /sys/class/pwm/pwmchip4/pwm2/period
echo 1000000 > /sys/class/pwm/pwmchip4/pwm2/duty_cycle
echo 1 > /sys/class/pwm/pwmchip4/pwm2/enable              # 딸깍 + LD24
echo 0 > /sys/class/pwm/pwmchip4/pwm2/enable

둘 다 딸깍 소리가 나고 LED가 켜졌다. 핀 → MOSFET → 코일 → 릴레이 전체가 동작한다.

핀 상태도 확인했다.

pin 24 (PB8): alternate 2 (TIM4_CH3) - push pull - floating - low speed
pin 75 (PE11): alternate 1 (TIM1_CH2) - push pull - pull down - low speed

둘 다 타이머 출력 모드다. 내부 저항이 다른 건 PE11은 우리 pinctrl 설정(풀다운)을, PB8은 MYiR 원본 설정(bias-disable)을 쓰기 때문이다. 외부 10kΩ 풀다운이 있어서 동작에는 차이가 없다. 일관성을 위해 나중에 PB8도 우리 설정으로 옮길 생각이다.

왜 GPIO가 아니라 PWM일까

K1 같은 대전류 릴레이는 코일 전력이 크다. 붙일 때만 100%로 주고, 붙은 뒤에는 듀티를 낮춰 유지 전력과 발열을 줄이는 방식(이코노마이저)을 흔히 쓴다. 설계자가 PWM 핀을 고른 이유로 보인다. 유지 듀티를 몇 %까지 낮출 수 있는지는 HF170F 데이터시트로 정해야 하고, 충전 제어 프로그램에서 쓸 값이다.


4. DOUT1~4 — LED 드라이버로 등록돼 있다

디지털 출력 네 개는 ULN2803 달링턴 드라이버를 거친다.

DOUT1 PG10 → U17 I4 → O4 ─ J13 2번 (OUT1) ─ LD19
DOUT2 PG12 → U17 I5 → O5 ─ J13 3번 (OUT2) ─ LD20
DOUT3 PI9  → U17 I6 → O6 ─ J13 4번 (OUT3) ─ LD21
DOUT4 PI1  → U17 I7 → O7 ─ J13 5번 (OUT4) ─ LD22
                            J13 1번 = +12V

ULN2803은 입력이 High면 출력을 GND로 당긴다(싱크). 부하는 J13 1번(+12V)과 OUTn 사이에 단다.

“그냥 GPIO 켜고 끄는 거지?”라고 생각했는데, 반만 맞았다. 브링업 때 편하려고 DTS에서 gpio-leds로 등록해 두었다. 커널이 핀을 쥐고 있으니 gpioset은 Device or resource busy가 나고, LED 경로로 켜고 끈다.

echo 1 > /sys/class/leds/dout1/brightness    # LD19 켜짐
echo 0 > /sys/class/leds/dout1/brightness    # 꺼짐

네 개 모두 번호에 맞는 LED가 켜지고 꺼졌다. 나중에 충전 프로그램에서 직접 제어하려면 DTS의 dout 항목을 지우고 일반 GPIO로 쓰면 된다.


5. 다음: 외부 워치독

다음 시험 대상의 회로도 미리 확인해 두었다.

PI2 (PWM_WDI, TIM8_CH4) ─┬─ U10 WDI   (TPS3813K33, 윈도 워치독)
                         └─ R85 10kΩ → GND
U10 WDT ─ C90 10nF        (타임아웃 설정)
U10 WDR ─ GND             (윈도 비율 설정)
U10 /RESET ─ /WRST ─ SW1 4번 ─ NRST (MPU 리셋)

눈여겨볼 점이 두 가지다.

  1. TPS3813은 윈도 워치독이다. 신호가 너무 늦게 와도 리셋하지만, 너무 빨리 와도 리셋한다. 그래서 정해진 시간 창 안에서 킥을 줘야 한다. 정확한 시간은 C90(10nF)과 WDR 설정에 따라 데이터시트로 계산해야 한다.
  2. 리셋 출력이 DIP 스위치(SW1의 4번)를 거쳐 MPU 리셋에 연결된다. SW1의 1~3번은 부트 모드(BOOT0~2) 스위치다. 지금 아무도 워치독에 킥을 주지 않는데 보드가 멀쩡히 돌고 있으니, 4번은 꺼져 있을 가능성이 높다. 개발 중에는 꺼 두고, 시험할 때만 켜면 된다.

정리

항목 제어 결과
K1 충전 출력 주 릴레이 (HF170F) pwmchip4/pwm2 (PB8, TIM4_CH3) ✔ 딸깍 + LD24
K2 보조 릴레이 (APAN3112) pwmchip8/pwm1 (PE11, TIM1_CH2) ✔ 딸깍 + LD23
DOUT1~4 (ULN2803) /sys/class/leds/dout1..4 ✔ LD19~22 켜고 끄기
외부 워치독 (TPS3813) pwmchip12/pwm3 (PI2) 회로 확인, 시험은 다음

남은 것도 적어 둔다.

항목 필요한 것
릴레이 접점 통전 확인 멀티미터 (AC 없이)
K1 유지 듀티 HF170F 데이터시트
출력 감지 (B_AC_IN, C_AC_IN) — 릴레이 용착 감지 용도로 추정 AC 인가
K2 용도 (J16) 설계자 확인
워치독 킥 주기 TPS3813 데이터시트, SW1 4번 상태

이름이 C_AC_ON인 핀 하나를 따라가 보니 충전 출력 주 릴레이였고, 그 핀은 한때 LCD 백라이트였다. 같은 핀이 평가보드에서는 화면을 밝히고, 우리 보드에서는 차에 전기를 보낸다. 벤더 BSP를 쓸 때 “이 핀이 우리 보드에서는 뭐지?”를 끝까지 따라가야 하는 이유를 또 한 번 확인했다.

댓글남기기