딸깍 소리로 확인한 충전기 출력 — SC6_0 릴레이와 DOUT 시험
소프트웨어 방향을 고민하는 사이에 하드웨어 시험도 이어 갔다. 오늘은 충전기의 출력 쪽이다. 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 리셋)
눈여겨볼 점이 두 가지다.
- TPS3813은 윈도 워치독이다. 신호가 너무 늦게 와도 리셋하지만, 너무 빨리 와도 리셋한다. 그래서 정해진 시간 창 안에서 킥을 줘야 한다. 정확한 시간은 C90(10nF)과 WDR 설정에 따라 데이터시트로 계산해야 한다.
- 리셋 출력이 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를 쓸 때 “이 핀이 우리 보드에서는 뭐지?”를 끝까지 따라가야 하는 이유를 또 한 번 확인했다.
댓글남기기