Zynq SoC Training – Stepper Motor Control

Acknowledgement (Korean)
아래의 글은 Ali Aljaani가 운영하는 블로그인 embedded centric의 “Zynq SoC Training”을 번역한 문서입니다. 한글 번역 및 공개를 허용한 Ali Aljaani에게 감사의 말을 전합니다.

Acknowledgement (English)
This post is a translated version of “Zynq SoC training” in embedded centric. Thank you Ali Aljaani for allowing me to translate nice posts. I’m Taekyung Heo, and I translated this post into Korean.

Contact information (Author)
Ali Aljaani’s blog: http://embeddedcentric.com/
Ali Aljaani’s mail: alialjaani@embeddedcentric.com
Ali Aljaani’s LinkedIn: https://www.linkedin.com/in/ali-aljaani-a7130099
Ali Aljaani’s github: https://github.com/ama142


이번 실습에서는 bipolar stepper motor에 대해 학습할 것이다. Digilent에서 개발한 PmodSTEP을사용해 전기적으로 stepper motor를 구동할 것이다 (bipolar, 1.8도/step, 0.33A, 12V). PmodSTEP 보드는 ZedBoard의 Pmod 커넥터(JA1)을 사용해 연결할 것이다. PmodSTEP의 연결을 위한 물리적인 제약 사항에 대해서 설명할 것이다. 이번 실습에서는 ZedBoard의 푸쉬 버튼을 누르면 모터의 방향과 속도를 조절할 수 있는 어플리케이션을 개발할 것이다.

design-flow-lab9


Design Flow-Lab9


block-diagram-lab9


Block Diagram-Lab9


board-interface-lab9


Board Interface-Lab9

배경 지식
A. Stepper Motor
Stepper motor는 다양한 어플리케이션에서 정확한 위치 조정을 위해 사용된다 (로보틱스, 디스크 드라이브, 프린터 등). Stepper motor는 그 내부에 자기화된 로터와 네 개의 전자석을 갖고 있다. 전자석 코일에 전원이 공급될 때 자기장이 어떻게 형성되느냐에 따라, 자기력이 로터에 작용하고 이를 회전하게 만든다. 로터를 회전하게 만들려면, 전자석은 특정한 step 신호에 따라 자기화되어야 한다. Step 신호는 일반적으로 임베디드 시스템에서 생성한다. 그 순서는 시계 방향일 수도 있고, 반시계 방향일 수도 있다. 한 번에 한 개의 코일이 자기화되는 것이 일반적이고, 더 큰 토크를 생성하기 위해서 두 개를 사용할 수도 있다 (이번 실습에서는 한 번에 두 개의 코일을 자기화할 것이다). 이번 실습에서는 어플리케이션은 ARM 프로세서에서 실행되면서 푸쉬 버튼이 눌리는지 확인한다. 푸쉬 버튼이 눌리면 특정한 순서에 따라 신호를 GPIO에 전달해, 모터 구동 보드인(PmodSTEP)을 동작시킨다. 이 때 생성되는 신호는 어떤 푸쉬 버튼이 눌렸는지에 따라 결정된다.

steppermotor_animation


Stepper Motor Rotating CW Triggering Sequence


Stepper motor는 다양한 크기와 특성을 갖고 생성된다: 최대로 생성할 수 있는 토크, 기어, 전압, 전류, 상태, 제공하는 step의 수 등이 다르다. Step이 많을수록 더 높은 해상도를 가지며, 한 step마다 더 적은 각도를 이동하게 된다. 상업적으로 생산되는 stepper motor는 일반적으로 24, 48, 또는 200개의 step을 갖는다. Step 당 1.8도를 이동한다면, 한 회전에 200 step이 필요하다.
stepper-motors


Different Types of Stepper Motors


이번 실습에서 사용하는 stepper motor는 Mercury Motor에서 개발한 SM-42BYG011-25이다. 이는 단순하지만 매우 강력한 bipolar (2 개의 상태를 갖는) stepper motor이다. 이 stepper motor는 네 개의 배선을 갖는다.

stepper-motor-used-in-lab9-sm-42byg011-251


SM-42BYG011-25 Stepper Motor

sm-42byg011-25-wiring-diagram2


SM-42BYG011-25 Wiring Diagram


이 모터의 specification은 다음과 같다.

  • Resolution (degrees) : 1.8
  • Phases : 2
  • Rated Voltage : 12V
  • Rated Current : 0.33A
  • Holding Torque : 2.3kg*cm
  • Diameter Drive Shaft: 5mm
  • Winding resistance: 32.6 Ω
  • Total inertia (kg.m.m): 3.5 Kg.m.m
  • Total friction (kg.m/s): 4 Kg.m/s
  • Motor Width: 42mm (1.67″)

이 모터는 인접한 코일에 같은 극성을 동시에 인가함으로써 동작한다.

energizing-sequence


Energizing Sequence


ARM에서 실행되는 어플리케이션에는 네 개의 핵심 함수가 있다.

step_cw()는 모터를 시계 방향으로 7.2도 회전하게끔 한다 (4×1.8). 이는 위 그림과 동일한 순서로 모터를 회전시킨다.

step_ccw()는 모터를 반시계 방향으로 7.2도 회전하게끔 한다 (4×1.8). 이는 위 그림의 반대 순서로 모터를 회전 시킨다.

step_cw-and-step_ccw-functions1


step_cw and step_ccw functions


이 두 개의 함수는 GPIO 쓰기 함수 (XGpio_DiscreteWrite)를 사용해 신호를 JA1 Pmod 커넥터에 연결된 PmodSTEP 보드에 전송한다. 지연을 줌으로써 회전 속도를 조절할 수 있다. delay 함수 내에 정의된 #define SPEED를 변경함으로써 모터의 회전 속도를 변경할 수 있다.

rotate360_cw()rotate360_ccw() 함수는 그 이름에서 알 수 있듯이, 시계 방향 또는 반시계 방향으로 360도를 회전시킨다. 내부적이로 이 함수들은 step_cw() 또는 step_ccw() 함수를 50번 호출한다 (50×7.2 = 360)

rotate360_cw-and-rotate360_ccw-functions


rotate360_cw() and rotate360_ccw() functions


B. PmodStep (Stepper 모터 구동 보드)
Stepper motor는 ZedBoard가 공급할 수 있는 전력보다 더 많은 전력을 소모한다. 따라서 모터는 외부로부터 구동되는 회로에 의해 전력을 공급받아야 한다. Digilent에서 개발한 PmodSTEP은 stepper motor를 쉽게 구동시키기 위해 설계되었다. 이는 호스트 보드와 12-pin Pmod 커넥터로 연결된다. 이는 네 개의 채널 전력 증폭기를 갖고 있으며, 채널 당 600mA까지 높일 수 있다. 따라서 모터 구동에 필요한 330mA를 충분히 넘는다. PmodSTEP은 또한 여덟 개의 디지털 입출력 신호를 갖고 있으며, 각 신호에 대한 상태를 보여준다. 이번 실습에서는 네 개의 신호만 사용한다: JA7, JA8, JA9, JA10이다. 각각은 LEDH, LEDG, LEDF, LEDE에 해당한다. PmodSTEP은 12V의 DC 전력 공급 장치에 의해 구동된다.
pmodstep


PmodSTEP – Stepper Motor Drive Board

power-ampilifier


PmodSTEP Simplified Wiring Diagram

목표
1. Stepper motor 구조 및 제어 방법에 대해 학습
2. PmodSTEP 구동 보드를 학습하고, 그 기능에 대해 이해
3. ZedBoard에 외부 컴포넌트를 붙이는 방법 연습

실습 단계
A. Vivado에서 프로젝트를 생성하고 target board로 ZedBoard 선택
실습 1의 실습 단계 A의 다섯 단계를 동일하게 수행한다. 단, 프로젝트 이름은 “lab9″로 한다.

B. IP integrator를 사용해 임베디드 프로세서 프로젝트 생성
실습 1의 실습 단계 B의 네 단계를 동일하게 수행한다.

C. ZYNQ7 Processing System 설정
실습 1의 실습 단계 C의 다섯 단계를 동일하게 수행한다.

D. Stepper motor에 사용하기 위한 GPIO 추가
이 GPIO는 ZedBoard의 JA1 Pmod 커넥터와 연결된다. 구체적으로는 JA7-JA10을 사용한다.

ja1-pmod-connector


JA1 Pmod Connector- Zedboard


1. Add IP wiard를 클릭한다. IP를 추가할 수 있는 IP catalog 창이 뜰 것이다. 탐색 창에 “gpio”를 입력한 뒤, AXI GPIO를 더블 클릭해 설계에 추가한다.
block-diagram-after-adding-gpio1


Block diagram after adding GPIO


2. axi_gpio_0를 더블 클릭해 재설정한다. IP Configuration 탭에서 All Outputs를 선택하고 GPIO Width를 4로 설정한다. OK를 클릭해 Re-customize IP 창을 닫는다.
configure-axi_gpio_0


Configure axi_gpio_0


3. GPIO 포트 위에 마우스를 올려 연필 모양이 되도록 한다. 우클릭한 뒤, Make External을 선택한다. 이제 블록 다이어그램은 다음과 같은 모양이 된다.
block-diagram-after-configuring-gpio


Block diagram after Configuring GPIO


E. 푸쉬 버튼을 위한 GPIO 추가
1. Add IP wizrd를 클릭한다. IP들을 추가할 수 있는 IP catalog 창이 뜰 것이다. 탐색창에 “gpio”를 입력하고, AXI GPIO를 더블 클릭해 추가한다.
2. 다이어그램 창의 좌측 상단에 Designer Assistance를 사용할 수 있음을 볼 수 있다. Run Connection Automation를 클릭한다. Run Connection Automation 창이 뜨면, All Automation을 선택한다 (세 개 모두를 선택한다).
run-automation3-out-of-3-selected


Run Connection Automation(3 out of 3 selected)


S_AXI Clock Connections를 기본 값인 Auto로 설정하고, axi_gpio_1GPIObtns_5bits로 설정한다.
run-connection-automations_axi


Run Connection Automation(S_AXI- axi_gpio_0)


run-connection-automations_axi-axi_gpio_1


Run Connection Automation(S_AXI- axi_gpio_1)


run-connection-automationgpio-axi_gpio_1


Run Connection Automation(GPIO- axi_gpio_1)


3. 다이어그램 창의 빈 곳을 우클릭한 뒤, Regenerate layout을 선택한다. 이제 블록 다이어그램은 다음과 같다:
block-diagram-after-adding-and-configuring-two-gpios


Block diagram after adding and configuring two GPIOs


F. 물리적인 제약 조건 추가
1. Flow Navigator 창의 Project Manager 섹션에서 Add Sources를 클릭한다.
add-sources3


Add Sources


2. Add Sources 창이 뜰 것이다. Add or Create Constraints를 선택한다.
add-or-create-constraints


Add or Create constraints


3. Next를 클릭한 뒤, 초록색 더하기 심볼을 누르고 Create File을 선택한다.
create-a-new-constraint-file


Create a new constraint file


다음 창에서 File type으로 XDC를 선택하고, File name으로 stepper_motor를 입력한다.
name-new-constraints-file-stepper_motor


Name new constraints file : stepper_motor


OK를 클릭한 뒤, Finish를 눌러 대화창을 닫고 파일을 생성한다. Sources 탭에서 Constraints 그룹을 확장하고 새롭게 생성한 XDC 파일인 stepper_motor.xdc를 더블 클릭한다.
sources-pane-with-stepper_motor-selected


Sources pane with stepper_motor selected


다음의 코드를 해당 파일에 추가하거나, 내 GitHub 페이지에서 다운로드할 수 있다.

set_property PACKAGE_PIN AA8 [get_ports {gpio_tri_o[3]}]
set_property PACKAGE_PIN AB9 [get_ports {gpio_tri_o[2]}]
set_property PACKAGE_PIN AB11 [get_ports {gpio_tri_o[0]}]
set_property PACKAGE_PIN AB10 [get_ports {gpio_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {gpio_tri_o[0]}]

파일을 저장한다. 이로써 물리적인 제약이 GPIO 포트를 칩의 Pmode 커넥터의 JA7, JA8, JA9, JA10, JA10에 연결하게 된다.

G. Bitstream 생성
1. Sources 창에서 system.bd을 우클릭하고, Create HDL Wrapper를 선택해 블록 다이어그램에 대한 Verilog 파일을 생성한다. 다음 메시지가 뜨면 Let Vivado manage wrapper and auto-update을 선택한다. 소스 구조 최상단에 system_wrapper.v이 생성된다.

create-hdl-wrapper1


Create HDL Wrapper


2. Flow Navigator 창의 Program and Debug 섹션에서 Generate Bitstream을 클릭한다. 수정 사항을 저장하겠느냐고 물으면 Save를 클릭한다.
generating-bitstream1


Generating Bitstream


Bitstream의 생성에는 컴퓨터 성능에 따라 다소의 시간이 걸릴 것이다. Bitstream의 생성이 끝나면 대화 상자에서 View Reports를 선택하고, OK를 클릭한다.

H. SDK에 하드웨어 설계 내보내기
1. File > Export > Export Hardware를 클릭한 뒤, Include bistream을 선택한다.

export-hardware-to-sdk


Export Hardware to SDK


2. File>Launch SDK를 선택한다. SDK가 열릴 것이며, 이제 IP와 관련된 모든 파일이 SDK에 내보내졌다.

I. SDK에서 작업하기
1. SDK에서 File > New > Application Project를 선택한다.
2. 다음 창에서 다음과 같이 인자값을 입력한다:

new-standalone-c-project-e28093-stepper_test


New Standalone C Project – stepper_test


다음 창에서 Empty Application을 선택하고, Finish를 클릭한다. 이제 BSP와 관련 드라이버가 빌드될 것이다.

3. stepper_test 디렉토리를 확장하고, src 디렉토리를 우클릭한다. New->Source File를 클릭한다.

new-c-source-file-e28093-lab9


New C Source File – lab9.c

4. 다음 창이 뜨면 Source file에 “lab9.c”를 입력하고 Finish를 클릭한다. 이로써 src 디렉토리에 빈 C 파일이 생성된다.

lab9-c-empty-source-file-created-in-sdk


lab9.c empty source file created in SDK

5. lab9.c의 편집창에 lab9.c의 내용을 붙여넣는다 (내 GitHub 페이지에서 다운로드할 수 있다). Save를 클릭하거나 Ctrl+S를 눌러 저장한다. 어플리케이션과 드라이버가 빌드된 뒤, 실행 파일이 생성된다. 이 실행 파일은 PS-side의 ARM 프로세서에서 실행 가능하다.

J. Bitstream을 다운로드하고 어플리케이션을 실행하기
1. Xilinx Tools-> Program FPGA를 클릭해 Bitstream을 다운로드한다 (수 초가 소요된다).
program-fpga

2. stepper_test 프로젝트의 디렉토리-> Run As-> Launch on Hardware (GDB)를 클릭해 stepper_test 어플리케이션을 ARM 프로세서에서 실행한다.

run-application-on-arm-processor


Run application on ARM processor


STEPmod 연결이 다음과 같아야 한다: Pmod 12-핀 케이블이 ZedBoard에 Stepmod에 연결되어야 한다 (이 케이블은 STEPmod에 따라오며, 이를 사용하기 위해서는 male-male c변환기를 ZedBoard에 붙여야 한다). 모터 사용을 위해서는, 헤더를 따로 구매해야 한다.
stepmod1


STEPmod Connections


pmod-cable-12-pin


Pmod Cable -12 pin


이제 모터를 다음과 같이 제어할 수 있다:

우측 푸쉬 버튼: 시계 방향으로 7.2도 회전
좌측 푸쉬 버튼: 반시계 방향으로 7.2도 회전
상단 푸쉬 버튼: 시계 방향으로 360도 회전
하단 푸쉬 버튼: 반시계 방향으로 360도 회전


이로써 아홉 번째 실습인 Stepper Motor Control을 마친다. 이번 실습에 대한 해답은 여기에 있다.


Advertisements
Tagged with: , , , , , , , , , , , ,
Posted in FPGA

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

누적 방문자 수
  • 98,786 hits
%d bloggers like this: