⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 motor_dri.c

📁 步进电机控制主机程序,与步进电机控制副机程序配合使用。
💻 C
字号:
#pragma small
#include "reg66x.h"
#include "motor_dri.h"
#include "electromotion.h"

//电机驱动器设定:400步一圈,单脉冲方式,半电流,输出电流选择最大。
unsigned int motor_degree[5]={2048,1024,512,384,340};     		//五级变速调控
bit motor_runing=0;                                              //==1电机在转
bit timer0_end_flag=1;                                          //==1定时结束,可以走下一步
bit run_next_cycle=0;											//一个呼吸周期标志
unsigned int timer_cycle = 0;									//一个呼吸周期中循环1ms的个数

/************************步进电机驱动程序*****************/
/*********************************************************
函数名称:motor_driver()
功能描述:根据提供的速度.脉冲步数和方向,做出实时的处理.
被调用的函数列表:无
参数说明:
返 回 值:
注    释:
**********************************************************/
bit motor_driver(unsigned int motor_speed,unsigned int motor_pulse,bit motor_direct)
{
    unsigned int i,temp;
    P1_1=motor_direct;                                           //==1正转;
    P1_4=0;
    P1_5=1;

    if(motor_pulse>200)
    {
        motor_pulse-=200;
		temp=65535-motor_speed-30*100;
        for(i=0;i<100;i++)
        {
            TH0=temp/256;
            TL0=temp%256;
	    	temp+=30;
            TR0=1;
            timer0_end_flag=0;
            while(!timer0_end_flag);
        }
		temp=65535-motor_speed;
        for(i=motor_pulse;i>0;i--)
        {
            TH0=temp/256;
            TL0=temp%256;
            TR0=1;
            timer0_end_flag=0;
            while(!timer0_end_flag);
        }
		temp=65535-motor_speed;
        for(i=100;i>0;i--)
        {
            TH0=temp/256;
            TL0=temp%256;
			temp-=30;
            TR0=1;
            timer0_end_flag=0;
            while(!timer0_end_flag);
        }
        motor_pulse=0;
		return(1);
    }
    else
    {
        if(motor_speed<motor_degree[1])
        {
            temp=65535-motor_degree[1];
            for(i=0;i<motor_pulse;i++)
            {
                TH0=temp/256;
                TL0=temp%256;
                TR0=1;
                timer0_end_flag=0;
                while(!timer0_end_flag);
            }    
        }
        else
        {
        	temp=65535-motor_speed;
            for(i=0;i<motor_pulse;i++)
            {
                TH0=temp/256;
                TL0=temp%256;
                TR0=1;
                timer0_end_flag=0;
                while(!timer0_end_flag);
            }
        }
        motor_pulse=0;
	 	return(1);
    }
}

//定时器初始化
void init_timer(void)
{
	//T0用作计数器计数流量计
    TMOD = 0x05; 			//方式1
    TR0  = 0;
	IEN0 = 0x80;
	TCON = 0;

	//T1用作波特率发生器
 	TMOD 	|= 0x20;	   	//方式2
	TH1 = TL1 = 0xF3;		//12M下2400
	PCON 	= 0x00;
	S0CON 	= 0x50;
	TR1 	= 1;
	IEN0 	|= 0x10;

	//T2用作定时一个呼吸周期时间
	TL2 = RCAP2L = T2_CONSTANT_FOR_1MS;
    TH2 = RCAP2H = T2_CONSTANT_FOR_1MS / 0x100;
    T2MOD   = 0x00;
    T2CON   = 0x00;     	//自动装载
    IEN1 	= 0x01;
}

//T0中断服务函数,定时步进电机每步时间
void timer0_int(void) interrupt 1 using 1
{
    unsigned char i;
    TR0=0;
    P1_0=1;
    for (i=0; i<30; i++);                            //极限i=20
    P1_0=0;
    timer0_end_flag=1;
}




//T1中断服务函数,定时一个呼吸周期时间
void timer1_int(void) interrupt 3 using 2
{
	TH1 = 0xF8;
	TL1 = 0x30;
    TR1 = 1;
    timer_cycle++;
	if(timer_cycle>time_respiration)
	{
		timer_cycle = 0;
		run_next_cycle = 1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -