📄 main.c
字号:
/***********************************************************************
IRIS05B SOFT 3.3 2005/11/04 BY GAOJIAN
此程序下的脉冲驱动方式为脉冲
宽度调制,脉冲周期不变,占空比
随采样值与目标值的差来确定,
差值越大,占空比越大。
此程序试用电路版本 V2.1
3.3版修改了光圈电机不能时时转动的问题
2005-11-08 NDFilter, Iris初始化
***********************************************************************/
#include <ADUC812.H>
#include <math.h>
sbit IRIS_RUN=P2^4;
sbit IRIS_DIR=P2^5;
sbit FILTER_RUN=P2^6;
sbit FILTER_DIR=P2^7;
sbit V_IRIS=P1^3;
sbit V_ABS=P1^2;
sbit ND_INVAL=P3^2;
sbit ND_VAL=P3^3;
#define uchar unsigned char
#define RUN 0
#define STOP 1
#define L_DIR 0
#define R_DIR 1
#define ADIN_V_ABS 0x02
#define ADIN_V_IRIS 0x03
#define unWidth 255
#define unMinPulse 35
unsigned int IRIS_TgtPos; //光圈目标位置
unsigned int IRIS_CurPos; //光圈当前位置
unsigned char Filter_TgtPos; //滤光片目标位置
unsigned char L_IRIS_Run_Flag; //光圈电机向左转动标志位 0xFF有效 其他值无效
unsigned char R_IRIS_Run_Flag; //光圈电机向右转动标志位 0xFF有效 其他值无效
unsigned char Filter_ND_INVAL_Flag;
unsigned char Filter_ND_VAL_Flag; //滤光片目标位置标志位
unsigned char V_ABS_L,V_ABS_H;
unsigned char V_AEC_L,V_AEC_H;
unsigned char Counter_Time;
unsigned int Cnt; //电机转动定时变量
unsigned int Y;
unsigned char ABS_M; //ABS输出计算参数
unsigned int ABS_N;
unsigned char AEC_M;
unsigned int AEC_N;
unsigned char unPulseHigh;
unsigned char unPulseLow;
unsigned int unDelPos;
unsigned int unDelPos1;
unsigned int unDelPos2;
void SystemInit();
void UpdataCurPos();
unsigned int GetADC(unsigned char Channel);
void Delay(unsigned int D_time);
//void PutDAC(uchar DA0_H,uchar DA0_L,uchar DA1_H,uchar DA1_L);
void Serial_Port_Trans(unsigned int Trans_Data);
void Serial_Port();
void IRIS_Moto_Run();
void Filter_Run_L();
void Filter_Run_R();
void Initial_Filter_Moto();
void ABS_Account();
void AEC_Account();
void Put_ABS(uchar DA0_H,uchar DA0_L);
void Put_AEC(uchar DA1_H,uchar DA1_L);
void R_Reverse();
void L_Reverse();
void Delay(unsigned int D_time);
void Time0();
void InitIris(); //2005-11-08,光圈位置初始化
main()
{
SystemInit();
UpdataCurPos();
//-------------------------------------------//
//2005-11-08 NDFilter, Iris初始化 //
//-------------------------------------------//
//Initial_Filter_Moto(); // ND Filter 初始化
//InitIris(); // 光圈位置初始化
//----------------- --------------------------//
while(1)
{
/*UpdataCurPos();
Serial_Port_Trans(IRIS_CurPos);
Delay(10000);*/
if((R_IRIS_Run_Flag!=0xFF)&&(L_IRIS_Run_Flag!=0xFF))
{
//ABS_Account();
AEC_Account();
}
while((R_IRIS_Run_Flag==0xFF)||(L_IRIS_Run_Flag==0xFF))
{
IRIS_Moto_Run();
//Serial_Port_Trans(IRIS_CurPos); //此处上传的值为停止时刻的IRIS_CurPos数值
//Delay(30000);
//UpdataCurPos(); //注意:调试使使用的,最终产品要去掉延时和串口返回
//Serial_Port_Trans(IRIS_CurPos);
//IRIS_CurPos=IRIS_TgtPos;
}
}
}
void SystemInit() //系统初始化函数
{
Filter_ND_INVAL_Flag=0x00;
Filter_ND_VAL_Flag=0x00;
L_IRIS_Run_Flag=0x00;
R_IRIS_Run_Flag=0x00;
IRIS_TgtPos=0x0700;
Counter_Time=0x00;
ABS_M=0x01;
ABS_N=0x07F0;
AEC_M=0x01;
AEC_N=0x07F0;
TL2=0xDC;
TH2=0xFF;
RCAP2L=0xDC;
RCAP2H=0xFF;
T2CON=0x30; //set rate and start
TR2=1;
SCON=0x50; //set serial port mode
ADCCON1=0x7c;
TMOD=0x01; //定时器0工作在方式1
TL0=0x00;
TH0=0x00; //设定定时器初值
ES=1; //允许串口中断
EX1=1;
EX0=1; //允许外部中断
ET0=1; //允许定时器0中断
IT0=1;
IT1=1; //设置外部中断为下降沿触发方式
PX1=1;
PX0=1; //设定外部中断优先位
EA=1;
}
void UpdataCurPos() // 更新当前的光圈位置
{
IRIS_CurPos=GetADC(ADIN_V_IRIS);
if(IRIS_CurPos > IRIS_TgtPos)
{
unDelPos = (IRIS_CurPos - IRIS_TgtPos)/256;
if(IRIS_CurPos - IRIS_TgtPos>=0x0600)
{ //根据当前值与目标值的差值大小
unPulseHigh = unDelPos*12+ unMinPulse; //设定相乘系数
}
else if(IRIS_CurPos - IRIS_TgtPos>=0x0300)
{
unPulseHigh = unDelPos*8+ unMinPulse;
}
else if(IRIS_CurPos - IRIS_TgtPos>0x0180)
{
unPulseHigh = unDelPos*2+ unMinPulse;
}
else
{
unPulseHigh = unDelPos+ unMinPulse;
}
}
else
{
unDelPos = (IRIS_TgtPos - IRIS_CurPos)/256;
if(IRIS_TgtPos - IRIS_CurPos>=0x0600)
{
unPulseHigh = unDelPos*12+ unMinPulse;
}
else if(IRIS_TgtPos - IRIS_CurPos>=0x0300)
{
unPulseHigh = unDelPos*8+ unMinPulse;
}
else if(IRIS_CurPos - IRIS_TgtPos>0x0180)
{
unPulseHigh = unDelPos*2+ unMinPulse;
}
else
{
unPulseHigh = unDelPos+ unMinPulse;
}
}
unPulseLow = unWidth - unPulseHigh;
IRIS_CurPos=IRIS_CurPos&0xFFF0; //屏蔽ADC输入的低四位
}
//ADC function and choose ADC0---ADC7 by Channel
unsigned int GetADC(unsigned char Channel)
{
unsigned char *p;
unsigned char variable;
unsigned int ADC_value; //用指针将2个char类型数合并成一个int型数
p=(unsigned char *)&ADC_value;
ADCCON2=Channel;
// Delay(100);
SCONV=1;
while (SCONV)
{ }
SCONV=1;
while (SCONV)
{ }
variable=0x0F&ADCDATAH; //屏蔽ADC输入的通道标识符号
*p=variable;
p++;
*p=ADCDATAL;
//Serial_Port_Trans(ADC_value);
return(ADC_value);
}
void Put_ABS(uchar DA0_H,uchar DA0_L)
{
DACCON=0x1F;
DAC0H=DA0_H;
DAC0L=DA0_L;
}
void Put_AEC(uchar DA1_H,uchar DA1_L)
{
DACCON=0x1F;
DAC1H=DA1_H;
DAC1L=DA1_L;
}
void Delay(unsigned int D_time)
{
unsigned int i;
for(i=0;i<D_time;i++)
{
}
}
void Serial_Port_Trans(unsigned int T_Data) //串口发送函数 在发送的过程中没有禁止中断
{
unsigned char *p;
p=(unsigned char *)&T_Data;
SBUF=*p;
while (!TI) //用指针将1个int型数分成2个char型
{
}
TI=0;
SBUF=*(p+1);
while (!TI) //将2个char数分别发送
{
}
TI=0; }
void Service_int0() interrupt 0
{
if(Filter_ND_INVAL_Flag==0xFF)
{
TR0=0; //停止计数
FILTER_RUN=1;
FILTER_DIR=1;
Filter_ND_INVAL_Flag=0x00; //停止滤光片电机转动
Counter_Time=0x00;
TL0=0x00;
TH0=0x00; //设定定时器初值
}
}
void Service_int1() interrupt 2
{
if(Filter_ND_VAL_Flag==0xFF)
{
TR0=0; //停止计数
FILTER_RUN=1;
FILTER_DIR=1;
Filter_ND_VAL_Flag=0x00; //停止滤光片电机转动
Counter_Time=0x00;
TL0=0x00;
TH0=0x00; //设定定时器初值
}
}
void Time0() interrupt 1
{
Counter_Time++;
if(Counter_Time==0x05)
{
FILTER_RUN=1;
FILTER_DIR=1;
Filter_ND_VAL_Flag=0x00;
Filter_ND_INVAL_Flag=0x00;
Counter_Time=0x00;
TR0=0; //停止计数
TL0=0x00;
TH0=0x00; //设定定时器初值
}
}
void Serial_Port() interrupt 4
{
unsigned char R_Data;
EA=0;
if(RI)
{ /* judge the data transmitted by PC */
RI=0;
if(SBUF!=0x01)
{
EA=1;
return;
}
while(!RI)
{}
RI=0;
if(SBUF!=0x01)
{
EA=1;
return;
}
while(!RI)
{}
if(SBUF==0x00||SBUF==0x01||SBUF==0x02||SBUF==0x03||SBUF==0x04||SBUF==0x05) //if it is not 0101**** ,exit interrupt
{
RI=0;
switch(SBUF)
{
case 0x00:
{
while(!RI)
{}
RI=0;
R_Data=SBUF;
IRIS_TgtPos=(unsigned int)R_Data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -