打印
[技术问答]

定时器控制步进电机正转反转

[复制链接]
1741|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ideafor|  楼主 | 2016-7-3 21:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************51hei************************
硬件结构框架:
1,MCU  STC89C52
2,步进电机驱动芯片ULN2003
显示效果:
1,电机的方向可改变
************************************************/
#include"AT89x52.h"
#define uint unsigned int
#define uchar unsigned char

uchar plus[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x00};   //电机正转
uchar minu[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09,0x00};   //电机反转

sbit key1=P3^1;
bit flag;
uchar idata *x;

void control(bit cf,uchar n)        //电机控制函数,返回变量为方向和步数
{
uchar i;
if(cf==0)x=plus;     //改变电机方向
else x=minu;
for(i=0;i<n;i++)     //记录电机的步数
{
  while(flag==0);
  flag=0;
}
}

void init()    //初始化,开定时器0
{
  TMOD=0x01;
  TCON=0x10;  
  TH0=(65536-5000)/256;   
  TL0=(65536-5000)%256;
  IE=0x82;
}

void timer0() interrupt 1
{
static uchar i;
if(i++>1)         //改变电机的速度
{
  i=0;
      flag=1;                  //设置中断标志
  P1=*x++;                 //数组地址加1
  if(*x==0)x=x-8;       //判断8个控制字后恢复初值
}
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
}

void main()
{
init();
while(1)
{
control(0,200);     //电机正转
control(1,200);     //电机反转
}
}


沙发
zhuotuzi| | 2016-7-29 22:34 | 只看该作者
去读不同的CODE数组。如果只定义一组呢,通过确定是用++,还是用--来区分方向。

使用特权

评论回复
板凳
643757107| | 2016-7-29 23:39 | 只看该作者
结构清晰易懂,非常不错,这个是多少相的步进电机

使用特权

评论回复
地板
heisexingqisi| | 2016-7-30 12:59 | 只看该作者
理论学习这么搞,实际干活的时候基本上就是要用专门的驱动器

使用特权

评论回复
5
598330983| | 2016-7-30 14:35 | 只看该作者
很清晰明了的技术贴,再配图讲解一下步进电机原理更好。

使用特权

评论回复
6
598330983| | 2016-7-30 14:36 | 只看该作者

本帖最后由 csaaa 于 2016-3-23 20:54 编辑


步进电机顾名思义就是一步一步前进的电机了。一般是2个绕组成一个角度分布,假设是普通的步进电机,绕组中间没有抽头,两个绕组分别给电,你就能看到每次给电他就转一个角,这个过程连续起来就走起来了,实际上比这个要复杂些,这么理解就行了。但是应用步进电机,特别是42以上的稍大一点的步进电机,一般都是接个驱动器,由驱动器提供给这两个绕组成比例的电流,你给驱动器输出的就是脉冲就行了。假设步进电机驱动设置为16细分而步进电机步距角是0.9度,那么就是说你给16个脉冲,电机就走完0.9度,同样,如果你只给1个脉冲,他就走0.9/16度这个角度,这个角度是精确的,和舵机不一样,你可以理解为没有误差,没看错就是没有误差。方向怎么办呢,驱动器有一个dir电平,看英文就知道了,这个就是方向了,给高低电平就决定方向,更改方向也简单,除了更改电平外,也可以调换任意一个绕组的两个线。虽然步进电机没有误差,但是遇到足够大的阻力也会堵转,当然堵转电流一般会变小,这点和直流电机不同,堵转的话就会丢步,所以工业上一般都用带伺服器的步进电机
步进电机的难点我认为主要是启动和停止的过程,这个过程需要编程有算法,让步进电机在一个最适合的加速度下启动到指定的速度。简单的都用梯形加速,也有查表用S型加速的。
速度控制是靠输出脉冲的频率控制的

使用特权

评论回复
7
598330983| | 2016-7-30 14:37 | 只看该作者
L298 只是驱动  双H桥 可以同时驱动两个电机,也就可以驱动一个双相的步进电机。L297你可以搜一下,这个是步进电机的脉冲发生器。步进电机相关的原理结构百度有很多的,你用万用表测一下线序,基本是两两相导通的,简单的说当导通这一路有电流了,那么电机就对应的旋转一个角度。然后你顺序的给各个线序通电,这样电机就按照一个一个的角度旋转起来(当然方向得正确)。旋转的速度跟你给的线序(暂时这么说)频率有关(跟电压,占空比没太大关系,一般都是50%),旋转角的精度跟电机结构有关。网上也有步进电机的驱动+分频器(细分器),可以直接用。如果要自己编程,那就是多个波形的对齐输出,一般一根线一个波形,控制的好电机基本就没有抖动和错步,控制的不好那问题就会多了。精度高的还是建议使用细分器吧。

使用特权

评论回复
8
598330983| | 2016-7-30 15:02 | 只看该作者
上个汇编程序的。
自己用仿真器做实验,是一个关于步进电机的简单控制,程序如下:


;功能: P1口控制电机产生脉冲,P2.0,P2.1,P2.3口接查询式键盘控制电机的
;       反转,正转,停止控制。

;接线:P1口接步进电机的P1口,最小系统的p2口接查询式键盘的JD13。

;//****************************************************************
         ORG   0000
STOP:   ORL   P1,  #00H    ; 步进电机停止
LOOP:   MOV   P1,  #00H
        JNB   P2.0,FOR2     ; 如果p2.0按下正转
         JNB   P2.1,REV2     ; 如果p2.1按下反转
         JNB   P2.2,STOP1    ; 如果p2.2按下停止
         JMP   LOOP          ;反复监测键盘
FOR:    MOV   R0,  #00H     ;正转到tab取码指针初值
for1:   MOV   A,R0          ;取码
         MOV   DPTR,#TABLE   ;
         MOVC  A,@A+DPTR
         JZ    FOR           ;是否到了结束码00h
         CPL   A             ;把acc反向
         MOV   P1,A          ;输出到p1开始正转
         JNB   P2.2,STOP1    ;如果p2.2按下停止
         JNB   P2.1,REV2     ;如果p2.1按下正转
         JNB   P2.0,FOR2     ;如果p2.0按下反转
         CALL  DELAY         ;转动的速度1
         INC   R0            ;取下一个码
         JMP   FOR1          ;继续正转
rev:    MOV   R0,#05H       ;反转到tab取码指针初值
rev1:   MOV   A,R0
         MOV   DPTR,#TABLE   ;取码
         MOVC  A,@A+DPTR
         JZ    REV           ;是否到了结束码00h
         CPL   A             ;把acc反向
         MOV   P1,A          ;输出到p1开始反转
         JNB   P2.2,STOP1    ;如果p2.2按下停止
         JNB   P2.1,REV2     ;如果p2.1按下正转
         JNB   P2.0,FOR2     ;如果p2.0按下反转
         CALL  DELAY1         ;转动的速度2
         INC   R0            ;取下一个码
         JMP   REV1          ;继续反转
stop1:  CALL  DELAY         ;按p3.4的消除抖动
         JNB   P2.2,$        ;p2.2放开否?
         MOV   P1,  #00H
        CALL  DELAY         ;放开消除抖动
         JMP   STOP
for2:   CALL  DELAY         ;按p2.0的消除抖动
         JNB   P2.0,$        ;p2.0放开否?
         CALL  DELAY         ;放开消除抖动
         JMP   FOR
rev2:   CALL  DELAY         ;按p2.1的消除抖动
         JNB   P2.1,$        ;p3.3放开否?
         CALL  DELAY         ;放开消除抖动
         JMP   REV

DELAY:  MOV   R1,#150       ;键盘消抖和步进电机转速1
D1:     MOV   R2,#248
         DJNZ  R2,$
         DJNZ  R1,D1
         RET

DELAY1:  MOV   R1,#350       ;步进电机的转速2
D2:     MOV   R2,#348
         DJNZ  R2,$
         DJNZ  R1,D2
         RET

TABLE:
        db 01h,02h,04h,08h  ;正转表
         db 00               ;正转结束
         db 01h,08h,04h,02h  ;反转
         db 00               ;反转结束
         END

使用特权

评论回复
9
huangcunxiake| | 2016-7-31 22:23 | 只看该作者
一般无刷电机,都是有至少三个施加给力点,这三个点就可构成方向性。比如 A B C
你现在为止如果为B的话,那么下个给力点如果是A就是逆时针,如果给力点是C就是顺时针。
而有刷电机全靠惯性,你给顺时针方向,就是顺时针,如果极性颠倒就死逆时针,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

149

帖子

1

粉丝