게시됨 2026-05-06
이런 상황을 겪어본 적이 있나요?
서보가 전원 공급 장치에 연결된 후 응답이 없습니다. 프로그램을 작성한 후 임의의 지터가 발생했습니다. 분명히 지시를 따랐지만 돌릴 수가 없었어요.
당황하지 말 것. 당신은 혼자가 아닙니다.
오늘 이 글에서는 51 마이크로 컨트롤러의 도움으로 서보 제어에 대해 자세히 설명하겠습니다. 복잡한 수학적 내용도 없고, 이해하기 어려운 레지스터 테이블도 없으며, 가장 직접적인 아이디어와 가장 실용적인 코드 프레임워크만 있습니다.
이 핵심 사항을 기억하십시오. 서보가 정지 상태로 유지된다면 이는 주로 타이밍 문제 때문입니다. 서보가 무작위로 움직이는 경우 전원 공급 부족으로 인한 것일 수 있습니다.
준비됐나요?
01 조향장치란 정확히 무엇인가요?
많은 사람들이 처음으로 서보를 구입하고 그것이 모터라고 생각합니다. 전기가 켜지면 켜질 수 있습니다.
잘못된.
스티어링 기어는 일반 모터가 아닙니다. 그것은 "뇌"를 가진 작은 로봇에 가깝습니다.
명령을 내리면 지정된 각도로 회전합니다. 그럼 그만하세요. 당신의 길에서 멈춰라.
내부의 작은 전위차계와 제어 보드를 사용하여 이를 어떻게 달성합니까? 펄스를 보내면 몇 가지 동작을 수행하고 해당 위치에 도달하면 잠깁니다.
따라서 조향 기어를 제어하기 위해 PID를 작성하거나 폐쇄 루프 계산을 수행할 필요가 없습니다. 한 가지만 배우면 됩니다. 펄스를 보내는 것입니다.
02 핵심원리: 하나의 숫자로 각도를 바꿀 수 있다
데이터 시트를 엽니다. 다음 문장을 찾으세요. 높은 수준의 펄스 폭은 각도에 해당합니다.
간단히 말해서, 0.5밀리초의 높은 레벨은 0도로 바뀌고, 1.5밀리초 지속되면 90도 회전하고, 2.5밀리초 지속되면 180도 회전합니다.
기간은 20밀리초로 고정됩니다.
분명합니까? 서보를 제어한다는 것은 실제로 IO 포트를 제어하고 끌어 올리고 일정 시간 동안 기다렸다가 아래로 당긴 다음 남은 시간을 기다리는 것을 의미합니다.
그렇게 간단합니다.
예를 들어 90도 회전하는 펄스는 다음과 같습니다.
먼저 상향 풀업 연산을 수행한 후 1.5밀리초 동안 지속되는 지연을 수행하고, 그 다음 하향 풀다운 연산을 수행한 다음 18.5밀리초 동안 지속되는 지연을 수행한 다음 위의 단계를 무한 루프로 반복합니다.
이것은 완전한 제어주기입니다.
03 프로그램을 작성하기 전에 먼저 환경을 설정하세요
화려한 장비는 필요하지 않습니다.
51 마이크로컨트롤러(STC89C52이면 충분함)

서보(일반적인 SG90 또는 MG995가 사용함)
듀퐁 와이어 몇 개
5V 전원 공급 장치가 있으므로 마이크로 컨트롤러로 전원을 공급할 것이라고 기대하지 마십시오. 중요한 점을 세 번 말씀드리지만, 마이크로컨트롤러로 구동될 것이라고 기대하지 마세요.
많은 사람들의 서보가 흔들리고 제대로 회전하지 않습니다. 프로그램 오류는 아니고 전원이 부족합니다.
서보가 시작되는 순간 전류는 1A 이상에 도달할 수 있으며 USB에서 끌어오는 소량의 전력으로는 서보를 완전히 공급할 수 없습니다.
무엇을 해야 할까요? 외부 전원 공급 장치. 공통점. 공통점. 공통점.
전원 공급 장치의 양극 단자는 VCC이어야 하고, 전원 공급 장치의 음극 단자는 GND여야 합니다. 마이크로 컨트롤러의 GND는 전원 공급 장치 GND에도 연결되어야 하며 신호 라인은 마이크로 컨트롤러의 IO 포트에 연결되어야 합니다.
회로가 연결되어 있나요? 축하해요. 가장 어려운 절반이 완료되었습니다.
04 코딩 실습: 가장 간단한 것부터 시작하세요
우리는 가짜 놀이를 하지 않습니다. 실행할 수 있는 코드를 직접 제공합니다.
요점: 타이머를 사용하여 20ms 주기로 인터럽트를 생성하고 인터럽트 중 하이 레벨의 지속 시간을 유연하게 제어합니다.。
아이디어:
15와 같이 현재 필요한 상위 수준 시간을 저장하는 변수를 정의합니다. 이 15는 1500마이크로초(1.5ms)를 나타냅니다.。
각 20ms 기간이 시작될 때 먼저 IO 포트를 높이십시오.
높은 수준의 시간을 지연시킵니다.
IO 포트를 아래로 당깁니다.
남은 시간을 미루세요.
의사 코드로 작성됨:
void main() { 타이머 초기화(20ms 인터럽트 설정); while(1) { // 아무것도 하지 않고 인터럽트에 의존합니다. } } void 타이머 인터럽트() 인터럽트 1 { Pull high; 지연(상위 레벨 시간); 낮게 당기십시오. 지연(20ms - 상위 레벨 시간); }
중요: 정확한 마이크로초 수준 지연을 위해서는 지연 기능을 사용해야 합니다. 51 마이크로 컨트롤러의 주 주파수가 11.0592MHz일 때 1NOP는 대략 1.085마이크로초와 같습니다. Delay_us 함수를 작성하려면 함수가 마이크로초 단위의 숫자를 전달하고 while 루프를 통해 이를 빼서 구현해야 합니다.
문제를 두려워하지 마십시오. 이러한 종류의 연속 근사 디버깅은 임베디드 시스템의 표준입니다.
05 방향타를 움직이게 하세요: 전진, 후진, 모든 각도
이제 다음을 수행해야 합니다. 버튼 1을 누르고 0도로 회전합니다. 버튼 2를 누르고 90도로 회전합니다. 버튼 3을 누르고 180도로 회전합니다.
의사 코드에 키 감지를 추가합니다.
(버튼 1을 누른 경우) 하이 레벨 시간 = 500; // 0.5ms -> 0도(버튼 2를 눌렀을 때) 하이 레벨 시간 = 1500; // 1.5ms -> 90도(버튼 3을 눌렀을 때) 하이 레벨 시간 = 2500; // 2.5ms -> 180도

중요: 상위 수준 시간 단위는 마이크로초입니다. 500, 1500, 2500.
1, 2, 3이라고 쓰지 마세요. 그것은 밀리초입니다. 1000배 더 나쁩니다.
그러면 어쩌죠? 그러면 서보는 순종적으로 해당 각도로 회전합니다.
믿을 수 없나요? 당신은 시도합니다.
06 당신이 밟았을 수도 있는 함정(Q/A)
Q: 서보가 회전하지 않고 윙윙거리는 소리만 나나요?
첫째, A, 전원 전류가 부족하거나 펄스 폭이 정확하지 않습니다. 전원 공급 장치를 5V/2A 이상의 전원 공급 장치로 변경한 다음 하이 레벨 시간이 500~2500us인지 확인해야 합니다.
Q: 서보는 회전하지만 심하게 흔들리나요?
A에서 언급한 상황, 즉 두 개의 인접한 제어 사이클 사이에 과도한 차이가 있거나 전원 공급 장치에 리플이 있기 때문에 서보 전원 공급 장치의 양쪽 끝에 큰 커패시터(값 470uF)를 추가하십시오.
Q: 프로그램을 번인하면 반응이 없는데, 신호케이블을 뽑으면 옆으로 돌아가나요?
A: 처음에 IO 포트의 레벨 상태가 불확실하거나 높은 레벨에 있는 기간이 지정된 범위를 초과합니다. 장치의 전원을 켤 때 먼저 IO 포트의 레벨을 낮게 풀한 다음 초기 값을 제공해야 합니다.。
Q: 연속 회전(예: 360도 서보)을 제어하고 싶으십니까?
그래도 안되면 360도 연속 회전이 가능한 서보로 교체해야 합니다. 하이 레벨이 1.5ms이면 서보는 회전을 멈춥니다. 1.5ms보다 높으면 서보가 앞으로 회전합니다. 1.5ms보다 낮으면 서보가 역회전합니다.
Q: 오실로스코프가 없다면 펄스가 올바른지 어떻게 확인할 수 있나요?
1초마다 0도에서 90도 사이를 교대로 회전하도록 서보를 프로그래밍합니다. 로직 분석기나 간단한 LED 방식을 사용하여 스윙이 규칙적인지 관찰하세요.
07 업그레이드: 사용자가 그리는 곡선에 따라 서보가 움직이게 하세요.
각도가 하드코딩된 프로그램은 너무 초보적입니다.
보다 발전된 플레이 방법: 서보를 0도에서 180도로 천천히 움직인 다음 천천히 다시 돌아옵니다.
어떻게 하나요?
angle이라는 루프 변수를 사용하여 0에서 180까지 증가시키며, step 값은 너무 크지 않아야 합니다. 예를 들어, 매번 1도씩 증가합니다.。
1도씩 증가할 때마다 상위 레벨 시간을 다시 계산합니다.
높은 레벨 시간은 500에 각도 곱하기 2000을 180으로 나눈 값과 같습니다.
500은 0도에 해당하고, 2500은 180도에 해당하며, 총 범위는 2000마이크로초이며 이를 180등분으로 나눕니다.
그런 다음 20ms를 지연합니다. 다시 해보세요.
그 효과는 부드러운 스윙입니다. 손을 흔드는 로봇처럼요.
이것을 "서보 운동학"이라고 부를 수 있지만 이름 때문에 겁먹지 마세요. 본질적으로 이는 일종의 선형 보간입니다.
08 한 단계 더 나아가: 직렬 포트를 사용하여 서보를 원격으로 제어합니다.
직렬 통신을 추가합니다. 컴퓨터는 숫자를 보내고 서보는 해당 각도로 회전합니다.
예를 들어 "0"을 발음하고 0도를 돌립니다. "90"이라고 말하고 90도 회전합니다.
핵심 사항:
인터럽트를 수신하는 마이크로 컨트롤러 직렬 포트에서 문자열이 구문 분석됩니다.
참고: 한 번에 모든 항목을 수집하지 못할 수도 있습니다. 개행 문자가 수신되는지 확인합니다.
전체 번호를 받은 후 범위는 0~180으로 제한됩니다.
상위 수준 시간으로 변환하고 변수를 업데이트합니다.
이러한 방식으로 귀하의 서보는 프로그래밍 가능한 액추에이터가 됩니다. 블루투스 모듈에 연결하면 휴대폰에서도 제어가 가능합니다.
09 요약: 조향 기어 제어를 위한 세 가지 요소
전원 공급 장치. 충분한 전류를 공급하고 공통 접지에 대한 전압을 안정화하십시오.
타이밍. 기간 20ms, 높은 수준 500-2500us.
차단 작업을 수행하지 말고, 계속 기다리는 지연을 사용하는 대신 타이머 인터럽트를 사용하세요. 그렇지 않으면 아무 것도 할 수 없습니다.
이 세 가지를 마스터하면 시중에 판매되는 서보의 99%를 제어할 수 있습니다.
기억하세요: 프로그램을 작성할 때 "프로그램이 원활하게 실행되기에 충분하다"는 대신 "전원 공급 장치가 갑자기 흔들리면 어떻게 될까요?"에 대해 한 단계 더 생각하십시오.
10 이제 당신이 행동할 차례다
이 기사를 단지 모음집으로 간주하지 마십시오. Keil을 켜고 개발 보드를 올바르게 연결한 후 위 코드를 한 번 입력해 보세요.
처음 세 번은 돌지 않을 확률이 높습니다. 서두르지 마십시오. 멀티미터를 사용하여 전압을 측정하고 로직 분석기를 사용하여 파형을 캡처합니다. 정말 다른 방법이 없다면 서보를 바꿔보세요.
문제를 해결할 때마다 임베디드에 대한 이해가 깊어집니다.
몇 년이 지난 뒤 돌이켜보면, 조타 장치를 마스터한 날이 "코드를 통해 물리적 세계를 제어하는 것"을 진정으로 이해하기 위한 출발점이었다는 것을 알게 될 것입니다.。
당신의 손에 들려 있는 윙윙거리는 작은 서보는 로봇 세계의 첫 번째 열쇠입니다.
더 이상 기다리지 마십시오. 지금 전원을 켜세요.
한번 시도해 보세요.
업데이트 시간:2026-05-06