关于51单片机控制步进电机编程(c语言),求助

关于51单片机控制步进电机编程(c语言),求助,第1张

#include <reg52h>

#define uchar unsigned char

#define uint unsigned int

uchar key_l,key,i;

uchar code temp1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};

uchar code temp2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};

uchar code aa[16]="               :";

uchar code  smg[]=" shun zhuan    mian    kuai    gen kuai ting zhi  fan  zhuan ";

sbit  e=P2^6;

sbit rs=P2^4;

sbit rw=P2^5;

void delay(int tt)

{

while(tt--);

}

void w_cmd(uchar dd)

{

rs=0;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

delay(50);

}

void w_dat(uchar dd)

{

rs=1;

rw=0;

e=0;

delay(50);

P0=dd;

e=1;

delay(50);

e=0;

}

void init(uchar smg4[],uchar time[])

{

w_cmd(0x38);

delay(2000);

w_cmd(0x38);

delay(500);

w_cmd(0x38);//注意顺序 ,设置工作方式,显示模式设置

delay(500);

w_cmd(0x08);//注意顺序,关闭显示

w_cmd(0x01);//清屏

w_cmd(0x07);//光标·画面滚动模式设置

w_cmd(0x0c);//显示及光标模式设置

w_cmd(0x80);//

for(i=0;i<16;i++)

w_dat(time[i]);

w_cmd(0x80+0X40);

for(i=0;i<16;i++)

w_dat(smg4[i]);

}

void Tb(uchar smg[],uchar n,uchar s,uchar l,uchar d)

{

unsigned char m;

w_cmd(0x82);

for(m=n;m<s;m++)

w_dat(smg[m]);

w_cmd(0x80+0X42);

for(m=l;m<d;m++)

w_dat(smg[m]);

}

void main()

{

init(aa,aa);

while(1)

{

P1=0xf0;

key_l=P1;

if(key_l!=0xf0)

{

   delay(100);

 if(key_l!=0xf0)

 {

   P1=key_l|0x0f;

   key=P1;

 }

}

switch(key)

{

case 0xee: Tb(smg,0,10,11,21);

       for(i=0;i<8;i++)

   {

     P2=temp1[i];

     delay(500);

   }

    break;

case 0xde:Tb(smg,0,10,19,29);

        for(i=0;i<8;i++)

   {

     P2=temp1[i];

     delay(300);

   }

   break;

case 0xbe:Tb(smg,0,10,30,40);

       for(i=0;i<8;i++)

   {

     P2=temp1[i];

     delay(100);

   }

   break;

case 0x7e:P2=0xff;Tb(smg,0,10,39,49);   break;

case 0xed:Tb(smg,50,60,11,21);

      for(i=0;i<8;i++)

   {

     P2=temp2[i];

     delay(200);

   }

   break;

case 0xdd:Tb(smg,50,60,19,29);

    for(i=0;i<8;i++)

   {

     P2=temp2[i];

     delay(120);

   }

   break;

 case 0xbd: P2=0xff;Tb(smg,50,60,40,50);  break;

}

}

}

控制换相顺序:

TABLE_F:

DB 0F1H,0F3H,0F2H,0F6H,0F4H,0FCH,0F8H,0F9H

DB 00 ;正转结束

TABLE_R:

DB 0F9H,0F8H,0FCH,0F4H,0F6H,0F2H,0F3H,0F1H

DB 00 ;反转结束

控制电机的转向

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

MOV DPTR,#TABLE_R

MOVC A,@A+DPTR

MOV P1,A

步进电机的速度控制

DELAY:

MOV R5,RATE

DEL2:

MOV R7,#5

DEL3:

MOV R6,#250

DJNZ R6,$

DJNZ R7,DEL3

DJNZ R5,DEL2

RET

步进电机的总转动角度控制

FFW:

MOV R3,#5

MOV R0,#00H

MOV R1,#12

FFW1:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC RO

JNZ FFW1

MOV RO,#OOH

DJNZ R1,FFW1

MOV R1,#12

DJNZ R3,FFW1

MOV P1,#0F0H

RET

TABLE_F:

DB 0F3H,0F6H,0FCH,0F9H

DB 00H

TABLE_R:

DB 0F9H,0FCH,0F6H,0F3H

DB 00H

步进电机的加减速控制

加速启动

FFW_RISE:

MOV RATE,#10H

MOV R0,#00H

FFW1:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC RO

JNZ FFW1

MOV RO,#00H

MOV A,RATE

DEC A

MOV RATE,A

CJNE A,#1,FFW1

恒速启动

FFW_CONSTANT:

MOV R1,#0FFH

FFW2:

MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DEALY

INC RO

JNZ FFW2

MOV RO,#00H

DJNZ R1,FFW2

减速停止过程

FFW_FALL:

MOV RO,#00H

FFW3: MOV A,R0

MOV DPTR,#TABLE_F

MOVC A,@A+DPTR

MOV P1,A

LCALL DELAY

INC R0

JNZ FFW3

MOV RO,#00H

MOV A,RATE

INC A

MOV RATE,A

CJNE A,#10H,FFW3

RET

设计思路:

1、分析功能需求:四个按键控制步进电机的四种状态,那么必须要在程序中有IO口按键扫描程序;

而且步进电机的控制一定要先设置好定时器。

2、功能模块定义:四个按键对应四个函数,每个函数实现不同功能,对于正反转,先定义控制电机每一步时P0口的数据列表,把列表地址赋给DPTR,即TAB1,和TAB2,分别为正转和反转的数据列表,当按下按键1、2的时候,分别把对应的地址赋给DPTR,然后在定时器1的ISR中,轮询把数据列表中的数据一次发送给P0口控制步进电机;对于按键3、4,就是简单设置TR1,控制定时器1的打开与关闭。

大体思路就是这样,楼主发的这个程序不是很完善,只能实现基本功能,切不可用于实际工程应用,因为没有考虑到按键电流的消斗和按键冲突的处理,所以会不稳定,存在安全隐患

这个是由细分和齿数决定的。

方法一:步进电机细分为1/2,1/3,1/4,1/51/16的计算方法。

首先确定要走的行程或者是齿数。如要走12MM,就是72度,或者是50齿数,每一齿也是=12MM。

其次要确定电机的步距角,下面以50齿数,二相电机细分1/2,步距角18的为例(通常二相电机采用18和72,三相电机采用12)。

计算方法:360/50=72(也就是一齿为72度)

72/12=4(也就是一齿需要4个脉冲)2(以1/2细分为例)=8,也就是一齿需要8个脉冲,假如要走三齿就是24个脉冲。

方法二:步进电机细分为整数(400,500,600)的计算方法。

首先确定要走的行程或者是齿数。如要走12MM,就是72度,或者是50齿数,每一齿也是=12MM。

其次要确定电机的步距角,下面以50齿数,三相电机细分3000,步距角12的为例。

计算方法:360/50=72(也就是一齿为72度)

72/12=6(也就是一齿需要6个脉冲)

360/12=300(也就是一圈需要300个脉冲)

3000/300=106=60,也就是一齿需要60个脉冲,假如要走三齿就是180个脉冲。

注:细分最好使用能除以“一圈所需要的脉冲”等于整数的细分,如3000/300=10

#include<reg51h>

#define uchar unsigned char

sbit key=P3^2;

sbit dir=P0^3;

sbit pluse=P0^2;

sbit en=P0^4;

void delay(int a)

{

    while(a--);

}

main()

{

uchar i;

en=0;

pluse=0;

    while(1)

    {

        if(key==0)

        {

            delay(1000);

            if(key==0);

            {

                while(key==0);

                for(i=0;i<200;i++)

                {

                    dir=0;

                    en=1;

                    pluse=~pluse;

                    delay(800);

                }

            }

        }

    dir=1;

    en=0;

    pluse=0;

    }

}

以上就是关于关于51单片机控制步进电机编程(c语言),求助全部的内容,包括:关于51单片机控制步进电机编程(c语言),求助、5V步进电机 28YBJ-48驱动电路设计程序怎么写、51系列单片机 程序设计 用4个开关控制步进电机进行启动停止正转和反转等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9333749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存