我是靠谱客的博主 自由乌龟,最近开发中收集的这篇文章主要介绍普中科技51单片机的ADC采样电位器功能实现以及特点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ADC模数转换的目的:

**单片机能够接受和处理的数据都是离散的数字量,而不是连续的模拟量,**就和机器语言不能和普通语言一样通用,要先转换成单片机能够接受的数据,才能进行对模拟量数据(比如,温度,受力,电压,湿度,光强等)的处理,这个实现转换的器件就是ADC转换器。

转换原理:

一般的 A/D 转换过程是通过采样保持、量化和编码这三个 步骤完成的,即首先对输入的模拟电压信号采样,采样结束后进入保持时间,在 这段时间内将采样的电压量转化为数字量,并按一定的编码形式给出转换结果, 然后开始下一次采样。

注:用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多则表示的精度越 高,位数越少表示的精度就越低。

ADC模数转换过程:
在这里插入图片描述

要想实现ADC转换,要了解对应**芯片电路*

普中选用的 ADC 芯片是 12 位的 AD 芯片-XPT2046
从电路图中可以得出,端子J33上只有四个引脚 DO DI CS CLK
由经验可知,DI应该为ADC的数据输入端,DO为ADC的数据输出端
CS为使能端,CLK为输入信号,同时该芯片的分辨率为12位。

接下来查找芯片的时序逻辑图并分析

时序逻辑图也不是由图可知,这个屌图我是真没看懂,太拉了,我看的是另一款单片机上使用的ADC芯片的逻辑图,基本运行过程是一致的。
不过还有区别就是这里用的是两个信号分别负责开启转换和数据读取

当CLK 1->0后,在一个机器周期_nop_()内开始启动采样,转换,转换需要一定时间,需要设置一个for(延时) 。之后0-1;

准备开始输出转换后的数据

当CLK 0->1后, 在一个机器周期_nop_()内将数据送到DO口,读取后,又0->1进行下一次采样转换过程

之后单片机通过读取DO口的数据,再处理,就完成整个过程。

此处有个特别牛逼的特点:

		  那就是只有一个数据输入端,一个数据输出端,那就意味着,2个IO就需要负责ADC芯片的数据传输
		  这里就要引用一个新的东西,叫做SPI读写。
		  此处的ADC芯片,作为单片机的SPI设备,采用SPI的通信方法。
		  简单来说 SPI是一种全双工,高速的,同步的通信总线。
		  SPI接口有四根线 分别是CS SCLK MOSI MISO
		  分别为片选信号 同步信号 
		  MOSI 一般接主机数据输出引脚,从机数据输入引脚
		  MISO 一般接主机数据输入引脚,从机数据输出引脚
		  单片机作为主机,ADC芯片作为从机
		  要使用这种通信方法需要提前设计好的SPI接口,只需要四根线就能做不止16根线需要做的事,6666666.
		  不过数据传输的过程比之前较麻烦一点,需要写新的函数,代码如下

SPI写数据函数

void SPI_write(uchar dat)    //注意!!!!!此时写进去的值的类型 必须是八位!!!!!!!必须是八位!!
{							 //因为如果位数不对 则 >>之后的数据并不准确
	int i;
	CLK=0;
	for(i=0;i<8;i++)     //八位数据的输入 DIN  上升沿输出 下降沿读入
	{
		DIN = dat>>7;     //DIN主机数据输给从机
		dat<<=1;	    
		
		CLK=0;  
		
		CLK=1; //送出数据
	}
}

SPI读数据函数

uint SPI_read()  //SPI读函数  读到的数不止8位 所以用int
{
	uint dat,i;
	CLK=0;
	for(i=0;i<12;i++)  //我们只要12位(分辨率为12位) 所以取12次就可以
	{
		dat<<=1;
		
		CLK=1; //下降沿输出
		CLK=0;
		
		dat|=DOUT;    //DOUT从机输出数据给主机端口
	}
	return dat;
}

写好SPI读写函数后,才能通过SPI通信的方式去控制ADC芯片
代码如下

uint AD(uchar cmd)    //进行AD转换  cmd是因为本芯片的选取有多个功能要先写进去需要的对应的功能 之后才开始转换得到数据
{
	uint AD_value,i;        //一个用于延时 ,一个用于储存值
	CS=0;
	CLK=0;
	
	SPI_write(cmd);  		//将数据写入 启动ADC检测电位器模式
	
	for(i=10;i>0;i--);     //数据的转换需要时间
	CLK=1;				 //根据时序来写 获取数字量结果
	_nop_();
	_nop_();
	CLK=0;
	_nop_();
	_nop_();
	CLK=1;
	AD_value=SPI_read();
	return AD_value;
}

此处的cmd 是主机为了操作从机给从机写入的数据,确定从机的工作方式
采用单端输入,开始位为1 选择A0通道,采集的是AN0电位器的数据,所以控制命令数据为0x94。
在这里插入图片描述
在这里插入图片描述主函数代码

void main()
{
	uint temp=0;
	int i=0;                //隔一段时间取一次
	uint a,b,c,d;
	uint v;       //显示的电压值 v=(5*temp)/4096  若不进行扩大 则在4096取模时会舍弃掉小数
	while(1)
	{
		if(i==30)
		{
		 i=0;
		 temp=AD(0x94);  //0x94为控制命令
		 v=(5000*(unsigned long)temp)/4096;   //等于几伏.	 通过扩大来保留小数
		}
		a=v/1000; //个
		b=v%1000/100; //.0
		c=v%1000%100/10;  //.00 
		d=v%1000%100%10;	//.000
		display(a,b,c,d); //数码管显示
		i++;
	}
}

实验现象如下:

请添加图片描述
请添加图片描述以上就是普中科技51单片机的ADC采样电位器功能实现以及特点内容
不必吃透每个芯片的使用方法和时序,而是要学会大致类型芯片的工作原理,学会看时序逻辑图,效率更好,也会掌握更多芯片。

SPI通信方式比较优秀,需要理解通信过程和代码。

末尾在为了保留完整数字量数据的时候进行强制类型转换(unsigned long)是因为扩大的过程中,uint 类型装不下那么大的数字了,所以需要强制转换才能保证计算结果没错。
牛逼牛逼 祝大家学有所成,文章水平不咋地,同志们就当看个热闹了。

最后

以上就是自由乌龟为你收集整理的普中科技51单片机的ADC采样电位器功能实现以及特点的全部内容,希望文章能够帮你解决普中科技51单片机的ADC采样电位器功能实现以及特点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部