直流电机 步进电机 伺服电机
生活随笔
收集整理的這篇文章主要介紹了
直流电机 步进电机 伺服电机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ttl ?cmos rs232電平的區別
http://wenku.baidu.com/view/6fa52980d4d8d15abe234ead.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
直流電機
直流電機的轉速與電壓有關系,可以使用pwm調節電壓進而調節轉速。
51單片機沒有帶pwm功能的定時器,只有自己寫代碼了,但也很簡單。一下是定時器產生pwm波形#include<reg52.h> / sbit LED=P0^0; //定義LED端口 int i_high_set;//全局的高電平周期 int i_low_set;//全局的低電平周期 /*------------------------------------------------ 定時器初始化子程序 輸入i_cycle周期ms,比如20ms 輸入i_high高電平ms,比如15ms ------------------------------------------------*/ void Init_Timer0(int i_cycle,int i_high) {TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 /* TH0=0xd8;TL0=0xf0; 10m溢出 *///假設1us一個機器周期i_high_set=65536-i_high*1000;i_low_set=65536-(i_cycle-i_high)*1000;EA=1; //總中斷打開ET0=1; //定時器中斷打開TR0=1; //定時器開關打開 }main() {Init_Timer0(20,15);//周期20ms,高電平占15mswhile(1); }/*------------------------------------------------定時器中斷子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 using 1 {LED=~LED; if(LED)//如果是高電平 {TH0=i_high_set>>8; TL0=i_high_set;}else{//如果是低電平TH0=i_low_set>>8; TL0=i_low_set; } 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
步進電機
arduino mega2560控制步進電機,未使用其stepper類
低電平激勵,共vcc
void setup() ? { ? pinMode(8,OUTPUT); ? pinMode(9,OUTPUT); ? pinMode(10,OUTPUT); ? pinMode(11,OUTPUT); ?digitalWrite(8,LOW); ? digitalWrite(9,LOW); ? digitalWrite(10,LOW); ? digitalWrite(11,LOW); ? } ? void loop() ? { ? /*?//逆時針 digitalWrite(8,LOW); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,LOW); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,LOW); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,LOW); ? delay(10); ?*///順時針? digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,LOW); ? delay(10);?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,LOW); ? digitalWrite(11,HIGH); ? delay(10); ??digitalWrite(8,HIGH); ? digitalWrite(9,LOW); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,LOW); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?} ?
高電平激勵,共地
void setup() { pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } void loop() { /* //逆時針 digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); delay(10); *///順時針 digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); }
接線:
參數
??? 5V
??? 5線4相
??? 步進角5.625°
??? 減速比1/64。
解剖
拿出轉子
可以看到定子有4組線圈,即4相
5線,中間的是公共端
示意圖如下:
假如初始狀態是轉子的1極對著定子的A極,
t=0時,此時僅給AA'線圈通電勵磁,轉子不動,1極仍對著A極
t=1時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近B極且在B極左邊的某個齒對上B極
t=2時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近C極且在C極左邊的某個齒對上C極
t=3時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近D極且在D極左邊的某個齒對上D極
t=4時,此時僅給AA'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近A極且在A極左邊的某個齒對上A極,那個齒就是2了。
此時剛好對4個線圈勵磁一遍,轉子也剛好轉過1個齒的角度,從1齒轉到2齒。所以步距角=齒間角度/拍數=360度/齒數/拍數。拍數此例就是4,當然還有8拍,一般是線圈組數x1或2。
幾個不錯的網頁
28BYJ48內部結構
http://wiki.emsym.com/wiki/28BYJ48
步進電機的驅動原理和驅動電路
http://hi.baidu.com/wqb_lmkj/blog/item/7352b3dfbd5790bacd116681.html?timeStamp=1315721903265
步進電機的一些常識
http://blog.csdn.net/yezhubenyue/article/details/6182495
51單片機控制四相步進電機
http://blog.gkong.com/more.asp?name=sdsplc&id=20740#57352
直流電機H橋驅動原理和驅動電路選擇
http://hi.baidu.com/wqb_lmkj/blog/item/9a66003548ab4bc6a3cc2bf7.html
舵機的原理與單片機的控制
http://hi.baidu.com/wqb_lmkj/blog/item/e598db513e8419150df3e351.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ff
/*******************************test.c**************/ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #define DEBUG #ifdef DEBUG #define DBG(...) printk(" DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); printk(__VA_ARGS__) #else #define DBG(...) #endif #define DEVICE_NAME "stepper_motor" #define delay_time_ms 1000int ret; unsigned long motor_table [] = { S3C2410_GPF(0),//nss out S3C2410_GPF(1),//sck out S3C2410_GPF(2),//mosi out S3C2410_GPF(3),//miso in }; unsigned int motor_cfg_table [] = { S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, }; #define SET_A_HIGH (s3c2410_gpio_setpin(motor_table[0],1)) #define SET_A_LOW (s3c2410_gpio_setpin(motor_table[0],0))#define SET_B_HIGH (s3c2410_gpio_setpin(motor_table[1],1)) #define SET_B_LOW (s3c2410_gpio_setpin(motor_table[1],0))#define SET_C_HIGH (s3c2410_gpio_setpin(motor_table[2],1)) #define SET_C_LOW (s3c2410_gpio_setpin(motor_table[2],0))#define SET_D_HIGH (s3c2410_gpio_setpin(motor_table[3],1)) #define SET_D_LOW (s3c2410_gpio_setpin(motor_table[3],0))ssize_t misc_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { DBG("write \n"); int ret; char *commad=0; if (count == 0) { return count; } commad=kmalloc(count+1,GFP_KERNEL);//need print it using %s, so plus 1 byte for '\0' ret = copy_from_user(commad, buf, count);//if success,ret=0 if (ret) { return ret; } commad[count]='\0'; DBG("commad=%s\n",commad); DBG("ret=%d\n",ret); //to test the command "set to 1" or "clear to 0" if correct 代碼做管腳測試用到 if(strncmp(commad,"SET_A_HIGH",count)==0) {SET_A_HIGH;DBG("excuting SET_A_HIGH succes !\n");} if(strncmp(commad,"SET_A_LOW",count)==0) {SET_A_LOW;DBG("excuting SET_A_LOW succes !\n");} if(strncmp(commad,"SET_B_HIGH",count)==0) {SET_B_HIGH;DBG("excuting SET_B_HIGH succes !\n");} if(strncmp(commad,"SET_B_LOW",count)==0) {SET_B_LOW;DBG("excuting SET_B_LOW succes !\n");} if(strncmp(commad,"SET_C_HIGH",count)==0) {SET_C_HIGH;DBG("excuting SET_C_HIGH succes !\n");} if(strncmp(commad,"SET_C_LOW",count)==0) {SET_C_LOW;DBG("excuting SET_C_LOW succes !\n");} if(strncmp(commad,"SET_D_HIGH",count)==0) {SET_D_HIGH;DBG("excuting SET_D_HIGH succes !\n");} if(strncmp(commad,"SET_D_LOW",count)==0) {SET_D_LOW;DBG("excuting SET_D_LOW succes !\n");} return ret ? ret : count; } ssize_t misc_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { DBG("read \n"); return 0; } static int misc_release(struct inode *inode, struct file *filp) { DBG("release \n"); return 0; } static int misc_open(struct inode *inode, struct file *filp) { DBG("open \n"); return 0; } static int misc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { int i=0; DBG("cmd=%d\n",cmd); DBG("arg=%d\n",arg); if (cmd)// 1,ONE DERECTION { for(i=0;i<arg*1000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;SET_B_LOW;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_HIGH;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_HIGH;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_LOW;SET_D_HIGH;udelay(delay_time_ms);} }else{for(i=0;i<arg*1000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_LOW;SET_B_LOW;SET_C_LOW;SET_D_HIGH;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_HIGH;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_HIGH;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_HIGH;SET_B_LOW;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);}}}static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = misc_open, .read = misc_read, .write = misc_write, .release= misc_release, .ioctl= misc_ioctl, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; int i; for (i = 0; i < 4; i++) {//配置管腳的out in 模式 s3c2410_gpio_cfgpin(motor_table[i], motor_cfg_table[i]); s3c2410_gpio_setpin(motor_table[i], 0); } ret = misc_register(&misc); //InitRc522() ;//初始化 printk (DEVICE_NAME"\tinitialized\n"); //open_flag=0; return ret; } static void __exit dev_exit(void) { DBG (DEVICE_NAME"\texit\n"); misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song.");
/********************************test_app.c**************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/fs.h> #include <errno.h> #include <string.h> #define DEBUG #ifdef DEBUG #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__) #else #define DBG(...) #endif int main(int argc,char* argv[]) { int fd = open(argv[1], 0); if (fd < 0) { perror("open file "); return 1; } ioctl(fd,1,90);DBG("test_app end\n");close(fd); }
測試內核的mdelay,mdelay,udelay函數的精度,使用示波器測量之。
/*******************************test.c**************/ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #define DEBUG #ifdef DEBUG #define DBG(...) printk(" DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); printk(__VA_ARGS__) #else #define DBG(...) #endif #define DEVICE_NAME "stepper_motor" int ret; unsigned long motor_table [] = { S3C2410_GPF(0),//A相 S3C2410_GPF(1),//B相 S3C2410_GPF(2),//C相 S3C2410_GPF(3),//D相 }; unsigned int motor_cfg_table [] = { S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, }; #define SET_A_HIGH (s3c2410_gpio_setpin(motor_table[0],1)) #define SET_A_LOW (s3c2410_gpio_setpin(motor_table[0],0))static int misc_release(struct inode *inode, struct file *filp) { DBG("release \n"); return 0; } static int misc_open(struct inode *inode, struct file *filp) { DBG("open \n"); return 0; } static int misc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { int i=0; DBG("cmd=%d\n",cmd); DBG("arg=%d\n",arg); if (cmd==1)// 1,ONE DERECTION {for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;udelay(arg);SET_A_LOW;udelay(arg);} }else if (cmd==2){for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;mdelay(arg);SET_A_LOW;mdelay(arg);} } else if (cmd==3){for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;ndelay(arg);SET_A_LOW;ndelay(arg);}}}static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = misc_open, //.read = misc_read, //.write = misc_write, .release= misc_release, .ioctl= misc_ioctl, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; int i; for (i = 0; i < 4; i++) {//配置管腳的out in 模式 s3c2410_gpio_cfgpin(motor_table[i], motor_cfg_table[i]); s3c2410_gpio_setpin(motor_table[i], 0); } ret = misc_register(&misc); //InitRc522() ;//初始化 printk (DEVICE_NAME"\tinitialized\n"); //open_flag=0; return ret; } static void __exit dev_exit(void) { DBG (DEVICE_NAME"\texit\n"); misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song.");
ttl ?cmos rs232電平的區別
http://wenku.baidu.com/view/6fa52980d4d8d15abe234ead.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
直流電機
直流電機的轉速與電壓有關系,可以使用pwm調節電壓進而調節轉速。
51單片機沒有帶pwm功能的定時器,只有自己寫代碼了,但也很簡單。一下是定時器產生pwm波形#include<reg52.h> / sbit LED=P0^0; //定義LED端口 int i_high_set;//全局的高電平周期 int i_low_set;//全局的低電平周期 /*------------------------------------------------ 定時器初始化子程序 輸入i_cycle周期ms,比如20ms 輸入i_high高電平ms,比如15ms ------------------------------------------------*/ void Init_Timer0(int i_cycle,int i_high) {TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響 /* TH0=0xd8;TL0=0xf0; 10m溢出 *///假設1us一個機器周期i_high_set=65536-i_high*1000;i_low_set=65536-(i_cycle-i_high)*1000;EA=1; //總中斷打開ET0=1; //定時器中斷打開TR0=1; //定時器開關打開 }main() {Init_Timer0(20,15);//周期20ms,高電平占15mswhile(1); }/*------------------------------------------------定時器中斷子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 using 1 {LED=~LED; if(LED)//如果是高電平 {TH0=i_high_set>>8; TL0=i_high_set;}else{//如果是低電平TH0=i_low_set>>8; TL0=i_low_set; } 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
步進電機
arduino mega2560控制步進電機,未使用其stepper類
低電平激勵,共vcc
void setup() ? { ? pinMode(8,OUTPUT); ? pinMode(9,OUTPUT); ? pinMode(10,OUTPUT); ? pinMode(11,OUTPUT); ?digitalWrite(8,LOW); ? digitalWrite(9,LOW); ? digitalWrite(10,LOW); ? digitalWrite(11,LOW); ? } ? void loop() ? { ? /*?//逆時針 digitalWrite(8,LOW); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,LOW); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,LOW); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,LOW); ? delay(10); ?*///順時針? digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,LOW); ? delay(10);?digitalWrite(8,HIGH); ? digitalWrite(9,HIGH); ? digitalWrite(10,LOW); ? digitalWrite(11,HIGH); ? delay(10); ??digitalWrite(8,HIGH); ? digitalWrite(9,LOW); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?digitalWrite(8,LOW); ? digitalWrite(9,HIGH); ? digitalWrite(10,HIGH); ? digitalWrite(11,HIGH); ? delay(10); ?} ?
高電平激勵,共地
void setup() { pinMode(8,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); } void loop() { /* //逆時針 digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); delay(10); *///順時針 digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,HIGH); delay(10); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,HIGH); digitalWrite(11,LOW); delay(10); digitalWrite(8,LOW); digitalWrite(9,HIGH); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); digitalWrite(8,HIGH); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(10); }
接線:
參數
??? 5V
??? 5線4相
??? 步進角5.625°
??? 減速比1/64。
解剖
拿出轉子
可以看到定子有4組線圈,即4相
5線,中間的是公共端
示意圖如下:
假如初始狀態是轉子的1極對著定子的A極,
t=0時,此時僅給AA'線圈通電勵磁,轉子不動,1極仍對著A極
t=1時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近B極且在B極左邊的某個齒對上B極
t=2時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近C極且在C極左邊的某個齒對上C極
t=3時,此時僅給BB'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近D極且在D極左邊的某個齒對上D極
t=4時,此時僅給AA'線圈通電勵磁,轉子逆時針轉動一點,以至于轉子上最靠近A極且在A極左邊的某個齒對上A極,那個齒就是2了。
此時剛好對4個線圈勵磁一遍,轉子也剛好轉過1個齒的角度,從1齒轉到2齒。所以步距角=齒間角度/拍數=360度/齒數/拍數。拍數此例就是4,當然還有8拍,一般是線圈組數x1或2。
幾個不錯的網頁
28BYJ48內部結構
http://wiki.emsym.com/wiki/28BYJ48
步進電機的驅動原理和驅動電路
http://hi.baidu.com/wqb_lmkj/blog/item/7352b3dfbd5790bacd116681.html?timeStamp=1315721903265
步進電機的一些常識
http://blog.csdn.net/yezhubenyue/article/details/6182495
51單片機控制四相步進電機
http://blog.gkong.com/more.asp?name=sdsplc&id=20740#57352
直流電機H橋驅動原理和驅動電路選擇
http://hi.baidu.com/wqb_lmkj/blog/item/9a66003548ab4bc6a3cc2bf7.html
舵機的原理與單片機的控制
http://hi.baidu.com/wqb_lmkj/blog/item/e598db513e8419150df3e351.html
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
ff
/*******************************test.c**************/ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #define DEBUG #ifdef DEBUG #define DBG(...) printk(" DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); printk(__VA_ARGS__) #else #define DBG(...) #endif #define DEVICE_NAME "stepper_motor" #define delay_time_ms 1000int ret; unsigned long motor_table [] = { S3C2410_GPF(0),//nss out S3C2410_GPF(1),//sck out S3C2410_GPF(2),//mosi out S3C2410_GPF(3),//miso in }; unsigned int motor_cfg_table [] = { S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, }; #define SET_A_HIGH (s3c2410_gpio_setpin(motor_table[0],1)) #define SET_A_LOW (s3c2410_gpio_setpin(motor_table[0],0))#define SET_B_HIGH (s3c2410_gpio_setpin(motor_table[1],1)) #define SET_B_LOW (s3c2410_gpio_setpin(motor_table[1],0))#define SET_C_HIGH (s3c2410_gpio_setpin(motor_table[2],1)) #define SET_C_LOW (s3c2410_gpio_setpin(motor_table[2],0))#define SET_D_HIGH (s3c2410_gpio_setpin(motor_table[3],1)) #define SET_D_LOW (s3c2410_gpio_setpin(motor_table[3],0))ssize_t misc_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { DBG("write \n"); int ret; char *commad=0; if (count == 0) { return count; } commad=kmalloc(count+1,GFP_KERNEL);//need print it using %s, so plus 1 byte for '\0' ret = copy_from_user(commad, buf, count);//if success,ret=0 if (ret) { return ret; } commad[count]='\0'; DBG("commad=%s\n",commad); DBG("ret=%d\n",ret); //to test the command "set to 1" or "clear to 0" if correct 代碼做管腳測試用到 if(strncmp(commad,"SET_A_HIGH",count)==0) {SET_A_HIGH;DBG("excuting SET_A_HIGH succes !\n");} if(strncmp(commad,"SET_A_LOW",count)==0) {SET_A_LOW;DBG("excuting SET_A_LOW succes !\n");} if(strncmp(commad,"SET_B_HIGH",count)==0) {SET_B_HIGH;DBG("excuting SET_B_HIGH succes !\n");} if(strncmp(commad,"SET_B_LOW",count)==0) {SET_B_LOW;DBG("excuting SET_B_LOW succes !\n");} if(strncmp(commad,"SET_C_HIGH",count)==0) {SET_C_HIGH;DBG("excuting SET_C_HIGH succes !\n");} if(strncmp(commad,"SET_C_LOW",count)==0) {SET_C_LOW;DBG("excuting SET_C_LOW succes !\n");} if(strncmp(commad,"SET_D_HIGH",count)==0) {SET_D_HIGH;DBG("excuting SET_D_HIGH succes !\n");} if(strncmp(commad,"SET_D_LOW",count)==0) {SET_D_LOW;DBG("excuting SET_D_LOW succes !\n");} return ret ? ret : count; } ssize_t misc_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { DBG("read \n"); return 0; } static int misc_release(struct inode *inode, struct file *filp) { DBG("release \n"); return 0; } static int misc_open(struct inode *inode, struct file *filp) { DBG("open \n"); return 0; } static int misc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { int i=0; DBG("cmd=%d\n",cmd); DBG("arg=%d\n",arg); if (cmd)// 1,ONE DERECTION { for(i=0;i<arg*1000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;SET_B_LOW;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_HIGH;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_HIGH;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_LOW;SET_D_HIGH;udelay(delay_time_ms);} }else{for(i=0;i<arg*1000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_LOW;SET_B_LOW;SET_C_LOW;SET_D_HIGH;udelay(delay_time_ms);SET_A_LOW;SET_B_LOW;SET_C_HIGH;SET_D_LOW;udelay(delay_time_ms);SET_A_LOW;SET_B_HIGH;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);SET_A_HIGH;SET_B_LOW;SET_C_LOW;SET_D_LOW;udelay(delay_time_ms);}}}static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = misc_open, .read = misc_read, .write = misc_write, .release= misc_release, .ioctl= misc_ioctl, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; int i; for (i = 0; i < 4; i++) {//配置管腳的out in 模式 s3c2410_gpio_cfgpin(motor_table[i], motor_cfg_table[i]); s3c2410_gpio_setpin(motor_table[i], 0); } ret = misc_register(&misc); //InitRc522() ;//初始化 printk (DEVICE_NAME"\tinitialized\n"); //open_flag=0; return ret; } static void __exit dev_exit(void) { DBG (DEVICE_NAME"\texit\n"); misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song.");
/********************************test_app.c**************/ #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ioctl.h> #include <fcntl.h> #include <linux/fs.h> #include <errno.h> #include <string.h> #define DEBUG #ifdef DEBUG #define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__) #else #define DBG(...) #endif int main(int argc,char* argv[]) { int fd = open(argv[1], 0); if (fd < 0) { perror("open file "); return 1; } ioctl(fd,1,90);DBG("test_app end\n");close(fd); }
測試內核的mdelay,mdelay,udelay函數的精度,使用示波器測量之。
/*******************************test.c**************/ #include <linux/miscdevice.h> #include <linux/delay.h> #include <asm/irq.h> #include <mach/regs-gpio.h> #include <mach/hardware.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/mm.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/time.h> #include <linux/timer.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/errno.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/string.h> #include <linux/list.h> #include <linux/pci.h> #include <linux/gpio.h> #include <asm/uaccess.h> #include <asm/atomic.h> #include <asm/unistd.h> #define DEBUG #ifdef DEBUG #define DBG(...) printk(" DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); printk(__VA_ARGS__) #else #define DBG(...) #endif #define DEVICE_NAME "stepper_motor" int ret; unsigned long motor_table [] = { S3C2410_GPF(0),//A相 S3C2410_GPF(1),//B相 S3C2410_GPF(2),//C相 S3C2410_GPF(3),//D相 }; unsigned int motor_cfg_table [] = { S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, S3C2410_GPIO_OUTPUT, }; #define SET_A_HIGH (s3c2410_gpio_setpin(motor_table[0],1)) #define SET_A_LOW (s3c2410_gpio_setpin(motor_table[0],0))static int misc_release(struct inode *inode, struct file *filp) { DBG("release \n"); return 0; } static int misc_open(struct inode *inode, struct file *filp) { DBG("open \n"); return 0; } static int misc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { int i=0; DBG("cmd=%d\n",cmd); DBG("arg=%d\n",arg); if (cmd==1)// 1,ONE DERECTION {for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;udelay(arg);SET_A_LOW;udelay(arg);} }else if (cmd==2){for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;mdelay(arg);SET_A_LOW;mdelay(arg);} } else if (cmd==3){for(i=0;i<10000;i++){DBG("cmd=%d,i=%d\n",cmd,i);SET_A_HIGH;ndelay(arg);SET_A_LOW;ndelay(arg);}}}static struct file_operations dev_fops = { .owner = THIS_MODULE, .open = misc_open, //.read = misc_read, //.write = misc_write, .release= misc_release, .ioctl= misc_ioctl, }; static struct miscdevice misc = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &dev_fops, }; static int __init dev_init(void) { int ret; int i; for (i = 0; i < 4; i++) {//配置管腳的out in 模式 s3c2410_gpio_cfgpin(motor_table[i], motor_cfg_table[i]); s3c2410_gpio_setpin(motor_table[i], 0); } ret = misc_register(&misc); //InitRc522() ;//初始化 printk (DEVICE_NAME"\tinitialized\n"); //open_flag=0; return ret; } static void __exit dev_exit(void) { DBG (DEVICE_NAME"\texit\n"); misc_deregister(&misc); } module_init(dev_init); module_exit(dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Song.");
轉載于:https://www.cnblogs.com/-song/archive/2012/04/14/3331876.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的直流电机 步进电机 伺服电机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSIS数据转换组件_复制转换、数据转换
- 下一篇: Levenshtein算法的JavaSc