STC15W4K单片机的使用笔记(ADC的使用和一些注意事项、数据错位现象)

学习目标

        电源类器件的控制输出依靠PWM,另外一个重要的环节就是输入,这就需要使用ADC了。这两个是控制电源最为重要的外设了。STC15W4K单片机内部有一个10位的SAR型ADC,有8路的输入通道。使用简单方便,配置简洁,性能优异。

一.ADC的初始化

1.代码示例

void ADC_Init()//P1.0
{
	P1M0 = 0x00;   //0000 0000 
    P1M1 = 0xFF;   //1111 1111   P1口全部设为高阻态
	
	P1ASF = 0x01;  //设置P1.0为ADC通道
	
	ADC_CONTR = 0x80;  //1000 0000
	
	CLK_DIV |= 0x20;   //调整输出格式
	
	IE &= 0XDF;   //ADC中断不使能
	
	IP &= 0xDF;   //ADC中断低优先级
}

2.具体配置

(1)GPIO模式选择

        任何端口要想作为ADC通道,就需要配置为高阻态模式,具体寄存器这里不再赘述

(2)设置为ADC通道

        P1ASF寄存器(不可位寻址)下的每一个位各自控制一个通道,相应第n(0~7)位置1时,那么对应的P1.n就会被设置为ADC通道模式,否则就会保持为普通IO

(3)ADC外设供电

        ADC_CONTR寄存器(不可位寻址)的第7位用于控制供电,置1时ADC外设上电

(4)ADC转换速度选择

        ADC_CONTR寄存器的第5(speed0)、6(speed1)位用于选择速度,其速度与系统主频相关,具体关系如图        

(5)ADC通道选择

        ADC_CONTR寄存器的最低三位用于8路通道之间的切换和选择,如要采样多路的模拟信号就需要对ADC的通道进行切换来实现ADC的分时复用,具体情况如下

 

(6) ADC中断配置

        IE寄存器的第5位有专门为ADC中断设置的允许位,置1为允许中断。当然ADC中断要正常工作那么总中断允许开关(第7位)也要置1。                                                                                              ADC中断的优先级设置在IP寄存器的第5位,置1 为高优先级。

(7)ADC输出数据格式选择

        CLK_DIV寄存器的第5位ADRJ用于选择输出格式,AD转换后的10位结果会被放置在ADC_RESL寄存器和ADC_RES寄存器当中,具体是ADC_RES组成高2位,ADC_RESL组成低7位,还是ADC_RES组成高7位,ADC_RESL组成低2位,由ADRJ决定。默认为0,高7低2

二.ADC的转换和读取

1.代码示例

        以下我将ADC的转换读取全放在一个函数里

unsigned int ADC_Value()
{
	unsigned int value;
	
	ADC_CONTR |= 0x08;  //启动转换
	
	while(ADC_CONTR & 0x08 == 1);//等待转换完毕
	
	value = ADC_RES * 256 + ADC_RESL;//默认格式
	
	return value;
}

2.具体步骤

(1)启动转换

        ADC_CONTR寄存器的第3位ADC_START为启动控制位,软件置1,ADC转换一次,转换结束后由硬件自带归零。

(2)等待转换结束

        可以使用while循环判断的ADC_START状态,直到转换结束归零,跳出循环结束

(3)读值 

        上面操作了这么多终于可以得到我们想要的数据啦!!!注意好格式和数据类型,return就可以了。

三.注意事项

多路采样数据错位

        在对多个外部模拟量进行采集时,需要对通道进行切换。本人在使用时也想得很简单,切换后启动转换、等待、读值。可是最后在OLED上显示时发现怎么两个数据的位置好像反了。然后又试了一下三路,还是一样的情况。最后还是在其他博主的推文下找到了答案。解决方式就是在切换通道后采集两次,舍弃掉第一次的数据,使用第二次的数据就可以解决。

作者:不知飘多远

物联沃分享整理
物联沃-IOTWORD物联网 » STC15W4K单片机的使用笔记(ADC的使用和一些注意事项、数据错位现象)

发表回复