NUC140之ADC
来源:互联网 发布:农村淘宝客服电话 编辑:程序博客网 时间:2024/05/16 18:12
NUC140的ADC比较简单,只需要设定好时钟和采样模式就OK了
下面先看初始化程序
void ADC_initialize (void)
{
DrvADC_Open (ADC_SINGLE_END, //Single模式
ADC_SINGLE_CYCLE_OP, //单周期扫描模式
0xf3, //设置要转换的口为ADC0,1,4,5,6,7 /1111 0011
EXTERNAL_12MHZ, //使用外部12M时钟为时钟源
0x9 //ADCClock = 12M/(9+1)
);
delay (100); //延迟使时钟稳定
}
初始化很简单,在此我们就不再累述,根据引脚的接法,用到哪一路AD就使能哪一路即可。
下面看数据的处理
void ADC_temperature_28V (void)
{
int32_t temperature_ADC_value; //温度ADC转换值
temperature_ADC_value = get_ADC_value(1); //读取温度值,对应ADC1
/*******************************************************************************************************************
*温度的算法:(1)由于ADC为12位精度,故为2的12次方=4096,所以采样的数先除以4096,但要保留小数位,由于被除数是整型, *
* 所以加点进行浮点运算; *
* (2)由于参考电压为5.26V,所以要再乘以5.26; *
* (3)由于温度传感器0.01V对应1℃,所以再乘以100; *
* (4)由于采样到的数据是经过运放放大了2.8倍,所以再除以2.8; *
* (5)最后加0.5是为了防止小数位大于0.5而被舍去; *
* 备注:如仍有不明白的,请参考数据手册478页 *
********************************************************************************************************************/
temperature_ADC_value = ((temperature_ADC_value / 4096.) * (5.26) * 100) / 2.8 + 0.5; //进行转换
temperature_value = (uint8_t)temperature_ADC_value;
}
在这里简单说明一下:
由于是12位精度的AD,参考电压5.26V,用库函数得到的是一个12位的数据,
如果获取的数据为0XFFF表示对应采到模拟电压为5.26V,
如果获取的数据为0X0表示采到的模拟电压为0V,中间的以此类推。
但是一般AD要注意数字滤波,网上有文档介绍,我记得有篇叫十种AD滤波的方法,
我用的是中值法,程序如下
/**************************************************
*函数名: ADC_average *
*功能: ADC转换值取中间值函数 *
*出口参数:中间值 *
*入口参数:转换值数组地址 *
*************************************************/
static int32_t ADC_average (int32_t *ADC_value) //加static表示仅本文件内部用
{
int32_t value[9] = {0};
uint8_t i,j,k;
int32_t value_max;
for (i=0; i<9; i++)
{
value[i] = *ADC_value++; //获取将要转换的值
}
//冒泡法从小到大排列
for (j=0; j<9; j++) //一共要比较9次
{
for (k=0; k<9-j; k++) //第一次过后最大的值放在了最高的位置
{ //就不用再比较最大的那个元素了
if(k != 8) //防止k为8时,value[8]与value[9]的比较,因为后者已经超出了数组的范围
{
if (value[k] > value[k+1]) //所以每次比较完下一次少比较一次
{
value_max = value[k]; //将较大的值保存起来
value[k] = value[k+1]; //较小的值赋给低位元素
value[k+1] = value_max; //较大的值赋给高位元素
}
}
}
}
return (value[4]);
}
/**************************************************
*函数名: get_ADC_value *
*功能: ADC获取对应通道转换值函数 *
*出口参数:9次A/D后得到的中值 *
*入口参数:ADC通道号码 *
*************************************************/
static int32_t get_ADC_value(uint8_t ADC_channel_number)
{
uint8_t i;
int32_t ADC_calibration[9]={0}; //ADC求中间值数据储存数组
for (i=0; i<9; i++) //读取9次的值
{
DrvADC_StartConvert(); //启动ADC转换
while(!DrvADC_IsConversionDone()) //等待ADC转换完成
{
}
ADC_calibration[i] = DrvADC_GetConversionData(ADC_channel_number); //读取对应ADC通道的值
DrvADC_StopConvert(); //停止转换
}
return (ADC_average(ADC_calibration)); //将取到的值求取中间值后返回
}
前面的那个函数为中值法滤波,后面的则是ADC启动转换函数,注意:一定要等待ADC转换完成后再获取转换的数值,
否则得到的数据可能会不准确。
到此ADC介绍结束
- NUC140之ADC
- NUC140之定时器
- NUC140之设置主频
- NUC140之看门狗
- NUC140之定时器2
- 2440 test 之ADC
- [转]MSP430之ADC
- 学习笔记之ADC
- S3C2440之ADC
- STM32之ADC学习
- STM32F407之ADC简介
- OK6410之ADC驱动程序
- TMS320F28027之ADC
- STM32之ADC学习
- S5PV210之ADC
- STM32F407之ADC简介
- S3C2440之ADC分析
- STM32F407之ADC
- ubuntu 12.04 开机 Num Lock灯不亮问题
- 需要做的一些知识点
- FloatImageText图文混排
- Cocos2d-x win7 + vs2010 配置图文详解(亲测)
- [RTT例程练习] 2.2 信号量之基本使用(动态/静态信号量)
- NUC140之ADC
- poj 1013 Counterfeit Dollar
- Python 正则表达式 Howto(4)
- 远程开机
- 个人的收藏夹
- Codeforces Beta Round #90, problem: (C) Education Reform DP
- Java正则表达式校验邮箱和手机号
- UVa 10891 Game of Sum
- 尝试VC控制外部程序