📄 main.c
字号:
IRIS_TgtPos=IRIS_TgtPos<<4;
if(IRIS_TgtPos>IRIS_CurPos) //如果目标值大于当前值
{
R_IRIS_Run_Flag=0xFF; //置电机右传标志位
L_IRIS_Run_Flag=0x00; //清楚电机左转标志位
Cnt=0; //电机转动计数清0
}
else if(IRIS_TgtPos<IRIS_CurPos) //如果目标值小于当前值
{
L_IRIS_Run_Flag=0xFF; //置电机左传标志位
R_IRIS_Run_Flag=0x00; //清楚电机右转标志位
Cnt=0; //电机转动计数清0
}
if(ND_VAL&&(Filter_ND_INVAL_Flag!=0xFF)) //如果ND_VAL=0则目标位置既是当前位置,不转动ND_Filter
{
Filter_ND_VAL_Flag=0xFF;
Filter_Run_L();
} //在已经有一个标志位被置位的情况下,不设定另一个标志位
}
break;
case 0x01:
{
while(!RI)
{}
RI=0;
R_Data=SBUF;
IRIS_TgtPos=(unsigned int)R_Data;
IRIS_TgtPos=IRIS_TgtPos<<4;
if(IRIS_TgtPos>IRIS_CurPos) //如果目标值大于当前值
{
R_IRIS_Run_Flag=0xFF; //置电机右传标志位
L_IRIS_Run_Flag=0x00; //清楚电机左转标志位
Cnt=0; //电机转动计数清0
}
else if(IRIS_TgtPos<IRIS_CurPos) //如果目标值小于当前值
{
L_IRIS_Run_Flag=0xFF; //置电机左传标志位
R_IRIS_Run_Flag=0x00; //清楚电机右转标志位
Cnt=0; //电机转动计数清0
}
if(ND_INVAL&&(Filter_ND_VAL_Flag!=0xFF)) //如果ND_INVAL=0则目标位置既是当前位置,不转动ND_Filter
{
Filter_ND_INVAL_Flag=0xFF;
Filter_Run_R();
}
}
break;
case 0x02: //发送的第3组数是0x02时 接着发送的是ABS的调节参数
{
while(!RI)
{}
RI=0;
ABS_M=SBUF;
}
break;
case 0x03:
{
while(!RI)
{}
RI=0;
ABS_N=SBUF;
ABS_N=ABS_N<<4;
}
break;
case 0x04:
{
while(!RI)
{}
RI=0;
AEC_M=SBUF;
}
break;
case 0x05:
{
while(!RI)
{}
RI=0;
AEC_N=SBUF;
AEC_N=AEC_N<<4;
}
break;
}
}
}
EA=1;
}
void IRIS_Moto_Run() //光圈电机转动
{
unsigned char i=0x00;
if(IRIS_TgtPos==IRIS_CurPos)
{
L_IRIS_Run_Flag=0x00;
R_IRIS_Run_Flag=0x00;
return;
}
else if(IRIS_TgtPos>IRIS_CurPos)
{
UpdataCurPos();
IRIS_RUN=1;
while(R_IRIS_Run_Flag==0xFF)
{
IRIS_DIR=0; // 目标地址大于当前地址,光圈应减小,电机向右转
for(i=0;i<unPulseHigh;i++);
{}
IRIS_DIR=1; //停止
for(i=0;i<unPulseLow;i++);
{}
UpdataCurPos();
if((IRIS_TgtPos<=IRIS_CurPos)&&(R_IRIS_Run_Flag==0xFF))
{
IRIS_RUN=0;
IRIS_DIR=1; //反转
for(i=0;i<unPulseHigh;i++);
{}
IRIS_RUN=1; //停止
//for(i=0;i<unPulseLow;i++);
//{}
R_IRIS_Run_Flag=0x00;
IRIS_CurPos=IRIS_TgtPos; //使当前值等于上次发送的目标值,发送同样的目标值电机不转动
return;
}
Cnt++; //通过j计数,j计数达到预定值后,停止光圈电机转动,,
if(Cnt==1500) //并清楚转动标志位,防止转死情况的发生
{
IRIS_RUN=1;
IRIS_DIR=1;
R_IRIS_Run_Flag=0x00;
return;
}
}
}
else
{
UpdataCurPos();
IRIS_DIR=1;
while(L_IRIS_Run_Flag==0xFF)
{
IRIS_RUN=0; // 目标地址小于当前地址,光圈应增大,电机向左转
for(i=0;i<unPulseHigh;i++);
{}
IRIS_RUN=1; //停止
for(i=0;i<unPulseLow;i++);
{}
UpdataCurPos();
if((IRIS_TgtPos>=IRIS_CurPos)&&(L_IRIS_Run_Flag==0xFF))
{
IRIS_RUN=1;
IRIS_DIR=0; //反转
for(i=0;i<unPulseHigh;i++);
{}
IRIS_DIR=1; //停止
//for(i=0;i<unPulseLow;i++);
//{}
L_IRIS_Run_Flag=0x00;
IRIS_CurPos=IRIS_TgtPos; //使当前值等于上次发送的目标值,发送同样的目标值电机不转动
return;
}
Cnt++;
if(Cnt==1500) //通过j计数,j达到预定值后,停止光圈电机转动,
{ //并清楚转动标志位,防止转死情况的发生
IRIS_RUN=1;
IRIS_DIR=1;
L_IRIS_Run_Flag=0x00;
return;
}
}
}
}
void Filter_Run_L() //滤光片电机旋转
{
FILTER_DIR=1;
FILTER_RUN=0;
TR0=1; //启动定时器0
//if(!ND_INVAL)
// {
// Serial_Port_Trans(0xDDDD); //当转动到位置时发送0xDDDD
//}
}
void Filter_Run_R()
{
FILTER_DIR=0;
FILTER_RUN=1;
TR0=1; //启动定时器0
//if(!ND_VAL)
//{
//Serial_Port_Trans(0xCCCC); //当转动到位置时发送0xCCCC
//}
//Serial_Port_Trans(0xFFFF);
}
void Initial_Filter_Moto()
{
unsigned int i=0x0000;
FILTER_DIR=1;
FILTER_RUN=0;
while(ND_VAL)
{
i++;
if(i==40000)
{
FILTER_DIR=1;
FILTER_RUN=1;
return;
}
}
FILTER_DIR=1;
FILTER_RUN=1;
//Serial_Port_Trans(0xFFFF);
}
void ABS_Account() //ABS转化输出
{
unsigned int G;
unsigned char *p;
G=(unsigned int)ABS_N;
p=(unsigned char *)&Y + 2;
Y=GetADC(ADIN_V_ABS);
Y=ABS_M*Y;
if(Y>=0x0FFF)
{
Y=0x0FFF;
}
if(Y<=0x0000)
{
Y=0x0000;
}
V_ABS_H=*p;
V_ABS_L=*(p+1);
Put_ABS(V_ABS_H,V_ABS_L);
}
void AEC_Account()
{
unsigned int G;
unsigned char *p;
p=(unsigned char *)&Y;
Y=(GetADC(ADIN_V_ABS) + GetADC(ADIN_V_ABS)) >> 1;
G=AEC_M*Y;
if(G > 0x0FFF)
{
V_AEC_H=0x0F;
V_AEC_L=0xFF;
}
else
{
Y = G + AEC_N;
if(Y>=0x0FFF)
{
V_AEC_H=0x0F;
V_AEC_L=0xFF;
}
else
{
V_AEC_H=*p;
V_AEC_L=*(p+1);
}
}
Put_AEC(V_AEC_H,V_AEC_L);
}
void R_Reverse() //IRIS_Moto向右侧反转
{
IRIS_DIR=0;
IRIS_RUN=1;
Delay(200); //反转时间由Delay函数控制
IRIS_DIR=1;
IRIS_RUN=1;
Delay(1000);
}
void L_Reverse() //IRIS_Moto向左侧反转
{
IRIS_DIR=1;
IRIS_RUN=0;
Delay(200); //反转时间由Delay函数控制
IRIS_DIR=1;
IRIS_RUN=1;
Delay(1000);
}
//--------------------------------------------//
//--2005-11-08 --//
//--功能:光圈初始化 --//
//--说明: --//
//-- 光圈在最小最大两个位置运行一次, --//
//-- 然后回到中间位置 --//
//--作者: 崔志立 --//
//--------------------------------------------//
void InitIris()
{
UpdataCurPos();
Delay(100);
UpdataCurPos();
//光圈初始化位置1
R_IRIS_Run_Flag=0xFF;
L_IRIS_Run_Flag=0xFF;
IRIS_TgtPos=0x0200;
IRIS_Moto_Run();
Delay(100);
//光圈初始化位置2
R_IRIS_Run_Flag=0xFF;
L_IRIS_Run_Flag=0xFF;
IRIS_TgtPos=0x0E00;
IRIS_Moto_Run();
Delay(100);
//光圈初始化位置3
R_IRIS_Run_Flag=0xFF;
L_IRIS_Run_Flag=0xFF;
IRIS_TgtPos=0x0800;
IRIS_Moto_Run();
Delay(100);
R_IRIS_Run_Flag=0x00;
L_IRIS_Run_Flag=0x00;
}
//--------------------------------------------//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -