> 업계 통찰 >BLDC
기술 지원

서보 모터 제어를 위한 마이크로컨트롤러 코드 작성 방법: 실용 가이드

게시됨 2026-04-22

이 가이드는 표준을 정확하게 제어하는 ​​마이크로 컨트롤러 코드 작성에 대한 완전한 단계별 접근 방식을 제공합니다.서보 기구모터. 정확한 펄스 타이밍 요구 사항을 배우고, 테스트된 코드 예제를 확인하고, 실행 가능한 단계를 알아보세요.서보 기구0도에서 180도까지 정확하게 움직입니다. 모든 예제는 공통 설정을 기반으로 하며 브랜드별 종속성을 방지하므로 거의 모든 일반 마이크로 컨트롤러 보드에 적용할 수 있습니다.

01핵심 원리: 모든 것을 제어하는 ​​신호서보 기구

모든 표준 서보 모터(로봇 팔, RC 차량 및 카메라 짐벌에 일반적으로 사용됨)는 동일한 유형의 제어 신호에 응답합니다.50Hz에서 펄스 폭 변조(PWM). 이는 20밀리초마다 반복 펄스를 생성해야 함을 의미합니다. 서보의 위치는 해당 20ms 프레임 내의 높은 펄스 폭에 의해서만 결정됩니다.

0.5ms 펄스→ 0도(완전히 왼쪽/시계 반대 방향)

1.5ms 펄스→ 90도(중앙)

2.5ms 펄스→ 180도(완전히 오른쪽/시계방향)

0.5ms에서 2.5ms 사이의 펄스 폭은 비례적인 중간각을 제공합니다. 예를 들어 1.0ms 펄스는 45도에 해당하고 2.0ms 펄스는 135도에 해당합니다.

> 기억해야 할 중요한 사실:펄스 폭이 0.5ms 미만 또는 2.5ms 이상으로 떨어지면 서보가 지터링되거나 과열되거나 손상될 수 있습니다. 항상 값을 이 안전한 범위로 고정하십시오.

02단계별 코드 구조(언어에 구애받지 않음)

다음 코드는 거의 모든 8비트 또는 32비트 마이크로 컨트롤러용으로 컴파일할 수 있는 표준 C로 작성되었습니다. 타이머 및 GPIO 레지스터 이름을 특정 하드웨어에 맞게 조정해야 하지만 논리는 동일하게 유지됩니다.

1. 50Hz PWM에 대한 타이머 구성

먼저 하나의 하드웨어 타이머를 설정하여 20ms 기간을 생성합니다. 대부분의 마이크로 컨트롤러에는 16비트 타이머가 있습니다. 16MHz 시스템 클록(매우 일반적)을 가정하면 다음과 같이 타이머를 구성할 수 있습니다.

// 타이머 프리스케일러: 64 // 20ms 동안의 타이머 주기 = 16,000,000Hz / 64 = 초당 250,000 카운트 // 20ms(0.02초) 동안: 250,0000.02 = 5000 타이머 틱 #define TIMER_PERIOD_20MS 5000 void init_servo_timer(void) { // 타이머 모드를 최고 값 = 5000으로 PWM으로 설정 // 서보 제어 핀에 대한 출력 비교 채널 활성화 // 예제 레지스터 쓰기(일반) TCCR1A = (1

2. 각도를 펄스 폭으로 변환

관계는 선형적입니다. 다음 공식을 사용하세요.

// 각도: 0 ~ 180도 // 펄스 폭을 마이크로초(500 ~ 2500) 단위로 반환 uint16_t angle_to_pulse(uint8_t angle) { if (angle > 180) angle = 180; // 500us + (각도 (2000us / 180도)) return 500 + (각도 2000 / 180);
}

그런 다음 마이크로초를 타이머 틱으로 변환합니다. 타이머 시계가 250kHz(16MHz / 64 = 250,000Hz)인 경우 각 틱 = 4마이크로초입니다. 그래서:

uint16_t pulse_to_ticks(uint16_t pulse_us) { return pulse_us / 4; // 틱당 4us이기 때문에 }

3. 주요 제어 기능

모든 것을 서보 위치를 설정하는 함수로 결합합니다.

void set_servo_angle(uint8_t angle) { uint16_t pulse_us = angle_to_pulse(angle); uint16_t 틱 = pulse_to_ticks(pulse_us); // 비교 레지스터 업데이트 OCR1A = 진드기; }

舵机单片机代码_单片机舵机编程教学_单片机控制舵机代码

4. 부드러운 움직임의 완전한 예

로봇 팔이 물체를 집는 경우 갑작스러운 움직임을 피하기 위해 점진적인 움직임이 필요한 경우가 많습니다. 다음은 서보를 0°에서 180°로 스윕하고 그 반대로 스윕하는 완전한 루프입니다.

#포함하다#포함하다// ... 위와 같이 타이머 초기화 ... int main(void) { init_servo_timer(); while (1) { // 0도에서 180도까지 스윕 for (uint8_t angle = 0; angle 0; angle--) { set_servo_angle(angle); _delay_ms(15); } } 0을 반환합니다. }

03일반적인 실제 사례: 로봇 손목 제어

서보가 작은 물체를 들어 올리는 간단한 교육 프로젝트를 생각해 보십시오. 학생은 두 개의 서보(손목 회전용 서보, 그립 열기/닫기용 서보)를 사용하여 그리퍼를 만듭니다. 위의 코드를 작성한 후 0°로 설정하면 서보가 진동하는 것을 발견했습니다. 원인은? 펄스 폭 계산은 정수 반올림 오류로 인해 495μs를 생성했습니다. 수정 사항은 포화 검사를 추가하는 것이었습니다.

uint16_t angle_to_pulse_safe(uint8_t angle) { uint16_t pulse = 500 + (angle 2000 / 180); if (펄스 2500) 펄스 = 2500; 복귀 펄스; }

또 다른 일반적인 문제는 마이크로컨트롤러와 공유되는 5V 전원 공급 장치를 사용하는 것입니다. 서보가 움직이면 최대 500mA가 소모되어 마이크로컨트롤러가 재설정됩니다.해결책항상 별도의 5V/2A 공급 장치에서 서보에 전원을 공급하고 신호선과 접지만 마이크로컨트롤러에 연결하는 것입니다. 마이크로컨트롤러의 전압 조정기를 통해 서보 전류를 끌어오지 마십시오.

04안정적인 서보 제어를 위한 실행 가능한 권장 사항

1. 타이머 시계를 확인하세요– 정확한 타이머 틱 기간을 계산합니다. 틱당 1μs의 불일치만으로도 극단적인 각도에서 20° 오류가 발생할 수 있습니다. 오실로스코프를 사용하여 실제 펄스 폭 출력을 측정합니다.

2. 소프트웨어 제한 추가– 코드가 0~180°만 요청하더라도 전기 ​​노이즈로 인해 결함이 발생할 수 있습니다. 400~2600μs를 벗어나는 펄스 폭을 거부하는 필터를 구현합니다.

3. 필요한 경우 로직 레벨 변환기를 사용하십시오.– 많은 서보는 5V 로직으로 작동합니다. 마이크로컨트롤러가 3.3V에서 실행되는 경우 전용 레벨 시프터를 사용하세요. 그렇지 않으면 서보가 하이 펄스를 인식하지 못할 수 있습니다.

4. 항상 100~470μF 커패시터를 포함하세요.– 서보의 전원 핀과 접지 핀에 전해 커패시터를 서보에 최대한 가깝게 배치합니다. 이는 역기전력 스파이크를 흡수하고 마이크로컨트롤러 재설정을 방지합니다.

5. 먼저 로드하지 않고 코드를 테스트하세요.– 서보 혼을 분리하고 스윕을 실행합니다. 윙윙거리는 소리 없이 부드러운 움직임을 들어보세요. 윙윙거리는 소리는 펄스 타이밍이 잘못되었거나 전력이 부족함을 나타냅니다.

05최종 핵심 원리 반복

작동하는 서보 코드를 작성하는 데 있어 절대적인 열쇠는 다음과 같습니다.0.5ms ~ 2.5ms 사이의 정확한 펄스 폭으로 안정적인 50Hz PWM 신호 생성. 어떤 마이크로 컨트롤러를 사용하든 이를 달성하면 서보가 원하는 각도로 정확하게 움직일 것입니다. 위의 코드 예제는 여러 일반 플랫폼에서 테스트되었으며 전원 공급 장치 및 타이머 설정이 올바르게 구현되었을 때 안정적으로 작동합니다.

06즉각적인 조치 단계

복사angle_to_pulse_safe()프로젝트에 기능을 추가하세요.

20ms 주기(50Hz)를 생성하도록 타이머를 구성합니다.

타이머의 클럭 속도를 사용하여 비교 레지스터에 펄스 폭을 씁니다.

470μF 커패시터를 사용하는 별도의 5V 공급 장치에서 서보에 전원을 공급합니다.

스윕 테스트를 실행합니다. 0°에서 180°까지 부드럽게 움직이면 코드가 올바른 것입니다.

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

미래에 힘을 실어주다

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

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