?? adc.c
字號:
//[ADC.c]A/D轉換-----------------------------------------------------------*
//本文件包含: *
// (1)ADCInit:A/D轉換初始化 *
// (2)ADCvalue:獲取1路A/D轉換結果 *
// (3)ADCmid:獲取中值濾波后的A/D轉換結果 *
// (4)ADCave:獲取均值濾波后的A/D轉換結果 *
//硬件連接: *
// PAD1 接模擬量輸入端 *
//-------------------------------------------------------------------------*
//頭文件
#include "ADC.h" //A/D轉換頭文件
//ADCInit:A/D轉換初始化----------------------------------------------------*
//功 能:初始化AD轉換 *
//參 數:無 *
//返 回:無 *
//-------------------------------------------------------------------------*
void ADCInit(void)
{
//ATDCTL2.ADPU = 1為打開轉換電源開關
//ATDCTL2.AFFC = 1為A/D轉換CCF自動清0位
ATDCTL2 = 0xC0;
//ATDCTL3.S1C = 1表示序列長度為1
//ATDCTL3.FIFO = 0為非FIFO模式
//ATDCTL3.FRZ0~FRZ1 = 11表示凍結模式進入BDM
ATDCTL3 = 0x0B;
//ATDCTL4.PRS4~PRS0 = 00111表示總線頻率16分頻
ATDCTL4 = 0x07;
//ATDCTL4.SRES8 = 0表示10位轉換精度
ATDCTL4 &= 0x7F;
}
//ADCvalue:1路10位A/D轉換函數----------------------------------------------*
//功 能:獲取通道channel的10位A/D轉換結果 *
//參 數:channel=通道號(0~15) *
//返 回:該通道的A/D轉換結果(0~1023) *
//-------------------------------------------------------------------------*
INT16U ADCvalue(INT8U channel)
{
INT16U temp; //暫存A/D轉換的結果
//ATDCTL5.DJM = 0,結果寄存器數據采用左調整
//ATDCTL5.SCAN = 1,連續轉換序列
//ATDCTL5.CC~CA = channel,啟動通道轉換
ATDCTL5 = (0x20 | channel);
//取A/D轉換結果
while (1)
//判斷ATDSTAT0的第7位是否為1
if ((ATDSTAT0&(1<< SCFBit)) != 0)
{
temp = ATDDR0; //從A/D數據寄存器0中讀10位數據
temp = (temp >> 6); //對數據調整,使低十位有效
break;
}
return temp;
}
//ADCmid:1路A/D轉換函數(中值濾波)------------------------------------------*
//功 能:獲取通道channel中值濾波后的A/D轉換結果 *
//參 數:channel=通道號(0~15) *
//返 回:該通道中值濾波后的A/D轉換結果(0~1023) *
//內部調用函數:ADCvalue *
//-------------------------------------------------------------------------*
INT16U ADCmid(INT8U channel)
{
INT16U i,j,k,tmp;
//1.取三次A/D轉換結果
i = ADCvalue(channel);
j = ADCvalue(channel);
k = ADCvalue(channel);
//2.從三次A/D轉換結果中取中值
if (i > j)
{
tmp = i; i = j; j = tmp;
}
if (k >= j)
{
tmp = j;
}
else
{
if (k >= i)
tmp = k;
else
tmp = i;
}
return tmp;
}
//ATDave:1路A/D轉換函數(均值濾波)------------------------------------------*
//功 能:對通道channel的A/D轉換結果求n次平均值 *
//參 數:n=均值濾波次數(0~255),channel=通道號(0~15) *
//返 回:該通道均值濾波后的A/D轉換結果 *
//內部調用函數:ADCmid *
//-------------------------------------------------------------------------*
INT16U ADCave(INT8U n,INT8U channel)
{
//求n次A/D轉換的平均值
INT8U i;
INT16U j;
if(0 == n) n = 1;
j = 0;
for (i=0; i<n; i++)
j += ADCmid(channel);
j /= n;
return j;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -