// 根据上偏差、下偏差,计算当前值;注:所有电流值扩大1000倍,以整数保存
// 保留2位有效位,即:最小调整单位为0.001mA
// 由 Coef * Data + Inter = I,
// 又 0xFFFF --> 5V -- 22mA; 0 --> 0V --> 0mA
// Coef * 11915.3 + Inter = 4mA + IL = 4000 + IL
// Coef * 59576.6 + Inter = 20mA + IH = 20000 + IH
// Coef= (16000 + IH - IL)/47661.3
// Inter = (20000 + IH) - Coef * 59576.6
void Get_ADC_Coef(unsigned char cChannel)//ADC系数
{
//wdt_feed();
adc_coef[cChannel]=(16000.0 + adc_Hshift[cChannel] - adc_Lshift[cChannel])/47661.3;
adc_int[cChannel]=20000+adc_Hshift[cChannel]-adc_coef[cChannel]*59576.6;
}
void init_ADS8343(void)
{
AD1_CS_OUT;
AD1_CS_SET;
AD1_SCL_OUT;
AD1_SCL_CLR;
AD1_SDAO_OUT;
AD1_SDAO_CLR;
AD1_BUSY_IN;
AD1_BUSY_SET;
AD1_SDAI_IN;
AD1_SDAI_SET;
}
void AD1_Read(void)
{
unsigned char i,j,k,cFMT;
unsigned int wTemp_val;
int iTemp_val;
unsigned char chFMT[4];
float fTemp_avg[4];
float fTemp_val[21];
//wdt_feed();
// AD_SCL_CLR;
// AD_CS_CLR;
// delay_nus(10);
chFMT[0]=0x97;
chFMT[1]=0xD7;
chFMT[2]=0xA7;
chFMT[3]=0xE7;
for(i=0;i<4;i++)
{
//wdt_feed();
for(j=0;j<21;j++)
{
AD1_SCL_CLR;
AD1_CS_CLR;
delay_nus(10);
cFMT=chFMT[i];
for(k=0;k<8;k++)
{
// 上升沿ADS读入数据
if(cFMT&0x80) AD1_SDAO_SET;
else AD1_SDAO_CLR;
delay_1us();
AD1_SCL_SET;
delay_1us();
AD1_SCL_CLR;
cFMT=cFMT<<1;
}
// 防止SDAO为高,启动AD转换
AD1_SDAO_CLR;
AD1_SCL_SET;
delay_1us();
AD1_SCL_CLR;
delay_1us();
iTemp_val=0;
while((!(AD1_BUSY_RD))&&(iTemp_val<1000)) // 等待BUSY变高
{
iTemp_val++;
}
delay_1us();
// 下降沿输出数据
for(k=0;k<16;k++)
{
wTemp_val=wTemp_val<<1;
if(AD1_SDAI_RD) wTemp_val|=0x0001;
else wTemp_val&=0xFFFE;
AD1_SCL_SET;
delay_1us();
AD1_SCL_CLR;
delay_1us();
}
for(k=0;k<8;k++)
{
AD1_SCL_SET;
delay_1us();
AD1_SCL_CLR;
delay_1us();
}
iTemp_val=wTemp_val; // 转化为有符号整数
fTemp_val[j]=iTemp_val;
fTemp_val[j]=fTemp_val[j]+0x7FFF+1; // 进行补码,转成正数
// 进行排序,最大的置前
for(k=0;k<j;k++)
{
if(fTemp_val[k]<fTemp_val[j])
{
fTemp_avg[i]=fTemp_val[k];
fTemp_val[k]=fTemp_val[j];
fTemp_val[j]=fTemp_avg[i];
}
}
}//for(j=0;j<21;j++)
// 剔除最大、最小值,然后取平均值
fTemp_avg[i]=0;
for(j=7;j<14;j++)
fTemp_avg[i]=fTemp_avg[i] + fTemp_val[j];
fTemp_avg[i]=fTemp_avg[i]/7;
AD1_CS_SET;
// 调整最终结果
adc_data[i]=fTemp_avg[i];
adc_value[i]=adc_int[i]+adc_coef[i]*adc_data[i];
}
}