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

📄 m_step_2.c

📁 2005年电子设计竞赛悬挂运动控制系统源码
💻 C
字号:
//**************************************//
//	源 文 件:M_Step_2.c					//
//	描    述:驱动电机(具有两套)			//
//	主要功能:正、反方向旋转任意角度		//
//			 [注:速度、方向、角度皆可控]//
//	编写作者:by Gholt(林青)				//
//  编写日期:2005-09-07					//
//  整理日期:2005-10-30					//
//**************************************//

//================================
//	IO端口分配:
//		IO_Use1----电机1
//			A相----IOA4
//			B相----IOA7
//			C相----IOA6
//			D相----IOA5
//		IO_Use2----电机2
//			A相----IOB4
//			B相----IOB5
//			C相----IOB6
//			D相----IOB7
//================================
#include "SPCE061V004.H"
#define IO_Use1 0x00f0
#define IO_Use2 0x00f0
unsigned int DeCnt1=600,DeCnt2=600;			//电机1、2脉冲延迟计数变量
											//DeCnt与电机转速成反比
//电机以4相4拍(A,B,C,D)旋转时的控制量
unsigned int step41A[4]={0x0010,0x0020,0x0040,0x0080};
unsigned int step41B[4]={0x0010,0x0020,0x0040,0x0080};
unsigned int i1=0,i2=0;		//step41的下标
unsigned int Direction1=1,Direction2=1;		//电机旋转方向(1:正转 0:反转)
unsigned int N_step1=0,N_step2=0;			//控制电机步进数
unsigned int M1_Over=1,M2_Over=1;			////电机停转标志变量

//===================================================
//函数:void Init_M_StepA()
//语法:void Init_M_StepA()
//描述:初始化电机1的IO口(IOA4---7)
//参数:无
//返回:无
//===================================================
void Init_M_StepA()
{
	*P_IOA_Dir |= IO_Use1;		//IOA4---7
	*P_IOA_Attrib |= IO_Use1;
	*P_IOA_Data &= ~IO_Use1;
}
void Init_M_StepB()
{
	*P_IOB_Dir |= IO_Use2;		//IOB4---7
	*P_IOB_Attrib |= IO_Use2;
	*P_IOB_Data &= ~IO_Use2;
}

//===================================================
//函数:void Step_4_1_A(unsigned int Dir)
//语法:void Step_4_1_A(unsigned int Dir)
//描述:电机1的驱动函数(4相4拍),每调用一次换相一次
//	   A--B--C--D--A--B.......或D--C--B--A--D--C.......
//参数:旋转方向Dir(1:正转 0:反转)
//返回:无
//===================================================
void Step_4_1_A(unsigned int Dir)
{	
	*P_IOA_Buffer &=~IO_Use1;
	*P_IOA_Buffer |=step41A[i1];
	if(Dir==1)
	{
		i1++;
	}
	else
	{
		i1--;
	}
	i1 %= 4;	
}
void Step_4_1_B(unsigned int Dir)
{	
	*P_IOB_Buffer &=~IO_Use2;
	*P_IOB_Buffer |=step41B[i2];
	if(Dir==1)
	{
		i2++;
	}
	else
	{
		i2--;
	}
	i2 %= 4;	
}

//===================================================
//函数:void AngleRunA(unsigned  int ang,int Dir)
//语法:void AngleRunA(unsigned  int ang,int Dir)
//描述:使电机1正转或反转ang度
//参数:旋转角度ang;旋转方向Dir(1:正转 0:反转)
//返回:无
//===================================================
void AngleRunA(unsigned  int ang,int Dir)
{
	long temp=ang;
	N_step1=(unsigned int)((temp*10)/18);	//根据角度确定电机步进次数
	Direction1=Dir;
	M1_Over=0;
	Init_IRQ1_TMA();						//开中断,启动电机
}
void AngleRunB(unsigned int ang,int Dir)
{
	long temp=ang;
	N_step2=(unsigned int)((temp*10)/18);
	Direction2=Dir;
	M2_Over=0;
	Init_IRQ2_TMB();
}

//===================================================
//函数:void ForTimerA()
//语法:void ForTimerA()
//描述:电机1以步交(1.8度)步进,同时对步进数进行处理
//     该函数主要被内部计数器溢出中断调用
//参数:无
//返回:无
//===================================================
void ForTimerA()
{
	if(N_step1!=0)		//步进数减一
	{
		N_step1--;
		Step_4_1_A(Direction1);
	}
	else				//停机
	{
		M1_Over=1;
		Close_IRQ1_TMA();
	}
	*P_Watchdog_Clear=1;
}
void ForTimerB()
{
	if(N_step2!=0)
	{
		N_step2--;
		Step_4_1_B(Direction2);
	}
	else
	{
		M2_Over=1;
		Close_IRQ2_TMB();
	}
	*P_Watchdog_Clear=1;
}

⌨️ 快捷键说明

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