直流电机 步进电机 伺服电机

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
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,高电平占15ms
 while(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 1000

int 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.");   


posted on 2012-04-14 17:21  _song  阅读(518)  评论(0编辑  收藏  举报