- 서보 모터
- LPC2148 PWM 및 ADC를 사용하여 서보 모터 제어
- ARM7-LPC2148의 PWM 및 ADC 핀
- 필요한 구성 요소
- 회로도 및 연결
- 서보 모터 제어를위한 ARM7-LPC2148 프로그래밍
이전 튜토리얼에서는 스테퍼 모터를 ARM7-LPC2148과 인터페이스했습니다. 이 튜토리얼에서는 ARM7-LPC2148로 서보 모터를 제어 합니다. 서보 모터는 스테퍼 모터에 비해 전력 소비가 적습니다. 서보 모터는 원하는 위치에 도달하면 전력 소비를 중지하지만 스테퍼 모터는 계속해서 전력을 소비하여 샤프트를 원하는 위치에 고정합니다. 서보 모터는 정확성과 취급이 용이하기 때문에 로봇 프로젝트에서 주로 사용됩니다.
이 튜토리얼에서 우리는 서보 모터 와 ARM7-LPC2148과 서보를 인터페이스하는 방법에 대해 배울 것 입니다. 전위차계는 또한 서보 모터의 샤프트 위치를 변경하기 위해 인터페이스되고 각도 값을 표시하는 LCD도 있습니다.
서보 모터
서보 모터는 DC 모터, 위치 제어 시스템 및 기어의 조합입니다. 서보 모터의 회전은 PWM 신호를인가하여 제어하며, PWM 신호의 폭은 모터의 회전 각도와 방향을 결정합니다. 여기서 우리는 이 튜토리얼에서 SG90 서보 모터 를 사용할 것입니다. 이것은 인기 있고 가장 저렴한 것 중 하나입니다. SG90은 180도 서보입니다. 따라서이 서보를 사용하여 축을 0-180도에서 배치 할 수 있습니다.
- 작동 전압: + 5V
- 기어 유형: 플라스틱
- 회전 각도: 0 ~ 180도
- 무게: 9gm
- 토크: 2.5kg / cm
서보 모터 프로그래밍을 시작하기 전에 서보 모터를 제어하기 위해 어떤 유형의 신호가 전송되는지 알아야합니다. 서보 모터의 신호선으로 PWM 신호를 보내도록 MCU를 프로그래밍해야합니다. 아래 그림과 같이 PWM 신호의 듀티 사이클을 읽고 서보 모터 샤프트를 각 위치에 배치하는 서보 모터 내부에 제어 회로가 있습니다.
20 밀리 초마다 서보 모터가 펄스를 확인합니다. 따라서 신호의 펄스 폭을 조정하여 모터의 샤프트를 회전시킵니다.
- 서보를 0 도로 회전하기위한 1ms (1 밀리 초) 펄스 폭
- 90도 회전을위한 1.5ms 펄스 폭 (중립 위치)
- 서보를 180도 회전하기위한 2ms 펄스 폭.
ARM7-LPC2148에 서보를 연결 하기 전에이 서보 모터 테스터 회로의 도움으로 서보를 테스트 할 수 있습니다. 또한 서보 모터가 다른 마이크로 컨트롤러와 어떻게 연결되는지 확인하십시오.
- Arduino를 사용한 서보 모터 제어
- 8051 마이크로 컨트롤러와 인터페이싱하는 서보 모터
- MATLAB을 사용한 서보 모터 제어
- Raspberry Pi를 사용한 서보 모터 제어
- 서보 모터와 MSP430G2 인터페이스
- 서보 모터와 STM32F103C8 인터페이스
LPC2148 PWM 및 ADC를 사용하여 서보 모터 제어
서보 모터는 PWM을 사용하여 LPC2148로 제어 할 수 있습니다. 20ms의주기와 50Hz의 주파수로 SERVO의 PWM 핀에 PWM 신호를 제공함으로써 서보 모터의 샤프트를 약 180도 (-90 ~ +90)로 배치 할 수 있습니다.
전위차계는 PWM 신호의 듀티 사이클을 변경하고 서보 모터의 샤프트를 회전시키는 데 사용되며,이 방법은 LPC2148의 ADC 모듈을 사용하여 구현됩니다. 따라서이 튜토리얼에서 구현할 PWM 및 ADC 개념이 모두 필요합니다. ARM7-LPC2148에서 PWM 및 ADC를 배우려면 이전 튜토리얼을 참조하십시오.
- ARM7-LPC2148에서 PWM을 사용하는 방법
- ARM-LPLC2148에서 ADC를 사용하는 방법
ARM7-LPC2148의 PWM 및 ADC 핀
아래 이미지는 LPC2148의 PWM 및 ADC 핀을 보여줍니다. 노란색 상자는 (6) PWM 핀을 나타내고 검은 색 상자는 (14) ADC 핀을 나타냅니다.
필요한 구성 요소
하드웨어
- ARM7-LPC2148
- LCD (16x2) 디스플레이 모듈
- 서보 모터 (SG-90)
- 3.3V 전압 조정기
- 10k 전위차계 (2 Nos)
- 브레드 보드
- 전선 연결
소프트웨어
- Keil uVision5
- 플래시 매직 도구
회로도 및 연결
아래 표 는 서보 모터와 ARM7-LPC2148 간의 연결을 보여줍니다 .
서보 핀 |
ARM7-LPC2148 |
빨간색 (+ 5V) |
+ 5V |
브라운 (GND) |
GND |
주황색 (PWM) |
P0.1 |
핀 P0.1은 LPC2148의 PWM 출력입니다.
아래 표 는 LCD와 ARM7-LPC2148 간의 회로 연결을 보여줍니다.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (등록 선택) |
P0.6 |
E (사용) |
P0.12 |
D4 (데이터 핀 4) |
P0.13 |
D5 (데이터 핀 5) |
P0.14 |
D6 (데이터 핀 6) |
P0.15 |
D7 (데이터 핀 7) |
GND |
VSS, R / W, K |
+ 5V |
VDD, A |
아래 표 는 ARM7 LPC2148과 3.3V 전압 조정기가있는 전위차계 간의 연결을 보여줍니다.
3.3V 전압 조정기 IC |
핀 기능 |
ARM-7 LPC2148 핀 |
1. 왼쪽 핀 |
-GND의 Ve |
GND 핀 |
2. 센터 핀 |
조정 된 + 3.3V 출력 |
전위차계 입력 및 전위차계의 출력을 LPC2148의 P0.28로 |
3. 오른쪽 핀 |
+ 5V에서 Ve 입력 |
+ 5V |
주목할 점
1. 여기서 3.3V의 전압 레귤레이터를 사용하여 LPC2148의 ADC 핀 (P0.28)에 아날로그 입력 값을 제공합니다. 5V 전원을 사용하기 때문에 3.3V의 전압 조정기로 전압을 조정해야합니다.
2. 전위차계는 LPC2148 핀 P0.28에 아날로그 입력 (ADC)을 제공하기 위해 (0V ~ 3.3V) 전압을 변경하는 데 사용됩니다.
3. LPC2148의 P0.1 핀은 서보 모터에 PWM 출력을 제공하여 모터의 위치를 제어합니다.
4. 아날로그 입력 (ADC) 값에 따라 LPC2148의 P0.1에서 PWM 출력 핀을 통해 서보 모터의 위치가 (0 ~ 180도) 변경됩니다.
서보 모터 제어를위한 ARM7-LPC2148 프로그래밍
ARM7-LPC2148을 프로그래밍하려면 keil uVision 및 Flash Magic 도구가 필요합니다. 마이크로 USB 포트를 통해 ARM7 Stick을 프로그래밍하기 위해 USB 케이블을 사용하고 있습니다. Keil을 사용하여 코드를 작성하고 16 진수 파일을 만든 다음 Flash Magic을 사용하여 HEX 파일을 ARM7 스틱에 플래시합니다. keil uVision 및 Flash Magic 설치 및 사용 방법에 대한 자세한 내용은 ARM7 LPC2148 마이크로 컨트롤러 시작하기 링크를 클릭하고 Keil uVision을 사용하여 프로그래밍하십시오.
서보 모터를 제어하기 위해 PWM 및 ADC 용 LPC2148을 구성하는 단계
1 단계: LPC2148 코딩에 필요한 헤더 파일 포함
#포함
2 단계: 다음은 프로그래머가 필요로하는대로 LPC2148의 시스템 클록 및 주변 장치 클록을 설정하므로 클록 생성을 위해 PLL 을 구성하는 것입니다. LPC2148의 최대 클럭 주파수는 60Mhz입니다. 다음 줄은 PLL 클록 생성을 구성하는 데 사용됩니다.
void initilizePLL (void) // 클럭 생성에 PLL을 사용하는 함수 { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; while (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
3 단계: 다음으로 할 일은 PINSEL 레지스터를 사용하여 LPC2148의 PWM 핀과 PWM 기능을 선택하는 것입니다. LPC2148의 PWM 출력에 P0.1을 사용하므로 PINSEL0을 사용합니다.
PINSEL0-= 0x00000008; // LPC2148의 P0.1 핀을 PWM3으로 설정
4 단계: 다음으로 PWMTCR (타이머 제어 레지스터)을 사용하여 타이머를 재설정해야합니다.
PWMTCR = 0x02; // PWM에 대한 카운터 재설정 및 비활성화
다음으로 PWM의 해상도를 결정하는 프리 스케일 값을 설정합니다.
PWMPR = 0x1D; // 레지스터 값 프리 스케일
5 단계:- 다음으로 PWMMR0 및 PWMMR3에 대한 리셋, 인터럽트와 같은 동작을 설정하는 PWMMCR (PWM 일치 제어 레지스터)을 설정합니다.
PWMMCR = 0x00000203; // MR0 일치시 재설정 및 중단, MR3 일치시 중단
6 단계: PWM 채널의 최대주기는 PWMMR0을 사용하여 설정되고 PWM 듀티 사이클의 Ton은 초기에 0.65msec로 설정됩니다.
PWMMR0 = 20000; // PWM 파의 시간, 20msec PWMMR3 = 650; // PWM 파 톤 0.65msec
7 단계: 다음으로 PWMLER를 사용하여 래치 활성화를 해당하는 일치 레지스터로 설정해야합니다.
PWMLER = 0x09; // PWM3 및 PWM0에 대한 래치 활성화
(PWMMR0 및 PWMMR3 사용) 따라서 PWMLER에서 1을 설정하여 해당 비트를 활성화합니다.
8 단계: 핀에 대한 PWM 출력을 활성화하려면 PWMTCR을 사용하여 PWM 타이머 카운터 및 PWM 모드를 활성화해야합니다.
PWMPCR = 0x0800; // PWM3 및 PWM 0 활성화, 단일 에지 제어 PWM PWMTCR = 0x09; // PWM 및 카운터 활성화
9 단계: 이제 ADC 핀 P0.28에서 PWM의 듀티 사이클을 설정하기위한 전위차계 값을 가져와야합니다. 따라서 LPC2148의 ADC 모듈을 사용하여 전위차계 아날로그 입력 (0 ~ 3.3V)을 ADC 값 (0 ~ 1023)으로 변환합니다.
10 단계: - 에 대한 LPC2148의 ADC 핀 P0.28을 선택, 우리는 사용
PINSEL1 = 0x01000000; //P0.28을 ADC INPUT으로 설정 AD0CR = (((14) << 8)-(1 << 21)); // A / D 변환을위한 클럭 및 PDN 설정
다음 줄 은 아날로그 입력 (0 ~ 3.3V)을 캡처하여 디지털 값 (0 ~ 1023)으로 변환합니다. 그런 다음이 디지털 값을 4로 나누어 (0 ~ 255) 로 변환 하고 마지막 으로 LPC2148의 P0.1 핀 에 PWM 출력 으로 공급 합니다. 여기서는 LPC2148의 PWM이 8 비트 분해능을 가지므로 0-1023에서 0-255 값을 4로 나누어 값을 변환합니다 (28).
AD0CR-= (1 << 1); // ADC 레지스터에서 AD0.1 채널 선택 delaytime (10); AD0CR-= (1 << 24); // A / D 변환 시작 while ((AD0DR1 & (1 << 31)) == 0); // ADC 데이터 레지스터에서 DONE 비트 확인 adcvalue = (AD0DR1 >> 6) & 0x3ff; // ADC 데이터 레지스터에서 결과 얻기 dutycycle = adcvalue / 4; // (0에서 255까지) 듀티 사이클 값을 가져 오는 공식 PWMMR1 = dutycycle; // PWM 매칭 레지스터에 듀티 사이클 값 설정 PWMLER- = (1 << 1); // 듀티 사이클 값으로 PWM 출력 활성화
11 단계: 다음으로 LCD (16X2) 디스플레이 모듈에 해당 값을 표시합니다. 그래서 우리는 LCD 디스플레이 모듈을 초기화하기 위해 다음 줄을 추가합니다.
Void LCD_INITILIZE (void) // LCD를 준비하는 기능 { IO0DIR = 0x0000FFF0; //P0.12,P0.13,P0.14,P0.15,P0.4,P0.6 핀을 OUTPUT delaytime (20); LCD_SEND (0x02); // 4 비트 동작 모드로 LCD 초기화 LCD_SEND (0x28); // 2 줄 (16X2) LCD_SEND (0x0C); // 커서를 벗어난 커서에 표시 LCD_SEND (0x06); // 커서 자동 증가 LCD_SEND (0x01); // 클리어 LCD_SEND (0x80); // 첫 줄 첫 번째 위치 }
LPC2148을 사용하여 4 비트 모드에서 LCD를 연결 했으므로 니블 단위로 니블 (Upper Nibble & Lower Nibble)로 표시 할 값을 보내야합니다. 따라서 다음 줄이 사용됩니다.
void LCD_DISPLAY (char * msg) // 전송 된 문자를 하나씩 출력하는 기능 { uint8_t i = 0; while (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0xF0) << 8)); // 상단 니블 전송 IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH to print data IO0CLR = 0x00000020; // RW LOW 쓰기 모드 delaytime (2); IO0CLR = 0x00000040; // EN = 0, RS 및 RW는 변경되지 않음 (예: RS = 1, RW = 0) delaytime (5); IO0PIN = ((IO0PIN & 0xFFFF00FF)-((msg & 0x0F) << 12)); // 하단 니블 전송 IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; 지연 시간 (2); IO0CLR = 0x00000040; 지연 시간 (5); i ++; } }
이러한 ADC 및 PWM 값을 표시하기 위해 int main () 함수 에서 다음 줄을 사용 합니다.
LCD_SEND (0x80); sprintf (displayadc, "adcvalue = % f", 듀티 사이클); LCD_DISPLAY (displayadc); // ADC 값 표시 (0 ~ 1023) angle = (adcvalue / 5.7); // ADC 값을 각도로 변환하는 공식 (o ~ 180도) LCD_SEND (0xC0); sprintf (anglevalue, "ANGLE = %. 2f deg", 각도); LCD_DISPLAY (각도 값);
튜토리얼의 전체 코드와 비디오 설명은 다음과 같습니다.