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

📄 motor_dri.c

📁 步进电机控制副机程序,与步进电机控制主机程序配合使用。
💻 C
字号:
#pragma small
#include "reg66x.h"
#include "motor_dri.h"
#include "electromotion.h"
#define T2_CONSTANT_FOR_1MS     (65536-2000)		  				//定时1ms

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


//定时器初始化
void init_timer(void)
{
	//T0用作步进电机步间隙时间
    TMOD = 0x01; 			//方式1
    TR0 = 0;
	IEN0 = 0x82;
	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;
}


//步进电机归零
void regress_stepmotor(void)
{
	unsigned char i;
   	unsigned int temp;
   	temp = 65535 - motor_degree[1];
	P1_4 = 0;
   	P1_5 = 1;
   	for(i = 0;i < 10;i++);
   	if(P1_5)
   	while(P1_5)
    {
       	P1_1 = BACKWARD;
       	TH0 = temp / 256;
       	TL0 = temp % 256;
       	TR0 = 1;
       	timer0_end_flag = 0;
       	while(!timer0_end_flag);
    }
   	else
    while(!P1_5)
    {
       	P1_1 = FORWARD;
       	TH0 = temp / 256;
       	TL0 = temp % 256;
       	TR0 = 1;
       	timer0_end_flag = 0;
       	while(!timer0_end_flag);
    }
}


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


//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;
}


//T2中断服务函数,定时一个呼吸周期时间
void timer2_int(void) interrupt 7 using 2
{
    TF2 = 0;
    TR2 = 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 + -