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

📄 avr i2c.c

📁 i2c通信
💻 C
📖 第 1 页 / 共 2 页
字号:
}
if(adcmadd>adc6mid+2)  
{
nn=2*(adc6max-adcmadd)/(adcmax-adc6mid);
//adcmadd+=nn;
}
else if(adcmadd<adc6mid-2)  

{
nn=2*(adcmadd-adc6min)/(adc6mid-adc6min);
adcmadd-=nn;
}
*/  
 
 /***将读数换算成角度****/
 cangle6=(float)(adcmadd-adc6mid);
 cangle7=(float)(adcmadd2-adc7mid);
 

   if(cangle6>=0)
  icangle6= (unsigned int)(cangle6*10000/A6);
    else  icangle6= (unsigned int)((-cangle6)*10000/A6);
   if(cangle7>=0)
  icangle7= (unsigned int)(cangle7*10000/A7);
    else  icangle7= (unsigned int)((-cangle7)*10000/A7);


  if((cangle6>0)&&(cangle7>0))     { R=90-arcsin(icangle6);R2=arcsin(icangle7);   }     
         
  else if((cangle6>0)&&(cangle7<0)) 
  { 
     if(arcsin(icangle6)==90) R=359;  else R=270+arcsin(icangle6); 
    
     R2=360-arcsin(icangle7);
  }
   else if((cangle6<0)&&(cangle7>0)) { R=90+arcsin(icangle6); R2=180-arcsin(icangle7); }
   else if((cangle6<0)&&(cangle7<0)) { R=270-arcsin(icangle6); R2=180+arcsin(icangle7);}
   else if((cangle6==0)&&(cangle7>0))  {R=90;R2=90; }
   else if((cangle6==0)&&(cangle7>0))  {R=270;R2=270; }
   else if((cangle6>0)&&(cangle7==0))  {R=0;R2=0; }
   else if((cangle6<0)&&(cangle7==0))  {R=180;R2=180; }    
 /********************************/  
  
   
 
 ///////////////////////////

 /**********对两路值进行平滑合并**********/
 if(((R2>=0)&&(R2<=40))||((R2>=320)&&(R2<=360))||((R2>=140)&&(R2<=220)))
  {  if(fabs(R-R2)>12)
     Rf=R2;
     else if(fabs(R-R2)>10)
     Rf=(R*1+R2*9)/10;
     else if(fabs(R-R2)>8)
     Rf=(R*2+R2*8)/10;
     else if(fabs(R-R2)>6)
     Rf=(R*3+R2*7)/10;
     else if(fabs(R-R2)>4)
     Rf=(R*4+R2*6)/10;
     else if(fabs(R-R2)>2)
     Rf=(R*9+R2*11)/20;
     
     else Rf=(R+R2)/2;
  }
  else if(((R>=40)&&(R<=130))||((R>=230)&&(R<=310)))
    {
    if(fabs(R-R2)>12)
     Rf=R;
     else if(fabs(R-R2)>10)
     Rf=(R*9+R2*1)/10;
     else if(fabs(R-R2)>8)
     Rf=(R*8+R2*2)/10;
     else if(fabs(R-R2)>6)
     Rf=(R*7+R2*3)/10;
     else if(fabs(R-R2)>4)
     Rf=(R*6+R2*4)/10;
     else if(fabs(R-R2)>4)
     Rf=(R*9+R2*11)/20;
     else Rf=(R+R2)/2;
    }
   else
   
   {
      Rf=(R+R2)/2;
   }
  /***********************************/ 




    if(Rf>=360) R2=359;        /***输出约束******/
  
  /**********存角度值*****待读取*******/  
  *cpEEP=(Rf/256);
  *(cpEEP+1)=(Rf%256); 
  /**********************/
  /*
  *(cpEEP+2)=(Rd/0xff);
  *(cpEEP+3)=(Rd%0xff);
  *(cpEEP+4)=(R2/0xff);
  *(cpEEP+5)=(R2%0xff); 
  *(cpEEP+6)=(adcmadd2/0xff);
  *(cpEEP+7)=(adcmadd2%0xff);
  */
////////////////////////
  /********实时校正极值*************/ 
 uu6=adcmadd;
 uu7=adcmadd2;

 if(((uu6<adc6min)||(uu7<adc7min)||(uu6>adc6max)||(uu7>adc7max))&&sigSTC)
 {
  if(uu6<adc6min)
 adc6min=uu6+1;
 else if(uu6>adc6max)
 adc6max=uu6-1;

  if(uu7<adc7min)
 adc7min=uu7+1;
 else if(uu7>adc7max)
 adc7max=uu7-1;

  A6=(float)(adc6max-adc6min)/2.0;  
  A7=(float)(adc7max-adc7min)/2.0; 
  adc6mid=(adc6min+adc6max)/2;  
  adc7mid=(adc7min+adc7max)/2; 
 }
 /************************************/
 
 /***********LED算法***************/
   adc6add=adcmadd;
   adc7add=adcmadd2;
   adcmadd=0;  adcmadd2=0;   
  Rs=Rf*4;
 if(Rs>(348*4)) Rs-=(349*4);
 else if((Rs>=0)&&(Rs<=348*4)) Rs+=45;
 
   Rd=Rs/90;
 if((sig==1)||(sig==0))
 {  
    if(offset<8)
    {
        if(Rd<offset)
        {
          poffset=offset*2-Rd;
        }
        else if(Rd>offset)
        {
           if(Rd<=(offset*2))
           poffset=offset*2-Rd;
           else
           poffset=(offset+8)*2-Rd;
        }
        else
        {
          poffset=offset;
        }
    }
    else 
    {
       if(Rd>offset)
       {
          poffset=offset*2-Rd;
       }
       else if(Rd<offset)
       {
         if(Rd>=(offset*2-15))
         {
            poffset=offset*2-Rd;
         }
         else 
         {
           poffset=(offset-8)*2-Rd;
         }
       }
       else
        {
          poffset=offset;
        }
    }
  lightled(poffset);            /*点亮LED*/
 }
 /*****************************/

  
 
 

  
   
   /****磁芯片置位复位****/
       
     PORTB|=4;
      delayms(1);
     PORTB&=0xfb;  
     delayms(4);
     PORTB|=4;
     delayms(1);
   /************/


 }
 
 
 
 
 /**************校正极值状态**********************/
 
  if((PINC&0x08)&&(sig==2))
 {
    if(sigSTC)
    {
  uu6=adc6add;
  uu7=adc7add;
  if(uu6<adc6min)
 adc6min=uu6-2;
 
 else if(uu6>adc6max)
 adc6max=uu6+2;

 if(uu7<adc7min)
 adc7min=uu7-2;
 else if(uu7>adc7max)
 adc7max=uu7+2;

  
    A6=(float)(adc6max-adc6min)/2.0;  
    A7=(float)(adc7max-adc7min)/2.0; 
    adc6mid=(adc6min+adc6max)/2;  
    adc7mid=(adc7min+adc7max)/2; 
   
    }
  }
 /**********************************/
 
 
 /*******置零点状态*********/
  if((PINC&0x08)&&(sig==0))
 {      if(countnum1==7) 
    {
      PORTD=0xff;
    }
  
 } 
 /*****************/ 
 
 /************校正极值状态结束时操作*****************/
 if((!(PINC&0x08))&&(sig==2))
 {
      delaytime=delayswitch();    /****读取按键被按下时间******/
      if(delaytime>=1)
      { PORTB|=0x03;
       
        PORTD=0x00;
      sig=1;
      SREG&=0X7F;
    EEPROM_Write(0, (adc6min/0xff));
    EEPROM_Write(1, (adc6min%0xff));
    EEPROM_Write(2, (adc6max/0xff));
    EEPROM_Write(3, (adc6max%0xff));
    EEPROM_Write(4, (adc7min/0xff));
    EEPROM_Write(5, (adc7min%0xff));
    EEPROM_Write(6, (adc7max/0xff));
    EEPROM_Write(7, (adc7max%0xff));
    delayms(100);
     PORTB&=0xfc;
     SREG|=0X80;
     
     
      }
    
 } 
 /************置零点状态结束时操作*****************/
  else if((!(PINC&0x08))&&(sig==0))
 {
      delaytime=delayswitch();
      if(delaytime>=1)
       { //PORTB|=0x01;
        // PORTB&=0xfd;
         //PORTD=0xfe;
         sig=1;
         offset=poffset;
         SREG&=0x7f;
   EEPROM_Write(10, (offset/0xff));
   EEPROM_Write(11, (offset%0xff));
        delayms(1);
        SREG|=0X80;
         
        }      
}
/*********************/
/************关LED结束时操作*****************/
 else if((!(PINC&0x08))&&(sig==4))
 {
       delaytime=delayswitch();
      if(delaytime>=1)
      {   // PORTB|=0x01;
          // PORTB&=0xfd;
          // PORTD=0xfe;
           sig=1;
          // delayms(100);
       }
   
       

}
/***************************/

/*******从正常运行状态变成其他状态*******/	 
 else if((!(PINC&0x08))&&(sig==1))
 {
       delaytime=delayswitch();
      if(delaytime==1)
      {   // PORTB|=0x01;
          // PORTB&=0xfd;
           //PORTD=0x0f;
           sig=0;
       } 
     else if(delaytime==2)
      {PORTB|=0x01;
       
       PORTB&=0xfd;
        PORTD=0x0f;
       
      sig=2;
      
 adc6min=900;
 adc6max=300;
 adc7min=900;
 adc7max=300;
 adc6mid=500;
 adc7mid=500;
         }  
     else if(delaytime==3) 
     { 
       PORTB&=0xfc;
       PORTD=0xff;
       sig=4;
     }    
         
          
      delaytime=0;
 }
/**************************/   

 
   sigOTC=0;
   sigSTC=0;      /****清转换结束标志***/
  }
}
/***********程序结束*********/

⌨️ 快捷键说明

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