?? ad.c
字號:
#include"includes.h"
unsigned int Adresult = 0;
unsigned int Ad_Sample_result = 0;
/**
******************************************************************************************
***名 稱: void delaynms(unsigned int n)
***功 能:ms延時函數
***版 本: V0.1
***作 者: LiWei
***日 期:2008年06月25日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
void delaynms(unsigned int n) //延時1mS
{
unsigned int i;
while(n>0)
{
for(i=0;i<112;i++)
{}
n--;
}
}
/**
******************************************************************************************
***名 稱: unsigned int AD_Deal(void)
***功 能:A/D處理函數
***版 本: V0.1
***作 者: LiWei
***日 期:2008年06月25日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
unsigned int AD_Deal(void)
{
unsigned int temp,vol;
unsigned int ADH,ADL;
ADH = ADRESH;
ADL = ADRESL;
Ad_Sample_result = (ADH<<8)|ADL;
//Adresult = (Ad_Sample_result*50)>>10;
//temp = Adresult;
//Adresult = (((Adresult%10)<<4))|(((temp/10)<<8)&0xF00);
//vol = Adresult;
//return vol;
return Ad_Sample_result;
}
/**
******************************************************************************************
***名 稱: unsigned int AD_Colect(void)
***功 能:A/D函數
***版 本: V0.1
***作 者: LiWei
***日 期:2008年06月25日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
unsigned int AD_Colect(unsigned char ChannelSet)
{
unsigned char Channel;
unsigned int ADRES;
unsigned int ADH,ADL;
Channel = ChannelSet;
//ADCON1 = 0x0E;
ADCON1bits.VCFG0 = 0; /*參考電壓Vss Vdd */
ADCON1bits.VCFG1 = 0;
if(Channel == 0) //TEMPERATURE0
{
ADCON1bits.PCFG0 = 0; /*把RA0設置為模擬量輸入 */
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG3 = 1;
ADCON0 = 0x00; /*選擇通道為 AN0 */
}
if(Channel == 1) //TEMPERATURE1
{
ADCON1bits.PCFG0 = 1; /*把RA1設置為模擬量輸入 */
ADCON1bits.PCFG1 = 0;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG3 = 1;
ADCON0 = 0x04; /*選擇通道為 AN1 */
}
if(Channel == 2) //TEMPERATURE2
{
ADCON1bits.PCFG0 = 0; /*把RA2設置為模擬量輸入 */
ADCON1bits.PCFG1 = 0;
ADCON1bits.PCFG2 = 1;
ADCON1bits.PCFG3 = 1;
ADCON0 = 0x08; /*選擇通道為 AN2 */
}
if(Channel == 4)
{
ADCON1bits.PCFG0 = 0; /*把RA4設置為模擬量輸入 */
ADCON1bits.PCFG1 = 1;
ADCON1bits.PCFG2 = 0;
ADCON1bits.PCFG3 = 1;
ADCON0 = 0x10; /*選擇通道為 AN4 */
}
//ADCON2 = 0xA0;
//Delay100TCYx(10);
ADCON2bits.ADFM = 1; /*轉換結果右對齊 */
ADCON2bits.ADCS0 = 0; /*轉換時鐘為32Tosc */
ADCON2bits.ADCS1 = 1;
ADCON2bits.ADCS2 = 0;
ADCON2bits.ACQT2 = 1; /*A/D采集時間8Tad */
ADCON0bits.ADON = 1; /*使能A/D */
Delay100TCYx(20); /*等待采集所需時間 */
ADCON0bits.GO_DONE = 1; /*啟動A/D */
while(ADCON0bits.GO_DONE); /*等待A/D空閑 */
//ADRES = AD_Deal();
ADH = ADRESH;
ADL = ADRESL;
ADRES = (ADH<<8)|ADL;
return ADRES;
}
/**
******************************************************************************************
***名 稱: void SetChannel(unsigned char chnum)
***功 能:電壓采集通道選擇
***版 本: V0.1
***作 者: LiWei
***日 期:2008年07月15日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
void SetChannel(unsigned char 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
//delaynms(1000); //從第一通U9道切換時間比其他通道切換時間長1S
}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
A8 = 0; //A9
A9 = 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
}
/**
******************************************************************************************
***名 稱: unsigned int ADUser(void)
***功 能:A/D函數
***版 本: V0.1
***作 者: LiWei
***日 期:2008年06月25日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
unsigned int ADUserV(unsigned char ChannelSet)
{
unsigned char i,j,k;
unsigned long AD_result;
unsigned int Vtemp[8],t;
for(i=0;i<15;i++)
{
SetChannel(i);
if(i == 0)Delay1KTCYx(2400);
else Delay1KTCYx(150);
for(j=0;j<8;j++)
{
AD_result = AD_Colect(ChannelSet);
Vtemp[j] = (unsigned int)(AD_result);
}
for(j = 0;j < 7;j++)
{
for(k = 0;k < 6-j;k++)
{
if(Vtemp[k] > Vtemp[k+1])
{
t = Vtemp[k]; Vtemp[k] = Vtemp[k+1];Vtemp[k+1] = t;
}
}
}
AD_result = 0;
for(j = 3;j < 7;j++)
{
AD_result += Vtemp[j];
}
AD_result/= 4;
AD_result = AD_result*5000;
AD_result = AD_result/1024;
AD_result = AD_result*2;
//AD_result*= C_K_VOL; //單支電池電壓系數
AD_result*= 9457;
AD_result/= 10000;
Cell[i] = (unsigned int)(AD_result);
Delay1KTCYx(10);
}
}
/**
******************************************************************************************
***名 稱: unsigned int ADUserT(void)
***功 能:A/D函數
***版 本: V0.1
***作 者: LiWei
***日 期:2008年06月25日
------------------------------------------------------------------------------------------
---修改人:
---日 期:
---功 能:
******************************************************************************************
**/
unsigned int ADUserT(unsigned char ChannelSet)
{
unsigned char i,j;//,CH;
unsigned int t,Current;
signed int TEMPT;
unsigned long R,Yout,ADResult_T,Temperature;
//float Yout,R,T;
signed long T;
//CH = ChannelSet;
for(i = 0;i < 8;i++)
{
ADResult_T = AD_Colect(ChannelSet);
Temp[i] = (unsigned int)(ADResult_T);
}
for(i = 0;i < 7;i++)
{
for(j = 0;j < 6-i;j++)
{
if(Temp[j] > Temp[j+1])
{
t = Temp[j]; Temp[j] = Temp[j+1];Temp[j+1] = t;
}
}
}
ADResult_T = 0;
for(i = 3; i < 7;i++)
{
ADResult_T += Temp[i];
}
ADResult_T /= 4;
ADResult_T *= 5000;
ADResult_T /= 1024;
if(ChannelSet == 0)
{
ADResult_T *= T_K_VO1; //1點溫度系數
ADResult_T /= 10000;
Tempervoltage0 = (unsigned int)(ADResult_T);
}
if(ChannelSet == 1)
{
ADResult_T *= T_K_VO2; //2點溫度系數
ADResult_T /= 10000;
Tempervoltage1 = (unsigned int)(ADResult_T);
}
Temperature = ADResult_T;
//Temperature *= 11366; //較準系數
//Temperature /= 10000;
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; //溫度取三位整數
}
else if(R > 8052) //小于30度 0 ~ +30
{
Yout = 1000000000/(1000+0.082*R); //將結果擴大到小數點后六位
T = Yout - 268487;
T = T/1120;
}
else if(R > 2488) //小于60度 +30 ~ +60
{
Yout = 1000000000/(1000+0.305*R); //將結果擴大到小數點后六位
T = Yout - 9671;
T = T/940; //溫度取三位整數
}
else if(R > 920) //小于90度 +60 ~ +90
{
Yout = 1000000000/(1000+0.928*R);
T = Yout + 176081;
T = T/796; //溫度取三位整數
}
else T = 90; //高于100度
// Yout = 1000000000/(1000+0.082*R); //將結果擴大到小數點后六位
// T = Yout;
// T = T - 268487; //T - 0.268487;
// T = T/112; //T/0.00011207;溫度取四位整數按此屏蔽計算
TEMPT = (signed int)(T);
return TEMPT;
}
/******************************************************************************
End
******************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -