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的值来计算其他通道的电压值。