📄 avr i2c.c
字号:
}
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 + -