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

📄 main.c

📁 绝对好东西!aduc812AD转换代码,望对大家学习有所帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
 /***********************************************************************
            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 + -