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_HZ | period | duty_cycle | 캡처 fps |
|---|---|---|---|
| 30 | 33,333,333 | 16,666,666 | 30.00 |
| 25 | 40,000,000 | 16,666,666 | 25.00 |
| 20 | 50,000,000 | 16,666,666 | 20.02 |
| 15 | 66,666,666 | 16,666,666 | 15.00 |
| 10 | 100,000,000 | 16,666,666 | 10.00 |
🔴 duty_cycle 은 전 구간 16,666,666 으로 고정됩니다 — HIGH 상한(33.3ms, ISX031 은 트리거를
레벨로 읽습니다)에 걸려 30Hz 이하에서는 항상 클램프되기 때문입니다.
⇒ duty 값으로 주파수를 판정하지 마세요. period 를 보세요.
어느 PWM 이 실배선인가 — 칩 번호는 커널·제품마다 재번호되므로 물리주소로 역인덱싱합니다.
| 제품 | 실배선 PWM |
|---|---|
| AVS200 | 32f0000.pwm |
| AVS300 | 810c600000.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
⚠️ 지금 이미지에는 이 파일이 없습니다.
- 외부 장비(LiDAR 등)의 신호로 카메라를 동기화하려면 avs300 외부 프레임 동기 입력을 참고하십시오.
동기 동작 확인 방법
- 프레임 동기가 실제로 걸려 있는지는 주파수를 바꿔 가며 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가 나오면 동기 정상