본문으로 건너뛰기

frame sync pwm 설정

지금 이미지의 설정 방법 — AVS_FSYNC_HZ 한 줄​

2026-09-02 이후 출하 이미지

AVS200 · AVS300 출하 이미지에는 avs-camera-fsync 서비스가 들어 있습니다. sysfs 를 직접 만지거나 서비스 파일을 고칠 필요가 없습니다.

# 1) 주파수를 바꿉니다
sudo sed -i 's/^AVS_FSYNC_HZ=.*/AVS_FSYNC_HZ=20/' /etc/default/avs-camera-fsync

# 2) 적용 (재부팅 불필요)
sudo systemctl restart avs-camera-fsync.service
systemctl status avs-camera-fsync.service

# 3) 확인 — 🔴 판정은 period 로 합니다 (아래 설명)
grep . /sys/class/pwm/pwmchip*/pwm0/{period,duty_cycle,enable}

5점 실측 (AVS200 32G · R36.4.4 · Sensing ISX031, 2026-09-10):

AVS_FSYNC_HZperiodduty_cycle캡처 fps
3033,333,33316,666,66630.00
2540,000,00016,666,66625.00
2050,000,00016,666,66620.02
1566,666,66616,666,66615.00
10100,000,00016,666,66610.00

🔴 duty_cycle 은 전 구간 16,666,666 으로 고정됩니다 — HIGH 상한(33.3ms, ISX031 은 트리거를 레벨로 읽습니다)에 걸려 30Hz 이하에서는 항상 클램프되기 때문입니다. ⇒ duty 값으로 주파수를 판정하지 마세요. period 를 보세요.

어느 PWM 이 실배선인가 — 칩 번호는 커널·제품마다 재번호되므로 물리주소로 역인덱싱합니다.

제품실배선 PWM
AVS20032f0000.pwm
AVS300810c600000.pwm
for c in /sys/class/pwm/pwmchip*; do echo "$c -> $(readlink -f $c/device | xargs basename)"; done
이 서비스가 없는 보드라면

ls /etc/default/avs-camera-fsync 가 비면 그 이전 출하분입니다. 아래 제품별 절(레거시)을 보세요.

:::

아래 pwm_autorun 절차는 지금 이미지에서 동작하지 않습니다

pwm_autorun.service 와 /etc/pwm_autorun_service/ 는 베이킹이 적극적으로 삭제합니다 (구·신 스크립트가 같은 PWM 을 잡아 충돌하기 때문입니다). 실행하면 No such file · Unit pwm_autorun.service could not be found 를 봅니다. 이전 출하분을 위해서만 남겨 둡니다.

avs100​

  • avs100의 framesync는 pwmchip2을 사용합니다.
  • HZ에 원하는 주파수를 입력하면 됩니다.
BASE_PATH=/sys/class/pwm/pwmchip2
HZ=30

PERIOD=$((1000000000/$HZ))
DUTY=$(($PERIOD/2))

if [[ ! -d $BASE_PATH/pwm0 ]]; then
echo 0 > $BASE_PATH/export
sleep 1
fi

echo 0 > $BASE_PATH/pwm0/enable
echo $PERIOD > $BASE_PATH/pwm0/period
echo $DUTY > $BASE_PATH/pwm0/duty_cycle

echo 1 > $BASE_PATH/pwm0/enable

avs101​

  • avs101의 framesync는 i2c 7 bus에 연결된 Micom pwm generator를 이용합니다.
HZ=30

i2cset -y 7 0x44 1 $HZ

avs200​

  • avs200의 framesync는 pwmchip3을 사용합니다.
  • HZ에 원하는 주파수를 입력하면 됩니다.
BASE_PATH=/sys/class/pwm/pwmchip3
HZ=30

PERIOD=$((1000000000/$HZ))
DUTY=$(($PERIOD/2))

if [[ ! -d $BASE_PATH/pwm0 ]]; then
echo 0 > $BASE_PATH/export
sleep 1
fi

echo 0 > $BASE_PATH/pwm0/enable
echo $PERIOD > $BASE_PATH/pwm0/period
echo $DUTY > $BASE_PATH/pwm0/duty_cycle

echo 1 > $BASE_PATH/pwm0/enable

부팅 시 PWM 설정 자동화 — 레거시​

⚠️ 지금 이미지는 문서 맨 위의 AVS_FSYNC_HZ 를 씁니다. 아래는 그 이전 출하분용입니다.

  • /etc/systemd/system/pwm-framesync.service 파일을 수정 후, 재 부팅 하면적용됩니다.
  • 'pwm_autorun.sh 30' 부분을 원하는 주파수(HZ)로 수정하면 됩니다.
[Unit]
Description=auto run avs200 pwm daemon

[Service]
Type=simple
ExecStart= /etc/pwm_autorun_service/pwm_autorun.sh 30
ExecStop= /etc/pwm_autorun_service/pwm_autorun_stop.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

avs300​

  • avs300(AGX Thor)의 framesync는 pwmchip2를 사용합니다. 칩 번호가 아니라 주소로 확인하십시오.
readlink /sys/class/pwm/pwmchip2/device
# 출력: ../../../810c600000.pwm ← 이 주소가 카메라 fsync 입니다
  • HZ에 원하는 주파수를 입력하면 됩니다. duty(HIGH 폭)는 16.67ms로 고정하고 period만 바꿉니다. ISX031 카메라는 트리거가 HIGH인 동안 33.3ms마다 캡처하므로, HIGH 폭이 33.3ms를 넘으면 주기당 2장이 찍힙니다(50% duty를 10Hz에 쓰면 20fps가 나오는 이유).
BASE_PATH=/sys/class/pwm/pwmchip2
HZ=30

PERIOD=$((1000000000/$HZ))
DUTY=16666666 # HIGH 16.67ms 고정 (5~30Hz 전 구간에서 1장/주기)

if [[ ! -d $BASE_PATH/pwm0 ]]; then
echo 0 > $BASE_PATH/export
sleep 1
fi

echo 0 > $BASE_PATH/pwm0/enable
echo 0 > $BASE_PATH/pwm0/duty_cycle # period를 줄일 때 duty>period 오류를 피하기 위해 먼저 0
echo $PERIOD > $BASE_PATH/pwm0/period
echo $DUTY > $BASE_PATH/pwm0/duty_cycle

echo 1 > $BASE_PATH/pwm0/enable
  • 부팅 시 자동 설정은 avs-camera-fsync 서비스이고, 조정점은 /etc/default/avs-camera-fsync 의 AVS_FSYNC_HZ 입니다 → 위 AVS_FSYNC_HZ 절
sudo sed -i 's/^AVS_FSYNC_HZ=.*/AVS_FSYNC_HZ=20/' /etc/default/avs-camera-fsync
sudo systemctl restart avs-camera-fsync.service
이전 출하분(레거시) — pwm_autorun 이 있는 보드
systemctl status pwm_autorun
sudo sed -i 's/pwm_autorun.sh [0-9]*/pwm_autorun.sh 20/' /etc/systemd/system/pwm_autorun.service
sudo systemctl daemon-reload && sudo systemctl restart pwm_autorun

⚠️ 지금 이미지에는 이 파일이 없습니다.

동기 동작 확인 방법​

  • 프레임 동기가 실제로 걸려 있는지는 주파수를 바꿔 가며 fps가 따라오는지로 판정합니다. PWM을 끄는 시험은 판정이 되지 않습니다(카메라 종류에 따라 트리거가 없으면 30fps로 자유 구동하거나 0장이 됩니다).
  • 30 → 25 → 20 → 15 → 10Hz 순으로 바꾸며 아래 명령으로 fps를 잽니다. 파일로 저장하면 디스크 속도에 걸려 fps가 낮게 보이므로 /dev/null로 보냅니다.
# 예: ISX031 1920x1536 UYVY, 250프레임
time v4l2-ctl -d /dev/camera0 --set-fmt-video=width=1920,height=1536,pixelformat=UYVY \
--stream-mmap --stream-count=250 --stream-to=/dev/null
# fps = 250 / 경과시간(초). 20Hz 설정에서 약 20fps가 나오면 동기 정상