게시됨 2026-04-02
이 가이드에서는 표준을 제어하는 방법을 설명합니다.서보 기구펄스 폭 변조(PWM) 신호를 사용하는 모터. 설정하는 데 필요한 정확한 PWM 매개변수(주기, 펄스 폭, 듀티 사이클)를 학습합니다.서보 기구0도에서 180도까지 원하는 각도로. 지침은 널리 사용되는 마이크로컨트롤러 플랫폼을 기반으로 하며 일반적인 50Hz 아날로그 및 디지털로 검증되었습니다.서보 기구취미 로봇 공학에 사용됩니다. 단계별 코드 예제와 교정 방법을 따르면 지터나 드리프트 없이 서보를 안정적으로 배치할 수 있습니다.
표준 서보 모터에는 다음과 같은 고정 특성을 갖는 PWM 신호가 필요합니다.
신호주기: 20ms(밀리초), 이는 다음의 주파수와 같습니다.50Hz.
펄스 폭(높은 시간):에 따라 다름1.0ms그리고2.0ms.
듀티 사이클= (펄스 폭 / 20ms) × 100%.
참고: 일부 서보는 확장된 범위에 대해 0.5ms~2.5ms를 수용할 수 있지만 표준 1.0~2.0ms는 거의 모든 일반 서보에 작동합니다.
다음 코드 구조는 하드웨어 PWM을 제공하는 모든 플랫폼(예: Arduino, STM32, ESP32, 하드웨어 PWM이 있는 Raspberry Pi)에서 작동합니다. 우리는 일반적인 의사 코드를 사용하므로 이를 특정 마이크로 컨트롤러에 적용할 수 있습니다.
PWM 지원 핀을 선택하세요.
PWM 주파수를 다음으로 설정합니다.50Hz(기간 = 20ms).
더 세밀하게 제어하려면 해상도를 최소 8비트(0~255) 또는 16비트로 설정하세요.
8비트 PWM의 경우(0 = 0% 듀티, 255 = 100% 듀티):
1.0ms에 대한 듀티 사이클 = (1.0 / 20.0) × 255 = 12.75 → 반올림13
1.5ms에 대한 듀티 사이클 = (1.5 / 20.0) × 255 = 19.125 → 반올림19
2.0ms에 대한 듀티 사이클 = (2.0 / 20.0) × 255 = 25.5 → 반올림26
모든 각도(0~180°)에 대한 일반 공식:
pulse_width_ms = 1.0 + (각도 / 180.0)(2.0 - 1.0) 듀티_값 = (펄스폭_ms / 20.0)(2^해상도 - 1)
8비트 해상도 및 45°의 예:
![]()
pulse_width_ms = 1.0 + (45/180)1.0 = 1.25ms
의무값 = (1.25/20)255 = 15.9375 → 정수16
// 의사코드 pwm_set_주파수(PWM_PIN, 50); // 50Hz pwm_set_solution(PWM_PIN, 8); // 8비트 정수 각도 = 90; // 목표 각도 int Duty = map(angle, 0, 180, 13, 26); // 미리 계산된 최소/최대 듀티 사용 pwm_write(PWM_PIN, 듀티);
두 개의 서보가 정확히 동일하지 않기 때문에 항상 실제 펄스 폭 제한을 측정하십시오.
1. 1.0ms 펄스를 기록하고 서보 위치를 관찰합니다. 물리적 정지점에 도달하지 못한 경우 이동이 멈출 때까지 펄스 폭을 0.05ms 단위로 늘립니다(다음과 같이 기록).내_펄스).
2. 2.0ms 펄스를 기록합니다. 마찬가지로 전체 회전을 제공하는 최대 펄스 폭을 찾습니다(최대_펄스).
3. 이론적인 1.0/2.0 ms 대신 코드에서 측정된 값을 사용하십시오.
일반적인 경우: 일반적인 Tower Pro SG90 마이크로 서보 필요min_pulse = 0.9ms그리고최대 펄스 = 2.1ms실제 0~180° 범위의 경우. 항상 서보 모델별로 보정하십시오.
// PWM을 사용한 서보 제어 – 외부 라이브러리가 필요하지 않습니다. // 하드웨어 PWM이 있는 모든 보드(예: Uno, Nano, Mega, ESP32)에서 작동합니다. const int ServoPin = 9; // PWM 핀 const int freq = 50; // 50Hz const int 해상도 = 8; // 8비트(0-255) // 사전 교정된 펄스 제한(마이크로초 단위) const int minPulseUs = 1000; // 1.0ms = 1000μs const int maxPulseUs = 2000; // 2.0 ms = 2000 µs void setup() { // PWM 구성 ledcSetup(0, freq, 해상도); // 채널 0 ledcAttachPin(servoPin, 0); } void setServoAngle(int angle) { // 각도를 0-180으로 제한 angle = constrain(angle, 0, 180); // 각도를 펄스 폭(마이크로초)으로 변환합니다. int pulseUs = minPulseUs + (각도(maxPulseUs - minPulseUs)) / 180; // 펄스 폭을 듀티 사이클(0-255)로 변환 int Duty = (pulseUs255) / 20000; // 20000 µs = 20 ms 주기 ledcWrite(0, Duty); } 무효 루프() { setServoAngle(0); // 0°로 이동 Delay(1000); setServoAngle(90); // 90°로 이동 Delay(1000); setServoAngle(180); // 180°로 이동 Delay(1000); }
1. 항상 각 서보를 개별적으로 교정하십시오.– 동일한 모델의 두 서보라도 ±0.1ms의 차이가 있을 수 있습니다. 0.5ms에서 2.5ms까지 스윕하는 간단한 테스트 스케치를 작성하고 0°와 180°에 대한 정확한 펄스 폭을 기록해 두십시오.
2. 별도의 전원 공급 장치를 사용하십시오.– 마이크로 컨트롤러의 5V 핀에서 직접 서보에 전원을 공급하지 마십시오(전류 스파이크로 인해 보드가 재설정될 수 있음). 5V/2A 조정 공급 장치 또는 4×NiMH 배터리(4.8V)가 안정적으로 작동합니다.
3. 100~470μF 전해 커패시터 추가서보에 가까운 서보의 전원 단자 전체에 걸쳐. 이는 모터의 갑작스러운 시동으로 인한 전압 강하를 흡수합니다.
4. 소프트웨어 지연 방지서보가 움직이는 동안. 프로그램이 다른 작업을 처리할 수 있도록 비차단 타이밍(예: millis() 기반 상태 머신)을 사용하세요.
5. 고정밀 애플리케이션용(예: 로봇 팔), 교정된 지점 사이에 16비트 PWM 타이머와 선형 보간을 사용합니다. 루프를 닫으려면 10비트 아날로그 피드백 전위차계를 추가하는 것도 고려해 보세요.
핵심 테이크아웃: 주파수를 50Hz로 고정하고 각도를 1.0~2.0ms 펄스 폭으로 매핑하면 PWM을 사용하여 서보를 제어하는 것은 간단합니다. 그러나 실제 신뢰성은 적절한 교정, 적절한 전력, 이론적 값이 아닌 측정된 한계 사용에서 비롯됩니다. 섹션 2.4에 설명된 보정 방법을 통합하는 모든 새 서보에 적용하면 프로젝트가 매번 부드럽고 정확한 모션을 얻을 수 있습니다.
업데이트 시간:2026-04-02