📄 adc.c
字号:
#include"include.h"
uint32 xdata sum[10];
/*********************************************************************************************************
** 函数名称: void delaynms(uint16 n)
** 功能描述: 延时函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void delaynms(uint16 n) //延时1mS
{
uint16 i;
while(n>0)
{
for(i=0;i<490;i++)
{}
n--;
}
}
/*********************************************************************************************************
** 函数名称: uint16 Get_AD_Result(void)
** 功能描述: 获取ADC转换结果函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 Get_AD_Result(void)
{
uint16 ADH;
uint16 ADL;
ADC_DATA = 0x00;
ADC_LOW2 = 0x00;
ADC_CONTR|= 0x08;
delaynms(2);
while(ADC_CONTR&0x10 != 0x10);
ADC_CONTR &= 0xe7; //0xe7;
ADH = ADC_DATA<<2;
ADL = ADC_LOW2&0x03;
ADH = ADH|ADL;
return(ADH);
}
/*********************************************************************************************************
** 函数名称: void SetChannel(uint8 chnum)
** 功能描述: ad通道设置函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SetChannel(uint8 chnum) //chnum:channel number
{
switch (chnum)
{
case 0 :
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 0; //选中第1路电池 A10
A9 = 0; //A9
A8 = 0; //A8
}break;
case 1:
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 0; //选中第2路电池 A10
A9 = 0; //A9
A8 = 1; //A8
}break;
case 2:
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 0; //选中第3路电池 A10
A9 = 1; //A9
A8 = 0; //A8
}break;
case 3 :
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 0; //选中第4路电池 A10
A9 = 1; //A9
A8 = 1; //A8
}break;
case 4:
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 1; //选中第5路电池 A10
A9 = 0; //A9
A8 = 0; //A8
}break;
case 5:
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 1; //选中第6路电池 A10
A9 = 0; //A9
A8 = 1; //A8
}break;
case 6 :
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 1; //选中第7路电池 A10
A9 = 1; //A9
A8 = 0; //A8
}break;
case 7:
{
A12 = 0; //选通U9-138译码器
A11 = 0; //E1
A10 = 1; //选中第8路电池 A10
A9 = 1; //A9
A8 = 1; //A8
}break;
case 8: //选通U10-138译码器
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 0; //选中第1路电池
A9 = 0; //A9
A8 = 0; //A8
}break;
case 9 :
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 0; //选中第2路电池
A9 = 0; //A9
A8 = 1; //A8
}break;
case 10:
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 0; //选中第3路电池
A9 = 1; //A9
A8 = 0; //A8
}break;
case 11:
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 0; //选中第4路电池
A9 = 1; //A9
A8 = 1; //A8
}break;
case 12 :
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 1; //选中第5路电池
A9 = 0; //A9
A8 = 0; //A8
}break;
case 13:
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 1; //选中第6路电池
A9 = 0; //A9
A8 = 1; //A8
}break;
case 14:
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 1; //选中第7路电池
A9 = 1; //A9
A8 = 0; //A8
}break;
case 15 :
{
A12 = 0; //选通U10-138译码器
A11 = 1; //E3
A10 = 1; //选中第8路电池
A9 = 1; //A9
A8 = 1; //A8
}break;
default: break;
}//end switch
}
/*********************************************************************************************************
** 函数名称: uint16 TemperatureLine(uint16 ADResult_T)
** 功能描述: 负温度系数传感器线性化处理(线性化电压采集最好使用12位ADC这样采样精度高,同样温度精度高)
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
signed char TemperatureLine(uint16 ADT)
{
uint16 Current;
signed char TEMPT;
unsigned long R,Yout,Temperature,ADResult_T;
signed long T;
Temperature = ADT;
ADResult_T = 5000 - Temperature;
Current = (unsigned int)(ADResult_T*10/100);//扩大10倍计算出电流值 100表示100K电阻
R = Temperature*10000;
R = R/Current; //R/Current/1000;;
if(R > 181385) //小于-30度
{
T = -30;
}
else if(R > 32851) //小于零度 0 ~ -30
{
Yout = 1000000000/(1000+0.0169*R); //将结果扩大到小数点后六位
T = Yout - 647275;
//T = T/1344; //温度取三位整数
T = T/13440; //温度取2位整数
}
else if(R > 8052) //小于30度 0 ~ +30
{
Yout = 1000000000/(1000+0.082*R); //将结果扩大到小数点后六位
T = Yout - 268487;
//T = T/1120; //温度取三位整数
T = T/11200; //温度取2位整数
}
else if(R > 2488) //小于60度 +30 ~ +60
{
Yout = 1000000000/(1000+0.305*R); //将结果扩大到小数点后六位
T = Yout - 9671;
//T = T/940; //温度取三位整数
T = T/9400; //温度取2位整数
}
else if(R > 920) //小于90度 +60 ~ +90
{
Yout = 1000000000/(1000+0.928*R);
T = Yout + 176081;
//T = T/796; //温度取三位整数
T = T/7960; //温度取2位整数
}
else T = 90; //高于90度
TEMPT = (signed char)(T);
return TEMPT;
}
/*********************************************************************************************************
** 函数名称: uint16 Adc_Collect(uint8 adchannel)
** 功能描述: 模数转换函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 Adc_Collect(uint8 adchannel)
{
uint32 Result,ad_data,t;
uint16 LDATA;
uint8 i,j;
//WDT_CONTR = 0x3c; /************************喂狗************************/
ADC_CONTR|= 0x80; /*AD_Power_On*/
delaynms(2);
if(adchannel == NEG_CURRENT) //P1.2 used for negative current collect
{
ADC_CONTR = 0xE2; /*ADC_Power_On_Speed_Channel_2 0xe2;11100010B P1.2做为A/D输入*/
delaynms(2);
}
else if(adchannel == ACT_CURRENT) //P1.3 used for active current collect
{
ADC_CONTR = 0xE3;
delaynms(2);
}
else if(adchannel == OUTS_TEMPERATURE) //P1.4 used for outside temperature collect
{
ADC_CONTR = 0xE4;
delaynms(2);
}
else if(adchannel == CELL_TEMPERATURE) //P1.5 used for cell temperature collect
{
ADC_CONTR = 0xE5;
delaynms(2);
}
else if(adchannel == CELL_VOLTAGE) //P1.6 used for cell voltage collect
{
ADC_CONTR = 0xE6;
delaynms(2);
}
for(i = 0;i < 10;i++)
{
Result = Get_AD_Result();
sum[i] = Result;
}
//A11 = 1; //close the channel
//A12 = 1; //close the channel
for(j = 0;j < 10;j++)
{
for(i = 0;i < 9-j;i++)
{
if(sum[i] > sum[i+1])
{
t = sum[i];sum[i] = sum[i+1];sum[i+1] = t;
}
}
}
ad_data = 0;
for(i = 3;i <= 6;i++)
{
ad_data += sum[i];
}
Result = ad_data/4;
if(adchannel == NEG_CURRENT)
{
;
}
else if(adchannel == ACT_CURRENT)
{
;
}
else if(adchannel == OUTS_TEMPERATURE)
{
Result*= 5000; //5000
Result/= 1024;
Result*= OTK;
Result/= 10000;
}
else if(adchannel == CELL_TEMPERATURE)
{
Result*= 5000; //5000
Result/= 1024;
Result*= CTK;
Result/= 10000;
// Suart_Send_Byte(0xAA);
// Suart_Send_Byte(Result>>8);
// Suart_Send_Byte(Result);
// Suart_Send_Byte(0xBB);
}
else if(adchannel == CELL_VOLTAGE)
{
Result*= 10000; //5000*2
Result/= 1024;
Result*= CUK;
Result/= 10000;
}
LDATA = (uint16)(Result);
return(LDATA);
}
/********************************************************************************************************
End of file
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -