> 업계 통찰 >BLDC
기술 지원

PWM 드라이브 서보 코드는 무엇입니까? PWM 서보 제어 코드에 대한 전체 가이드: 원리, 예 및 모범 사례

게시됨 2026-04-01

이 가이드는 표준 제어를 위한 펄스 폭 변조(PWM) 코드에 대한 완전하고 실용적인 설명을 제공합니다.서보 기구모터. 정확한 코드, 배선 지침 및 타이밍 원리를 찾고 있다면서보 기구정확한 각도로 이동하면 올바른 위치에 왔습니다. 이 기사에서는 보편적으로 인정되는 표준에 중점을 두고 있습니다.서보 기구1ms에서 2ms 사이의 펄스 폭을 갖는 50Hz PWM 신호를 제어하고 하드웨어에 구애받지 않는 작업 코드 예제를 제공하므로 모든 마이크로컨트롤러 플랫폼에 적용할 수 있습니다.

핵심 원리: PWM 신호 디코딩

기본적으로 표준 아날로그 서보를 제어하는 ​​것은 복잡한 데이터 패킷을 전송하는 것이 아니라 특정하고 반복되는 전기 펄스를 생성하는 것입니다. 서보의 내부 회로는 이 펄스의 폭을 해석하여 출력 샤프트의 목표 위치를 결정합니다.

표준 제어 신호는 두 가지 주요 매개변수로 정의됩니다.

1. 기간(빈도):신호는 20밀리초(ms)마다 반복됩니다. 이는 50Hz(1/0.02s = 50Hz)의 주파수와 같습니다.

2. 펄스 폭(듀티 사이클):해당 20ms 기간 내에서 신호가 높은 기간(논리 1)입니다. 이 값은 서보의 각도에 직접적으로 매핑됩니다.

펄스 폭과 각도 간의 매핑은 중요한 정보입니다. 대부분의 표준 서보의 경우 관계는 선형이며 다음 산업 표준 사양을 따릅니다.

1.0ms 펄스:서보를 0도(완전히 시계 반대 방향)로 회전합니다.

1.5ms 펄스:서보를 90도(중앙 위치)로 회전합니다.

2.0ms 펄스:서보를 180도(완전 시계 방향)로 회전합니다.

많은 서보가 이 표준을 준수하지만 일부 높은 토크 또는 특수 서보는 약간 다른 끝점(예: 0.9ms ~ 2.1ms)을 가질 수 있으므로 특정 모델의 정확한 범위를 확인하는 것이 중요합니다. 아래 코드 예제는 이러한 최소 및 최대 펄스 폭 상수를 쉽게 조정할 수 있도록 구성되어 있습니다.

범용 PWM 서보 제어 코드 구조

코드 로직은 모든 ​​플랫폼에서 일관됩니다. 타이머/카운터를 초기화하여 50Hz 신호를 생성한 다음 해당 신호의 "정시"를 변조하여 서보 각도를 설정합니다. 다음 의사 코드는 모든 프로그래밍 환경에 적용할 수 있는 핵심 논리를 보여줍니다.

// --- 구성 상수 --- #define PWM_FREQUENCY_HZ 50 #define PERIOD_MS (1000 / PWM_FREQUENCY_HZ) // 20ms로 계산 #define PULSE_MIN_MS 1.0 // 0도에 대한 펄스 폭 #define PULSE_MAX_MS 2.0 // 180도에 대한 펄스 폭 #define ANGLE_MIN 0 #define ANGLE_MAX 180 // --- 각도를 펄스 폭에 매핑하는 함수 --- float angleToPulseWidth(int angle_degrees) { // 각도를 유효한 범위로 제한 if (angle_degrees ANGLE_MAX) angle_degrees = ANGLE_MAX; // 각도 범위에서 펄스 폭 범위로의 선형 매핑 float pulse_width = PULSE_MIN_MS + ( (float)(angle_degrees - ANGLE_MIN) / (ANGLE_MAX - ANGLE_MIN) )(PULSE_MAX_MS - PULSE_MIN_MS); 펄스폭을 반환합니다; } // --- 주 제어 루프 개념 --- // 실제 구현에서는 다음이 하드웨어 타이머에 의해 처리됩니다. // 1. 출력 핀을 HIGH로 설정합니다. // 2. 계산된 펄스 폭(예: 1.5ms) 동안 기다립니다(지연). // 3. 출력 핀을 LOW로 설정합니다. // 4. 20ms 기간(PERIOD_MS - pulse_width)의 나머지 부분을 기다립니다.

공통 플랫폼에 대한 실제 코드 예제

이를 즉시 실행 가능하게 만들기 위해 가장 일반적인 두 가지 개발 플랫폼에 대한 구체적인 구현이 여기에 있습니다. 원리는 동일하게 유지되어 50Hz, 1-2ms 표준의 이식성을 입증합니다.

예시 1: Arduino(내장 서보 라이브러리 사용)

이것은 취미생활자에게 가장 일반적인 진입점입니다. 아두이노서보 기구라이브러리는 하드웨어 타이머 복잡성을 추상화하여 깔끔한 인터페이스를 제공합니다. 이 예는 서보의 신호선을 PWM 지원 디지털 핀에 연결하는 표준 방식을 기반으로 합니다.

#포함하다// 서보 객체 생성 Servo myServo; // 서보의 신호선에 연결된 핀을 정의합니다. const int ServoPin = 9; void setup() { // 서보 개체를 핀에 연결합니다. // 라이브러리는 자동으로 50Hz 신호를 설정합니다. myServo.attach(servoPin); // --- 일반적인 시나리오: 시작 시 서보 중앙에 위치 --- // 많은 로봇 응용 분야에서는 알려진 // 안전한 위치에서 시작하여 기계적 변형을 방지하는 것이 중요합니다. // 90도로 중심을 맞추는 것이 보편적인 모범 사례입니다. myServo.write(90); // 중앙 위치로 이동 Delay(1000); // 위치에 도달하는 시간 허용 } void loop() { // 0에서 180도까지 스윕 for (int angle = 0; angle = 0; angle--) { myServo.write(angle); 지연(15); } }

참고:쓰다()기능은 각도(0-180)를 올바른 펄스 폭(1-2 ms)으로 자동 변환합니다.

예 2: Raspberry Pi(Python 및 RPi.GPIO 사용)

Raspberry Pi에서는 일반적으로 소프트웨어에서 PWM 신호를 생성하므로 정확한 타이밍이 필요합니다. 그만큼RPi.GPIO라이브러리는 보다 정확한 신호를 위해 특정 핀에 하드웨어 지원 PWM 인터페이스를 제공합니다. 이 예는 Linux 기반 단일 보드 컴퓨터의 단일 서보 제어에 대한 표준 접근 방식을 반영합니다.

import RPi.GPIO as GPIO import time # 핀 정의 Servo_pin = 18 # GPIO와 같이 하드웨어 PWM을 지원하는 핀을 사용하십시오. 18 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # PWM 설정: 50Hz 주파수 pwm = GPIO.PWM(servo_pin, 50) pwm.start(0) # 0% 듀티 사이클로 시작 def set_angle(angle): """각도(0~180)를 50Hz 신호의 듀티 사이클로 변환합니다.""" # 각도 각도 제한 = max(0, min(180, 각도)) # 각도(0~180)를 펄스 폭(1~2ms)으로 매핑 # 20ms 주기(50Hz)의 경우 듀티 사이클 = (pulse_width_ms / 20) 100 pulse_width_ms = 1.0 + (각도 / 180.0)1.0 # 1.0-2.0 ms로 매핑됨 Duty_cycle = (pulse_width_ms / 20.0)100.0 pwm.ChangeDutyCycle(duty_cycle) # --- 일반적인 시나리오: 새 서보 교정 --- # 처음 서보를 통합할 때 실제 기계적 한계를 # 확인하는 것이 중요합니다. 아래 코드는 안전한 교정 루틴을 보여줍니다. try: # 중심 위치 테스트 print("90도로 이동 중...") set_angle(90) time.sleep(2) # 0도 위치 테스트(1.0ms 펄스) print("0도로 이동...") set_angle(0) time.sleep(2) # 180도 위치 테스트(2.0ms 펄스) print("180도로 이동...") set_angle(180) time.sleep(2) # 중앙으로 돌아가기 print("중앙으로 돌아가는 중입니다.") set_angle(90) time.sleep(1) Except KeyboardInterrupt: print("사용자에 의해 중지됨") finally: pwm.stop() GPIO.cleanup()

참고: 이 방법은 듀티 사이클 계산을 사용합니다. 50Hz 신호의 경우 1ms 펄스는 듀티 사이클(1/20)에 해당합니다.100 = 5%. 2ms 펄스는 (2/20)입니다.100 = 10%.

일반적인 함정 및 문제 해결

올바른 코드가 있어도 여러 하드웨어 관련 문제로 인해 서보가 작동하지 않을 수 있습니다. 이러한 일반적인 시나리오를 이해하면 문제를 신속하게 진단하고 해결하는 데 도움이 됩니다.

1. 불충분한 전원 공급 장치:이것은 가장 빈번한 문제입니다. 일반적인 서보는 움직일 때 200-500mA를 소비할 수 있으며 정지 전류는 훨씬 더 높습니다. 마이크로컨트롤러 USB 포트(일반적으로 500mA)는 특히 다중 서보의 경우 충분하지 않은 경우가 많습니다.

해결책:전용 외부 전원 공급 장치(예: 배터리 팩의 5V 또는 조정된 벤치 공급 장치)를 사용하십시오. 마이크로컨트롤러의 접지(GND)가 외부 전원 공급 장치의 접지에 연결되어 있는지 확인하십시오.

2. 잘못된 타이밍 값:서보가 지터지거나 윙윙거리거나 전체 범위로 이동하지 않으면 펄스 폭 제한이 서보의 사양과 일치하지 않을 가능성이 높습니다.

해결책:정확한 펄스 폭 범위는 서보의 데이터시트를 참조하십시오. 일반적인 변화는 0.9ms ~ 2.1ms입니다. 조정하다PULSE_MIN_MS그리고PULSE_MAX_MS그에 따라 코드의 상수.

3. 소프트웨어 PWM의 주파수 드리프트:전용 하드웨어 PWM 핀이 없는 Raspberry Pi와 같은 플랫폼에서 소프트웨어로 생성된 PWM은 운영 체제 멀티태스킹으로 인해 타이밍 불일치가 발생할 수 있습니다.

해결책:중요하거나 고속 애플리케이션의 경우 타이밍을 전용 하드웨어 칩으로 오프로드하는 전용 서보 컨트롤러 보드(예: PCA9685)를 사용하여 안정적인 50Hz 생성을 보장합니다.

실행 가능한 결론

PWM 코드로 서보를 성공적으로 구동하려면 다음 세 가지 핵심 원칙을 기억하십시오.

1. 신호 표준화:항상 정확한 50Hz 신호를 생성하는 것을 목표로 하십시오. 펄스 폭은 위치를 제어하는 ​​유일한 변수입니다.

2. 각도를 펄스로 매핑:1.0ms(0°)에서 2.0ms(180°)까지의 선형 매핑을 기준선으로 사용합니다. 이 공식은 표준 서보의 90% 이상에 적용됩니다.

3. 전력 우선순위:전원이 필요한 전류를 공급할 수 있는지 확인하십시오. 비정상적으로 움츠러드는 서보는 거의 항상 코드 문제가 아니라 전원 문제입니다.

행동 단계:단일 서보를 사용하여 선택한 플랫폼에서 간단한 스윕 코드로 시작하십시오. 스윕이 작동하면 하드코딩된 각도를 센서 입력, 조이스틱 값 또는 계산된 위치로 대체하여 서보를 대규모 프로젝트에 통합합니다. 50Hz 표준을 준수하고 전원 공급 장치를 검증함으로써 모든 모션 제어 애플리케이션을 위한 견고한 기반을 구축할 수 있습니다.

업데이트 시간:2026-04-01

미래에 힘을 실어주다

귀하의 제품에 적합한 모터 또는 기어박스를 추천하려면 Kpower 제품 전문가에게 문의하십시오.

케이파워에 메일보내기
문의 제출
+86 0769 8399 3238
 
kpower지도