/*******************************************************************************
* [url=home.php?mod=space&uid=288409]@file[/url] KungFu8_ADC.c
* [url=home.php?mod=space&uid=187600]@author[/url] ChipON Application Team
* [url=home.php?mod=space&uid=895143]@version[/url] V0.0.1
* @date
* @brief
* *
******************************************************************************
*/
#include "KungFu8_ADC.h"
/***********************************************************************************
* 函数名 :ADC_Configuration
* 函数功能 :ADC模块配置
* 入口参数 :无
* 返回 :无
* ADC模块配置
**********************************************************************************/
void ADC_Configuration(void)
{
// 对应AD引脚的模式配置,配置为模拟 输入。 需注意:系列芯片设计IO默认为模拟输入脚功能
// ANS0= 0x02 | 0x04 | 0x01 | 0x40 ; // 0x02 | 0x04 | 0x01 | 0x40 VS AN11 AN12 AN13 AN17 VS P01 P02 P00 P17
// TR0|=(0x02 | 0x04 | 0x01 | 0x40 ); // 0x02 | 0x04 | 0x01 | 0x40 VS AN11 AN12 AN13 AN17 VS P01 P02 P00 P17
ANS1=0x00; // NONE
ANS2=0x00; // NONE
ANS3=0x00; // NONE
ANS4=0x00; // NONE
ANS5= 0x02 | 0x04 | 0x01 ; // 0x02 | 0x04 | 0x01 | 0x40 VS AN8 AN18 AN19 VS P52 P50 P51
TR5|=(0x02 | 0x04 | 0x01 ); // 0x02 | 0x04 | 0x01 | 0x40 VS AN8 AN18 AN19 VS P52 P50 P51
ANS6=0x20 ; // 0x20 VS AN9 VS P65
TR6|=(0x20); // 0x20 VS AN9 VS P65
ANS7=0x00;
ADCCTL0=0x80 | 0x00 | 0x01 ; // bit7 1右对齐 0左对齐,bit6 是否T2中断触发AD采样,bit0 使能AD模块
ADCCTL1=0x80 | ADC_FAD_SCLKDIV4 | ADC_VREF_VDD ; // bit7 是否失调校准使能
// 如果使用内部参考电压,需要配置FVR,参见FVR例程 VREFCTL的配置
ADCCTL2=AN8; // 特别需要说明的时,选通通道后不能立即启动转换,因为需要时间采样,典型时间5us。
}
/***********************************************************************************
* 函数名 :ADC_GetConvertData
* 函数功能 :AD 结果获取
* 入口参数 :无 仅用户结果的获取,建立在通道并转换完成
* 返回 :
* 说明 : 常规使用右对齐的12位,左对齐仅做8位应用时使用,即高位为8位的转换结果。
**********************************************************************************/
unsigned int ADC_GetData(void)
{
s_uint16 Adbuf;
Adbuf.byte1 = ADCDATA0H;
Adbuf.byte0 =ADCDATA0L;
return Adbuf.value;
}
/***********************************************************************************
* 函数名 :ADC_GetConvertData
* 函数功能 :AD 结果获取
* 入口参数 :通道 如AN8 ,滤波次数 1,16 【接近长度存贮,满量程的16倍滤波加和不溢出】
* 返回 : 16bit的采样结果,如果存在满量程,滤波次数最多16,最大半量程下滤波参数可以到的32
* 说明 : 滤波参数需要匹配加和结果不溢出。如果固定 4次 8次 16次 32次 可另建立函数,固定次数代码编写,效率会存在提升。
* 常规使用右对齐的12位,左对齐仅做8位应用时使用,即高位为8位的转换结果。
**********************************************************************************/
unsigned int ADC_GetConvertData(unsigned char chsel,unsigned char fitercount)
{
s_uint16 Adbuf;
s_uint16 Adsum;
unsigned char i;
ADCCTL2=chsel;
Delay_Wait_CLK_Sample(5); // 切换通道到启动转换需要保留采样时间
Adsum.value=0;
for(i=0;i<fitercount;i++)
{
START=1; // 启动转换
while(START); // 转换完成硬件清零,如果使用ADIF,需要做ADIF的清零
// while(!ADIF);ADIF=0;
// Adbuf.value=ADC_GetConvertData(); // 自身的传递占用代码比直接获取效率差,这里直接获取
// Adsum.value+=Adbuf.value; // 值处理
Adbuf.byte1 = ADCDATA0H;
Adbuf.byte0 =ADCDATA0L;
Adsum.value+=Adbuf.value;
}
return Adsum.value/fitercount;
}
/***********************************************************************************
//
******************************************************************************
*/
|