五,ADC的配置

ADC是单片机经常用到的功能,主要是数模转换,我们来配置ADC的使用。

一;ADC初始化,主要配置ADC的时钟和速度;

因为ADC的结果是一个10位的值,所以需要用2个寄存器存放,分别是ADC_RES和ADC_RESL,加起来有16位,但是我们就用10位,所以转换结果我们需要设置左对齐还是右对齐;

但是通常选择右对齐,即把B5位写1;


二;ADC的工作频率,通过B0-B3,4个位控制,一共有16种,

ADC频率 = 系统频率 / 2 /(SPEED位4个2进制转10进制并加1)

通常设置最低速,速度越慢值越精确;

程序:

ADCCFG = 0X2F; // 设置ADC时钟 = sysclk/2/16 = 1M 转换结果右对齐


三; ADC的通道,因为不是每一个IO都能使能ADC,在使用前需要先配置通道。

打开电源,启动,然后ADC引脚位P1^7

程序:

ADC_CONTR = 0X87; // 打开电源,配置引脚

ADC_CONTR |= 0X40; // 启动AD转换,ADC_CONTR寄存器B6位置1


四;获得ADC转换结果,延时2个空操作再判断ADC转换有没有完成

while(!(ADC_CONTR&0X20)); // 查询ADC完成,ADC_CONTR的B5位与0010 0000

ADC_CONTR &= ~0X20; // 清除完成标志


五;转换结束以后,ADC的值被保存在两个寄存器里ADC_RES和ADC_RESL,

定义一个16位的变量res,因为右对齐把ADC_RES左移8位并和ADC_RESL相与并保存到16位的变量中

程序:

res = (ADC_RES<<8)|ADC_RESL; //读取ADC结果


六,当电源不稳的时候,通过ADC内部参考电压反推出准确的电源电压,

用来更准确的计算被选通道io的电压值,内部1.19V参考是出厂校准的值,存放在BGV_Voltag寄存器里面,直接指针获取;

程序;

Int *BGV;//定义指针变量BGV

BGV = (int idata *)0xEF; // 读出芯片内部BGV电压值,毫伏

然后再读第15通道的ADC值,就是参考电压的ADC值,因为BGV的值不变,电源电压会变,第15通道读出的ADC也就会变,这样就可以反推出准确的供电电压。

这个作用可以是电池供电的时候电量不断下降的时候监控电池电压。

可以通过参考电压并读出ADC的值来计算其他通道的电压值。