、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
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

直流电机 步进电机 伺服电机相关推荐

  1. 直流电机/步进电机/伺服电机 简介

    电机,俗称"马达",根据电磁感应定律实现电能转换或传递的电磁装置,包括电动机(电能转换成机械能).发电机(机械能转换成电能) 1. 直流电机 直流(有刷)电机,简称BDC,其结构简 ...

  2. arduino笔记41:直流电机 + 步进电机参数、原理

    目录 一.电机基本结构与工作原理 二.直流电机 有刷直流电机(BDC)主要参数 控制转速 三.arduino驱动直流电机 四.步进电机 双极性步进电机 步进电机基本参数 步进电机分类 一.电机基本结构 ...

  3. 直流电机,伺服电机和步进电机的区别

    直流电机 直流电机是两线连续旋转电动机,两线分别是电源和地线.接通电源后,直流电机将开始旋转,直到断开电源,大多数直流电机都以每分钟高转数(RPM)运转. 可以通过使用PWM来控制(脉冲宽度调制)技术 ...

  4. 用MATLAB程序控制伺服电机,使用MATLAB和Arduino开发板进行步进电机控制

    步进电机是一种无刷直流电机,可以分步旋转,是许多精密运动控制应用的最佳选择.此外,步进电机适用于定位.速度控制和低速需要大扭矩的应用. 在之前的MATLAB教程中,我们已经介绍了如何使用MATLAB来 ...

  5. 基于51单片机直流电机PWM调速设计

    具体实现功能 系统由STC89C52单片机.LCD1602液晶显示屏.霍尔测速传感器.3V直流电机.按键模块构成. 具体功能: 1.采用霍尔传感器非接触式测电机转速: 2.LCD1602液晶显示当前的 ...

  6. 步进伺服电机加减速 及 位置速度控制关键程序

    对于经常接触单片机控制步进电机 伺服电机的工程师来说, 步进电机加减速可以有各种实现方法, 本来有可以用的驱动, 可是我总感觉有什么不完善的地方, 抽时间写了个感觉功能足够完善的, 共享一下, 也希望 ...

  7. STM32驱动步进电机(最全的版本寄存器+HAL库实现)

    步进电机 1 简介 1.1 什么是步进电机 1.2 步进电机和直流电机区别 1.3 器材与配置 1.3.1 步进电机 1.3.2 驱动器 1.3.3 引脚 2 定时器的 3 驱动代码 3.1 初始化 ...

  8. DFRobot的产品

    http://www.dfrobot.com.cn/goods-825.html Arduino/树莓派/Intel Intel Edison系列 控制器及周边 Arduino控制器 Arduino扩 ...

  9. 基于STM32的电机--电机概述

    文章目录 电机 直流有刷电机 步进电机 伺服电机 直流无刷电机 舵机 电机 电机:俗称"马达",依据电磁感应定律实现 电能转换或传递 的一种电磁装置.包括:电动机和发电机. 电动机 ...

最新文章

  1. echarts 饼图每块颜色_读者提问,如何让 tooltip 提示框内显示饼图
  2. TC 2.0 学习总结
  3. android studio安装教程博客园独王,Android Studio安装与配置
  4. 用计算路由的方法优化BI后台性能
  5. .svc接口客户端调用_K8s:调用Java接口创建容器
  6. shipyard中文版发布
  7. Bailian2797 最短前缀【字典树】
  8. python notebook 在加载ipynb文件 报错NotJSONError(‘Notebook does not appear to be JSON: \‘\\ufeff{“nbformat“
  9. python控制电机_如何用Python控制LEGO Wedo 2.0的电机
  10. 老路MBA商学课|第003课:沉没成本|因为来都来了,所以将错就错
  11. 【FPGA教程案例61】硬件开发板调试1——初识FPGA开发板,通过verilog控制LED灯,按键开关等
  12. 怎样更换计算机主板电池,如何更换电脑主板电池
  13. Java实现PDF文件转图片(支持单页和多页)
  14. 从外包公司到今日头条offer,吐血整理
  15. 解决mysql报Lock wait timeout exceeded; try restarting transaction的问题
  16. struct所占的内存
  17. java -ArrayList的用法实例--学生宿舍管理系统
  18. word图文混排复制到wangEditor图片不显示
  19. 新启动计算机顺序,最新版本:计算机启动启动项设置
  20. uniapp实现吸顶效果、滚动吸顶(分类、筛选、排序、搜索等滚动到顶部自动固定、吸顶)

热门文章

  1. XAMPP Apache + MySQL + PHP + Perl
  2. java集合类详细概述
  3. Action和Func的区别
  4. linux内核的反复--一切都是过程
  5. ClearTextBox.Text
  6. RAC+单实例DATAGUARD 配置
  7. RAC测试及命令示例
  8. Android开发中java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}: java.lang.NullPoi
  9. android byte的使用
  10. 创建可调试,热加载的TypeScript+Koa工程