📄 m_step_2.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 + -