Download presentation
Presentation is loading. Please wait.
1
Stepper Motor 디바이스 드라이버
Lecture #14
2
목 차 Stepper Motor구동 원리 Stepper Motor 디바이스 드라이버 Stepper Motor 응용 프로그램
3
Stepper Motor 개요 (1) 디지털 펄스를 기게적인 축 운동으로 변환시키는 디지털 엑추에이터
디지털 소스에서 펄스를 가하면 모터 축을 펄스의 주파수 및 펄스 수에 따라 정해 진 속도로 정해진 각도로 회전한다 AC servo 또는 DC servo motor에 비하여 정확한 각도 제어에 유리 하여 많이 사용 Stepper Motor, Stepping Motor, Pulse Motor 장점: 디지털 신호로 직접 open loop 제어를 할 수 있고 전반저긍로 간단하게 구동 회전속도는 펄스 신호의 주파수에 비례, 회전각도는 입력 펄스의 수에 비례 기동, 정지, 정-역회전, 변속이 용이하며 응답 특성도 양호 고토크, 고속 응답, 소형 경량, 미소각, 고정도, 저가격 단점: 고속 운전시 탈조가 쉽다 특정 주파수에서는 진공, 공진현상이 발생하기 쉽고 관성이 있는 부하에 약한다 펄스 비가 상승하면 토크가 저하하며 DC servo motor에 비해 효율이 떨어진다
4
Stepper Motor 개요 (2)
5
Stepper Motor 구조 및 동작 방식 Stepper Motor 구조
고정자(Stator) – 모터 내부의 장착된 코일, 모터의 위상(phase)을 결정, 전원 공급시 에 전자기력을 생성 회전자(Rotator) – 전자기력에 의해 회전하는 축, 회전축의 회전에 따라 역기전압이 발생, 입력 전압과 반대방향으로 서로 상쇄하여 전류 흐름을 제한 A. 4상 스텝 모터 B. 5상 스텝 모터
6
Stepper Motor 제어 (1) Stepper Motor 제어 포트의 물리 주소
0xC000000C Stepper Motor 제어 데이터 bit Bit 7 6 5 4 3 2 1 Stepper Motor nB B nA Step1 A Step2
7
Stepper Motor 제어 (2) Stepper Motor – Half Step Operation
Stepper Motor – Full Step Operation Sequence Input Output A nA B nB 1 1(H) 0(L) 2 3 4 Sequence Input Output A nA B nB 1 1(H) 0(L) AB 2 nAB 3 nAnB 4 AnB
8
PXA255-FPGA – Stepper Motor 회로 구성(1)
9
PXA255-FPGA – Stepper Motor 회로 구성(2)
10
PXA255-FPGA – Stepper Motor 회로 구성(3)
11
PXA255-FPGA – Stepper Motor 회로 구성(4)
12
Stepper Motor Device Driver – 매크로/전역 변수 (stepmotor_driver.c)
#include <linux/kernel.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/version.h> #include <linux/delay.h> #include <linux/ioport.h> #include <asm-arm/io.h> #include <asm-arm/uaccess.h> #define IOM_STEP_MAJOR 269 // ioboard step device major number #define IOM_STEP_NAME "STEP" // ioboard step device name #define IOM_STEP_ADDRESS 0x0C00000C // pysical address #define A (unsigned short)(0x1) #define AB (unsigned short)(0x5) #define B (unsigned short)(0x4) #define _AB (unsigned short)(0x6) #define _A (unsigned short)(0x2) #define _A_B (unsigned short)(0xa) #define _B (unsigned short)(0x8) #define A_B (unsigned short)(0x9) //Global variable static int stepport_usage = 0; static unsigned short *iom_step_addr;
13
Stepper Motor Device Driver – 매크로/전역 변수 (stepmotor_driver.c)
// define functions... ssize_t iom_step_write(struct file *inode, const char *gdata, size_t length, loff_t *off_what); int iom_step_open(struct inode *minode, struct file *mfile); int iom_step_release(struct inode *minode, struct file *mfile); // define file_operations structure struct file_operations iom_step_fops = { open: iom_step_open, write: iom_step_write, release: iom_step_release, };
14
Stepper Motor Device Driver – open/release (stepmotor_driver.c)
// when step device open ,call this function int iom_step_open(struct inode *minode, struct file *mfile) { if(stepport_usage != 0) return -EBUSY; stepport_usage = 1; return 0; } // when step device close ,call this function int iom_step_release(struct inode *minode, struct file *mfile) stepport_usage = 0;
15
Stepper Motor Device Driver – write (stepmotor_driver.c)
// when write to step device ,call this function ssize_t iom_step_write(struct file *inode, const char *gdata, size_t length, loff_t *off_what) { unsigned short speed; const char *tmp = gdata; if (copy_from_user(&speed, tmp, 2)) return -EFAULT; outw(A,iom_step_addr); udelay(speed); outw(B,iom_step_addr); outw(_A,iom_step_addr); outw(_B,iom_step_addr); return length; }
16
Stepper Motor Device Driver – init/cleanup (stepmotor_driver.c)
int __init iom_step_init(void) { int result; result = register_chrdev(IOM_STEP_MAJOR, IOM_STEP_NAME, &iom_step_fops); if(result < 0) { printk(KERN_WARNING"Can't get any major\n"); return result; } iom_step_addr = ioremap(IOM_STEP_ADDRESS, 0x2); printk("init module, %s major number : %d\n", IOM_STEP_NAME,IOM_STEP_MAJOR); return 0; void __exit iom_step_exit(void) iounmap(iom_step_addr); if(unregister_chrdev(IOM_STEP_MAJOR, IOM_STEP_NAME)) printk(KERN_WARNING"%s DRIVER CLEANUP FALLED\n", IOM_STEP_NAME); module_init(iom_step_init); module_exit(iom_step_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Huins");
17
Stepper Motor Device Driver – 테스트 프로그램 (test_stepmotor.c)
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> int main(void) { int fd,id; unsigned int b_delay; unsigned short c = 0xffff; fd = open("/dev/STEP", O_WRONLY); if (fd < 0){ printf("Device Open Error\n"); exit(1); } while(1) { if(c < 0x1000) c = 0x1000; else c -= 0x100; write(fd, &c, 2); close(fd); return 0;
18
Stepper Motor Device Driver – Makefile
#Makefile for a basic kernel module obj-m := stepmotor_driver.o KDIR :=/root/pxa255-pro3/kernel/linux PWD :=$(shell pwd) all: driver app driver: $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules app: arm-linux-gcc -o test_stepmotor test_stepmotor.c clean: rm -rf *.ko rm -rf *.mod.* rm -rf *.o rm -rf test_stepmotor rm -rf Module.symvers
19
Stepper Motor Device Driver – Testing
타겟보드를 부팅한 후 드라이버 모듈과 테스트 프로그램을 nfs 마운 트 디렉토리에 복사한 후에 아래와 같이 진행한다. # insmod ./stepmotor_driver.ko init module, STEP major number : 269 # mknod /dev/STEP c 269 0 # ./test_stepmotor
Similar presentations