概述
ADC模数转换的目的:
**单片机能够接受和处理的数据都是离散的数字量,而不是连续的模拟量,**就和机器语言不能和普通语言一样通用,要先转换成单片机能够接受的数据,才能进行对模拟量数据(比如,温度,受力,电压,湿度,光强等)的处理,这个实现转换的器件就是ADC转换器。
转换原理:
一般的 A/D 转换过程是通过采样保持、量化和编码这三个 步骤完成的,即首先对输入的模拟电压信号采样,采样结束后进入保持时间,在 这段时间内将采样的电压量转化为数字量,并按一定的编码形式给出转换结果, 然后开始下一次采样。
注:用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多则表示的精度越 高,位数越少表示的精度就越低。
ADC模数转换过程:
要想实现ADC转换,要了解对应**芯片电路*
从电路图中可以得出,端子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采样电位器功能实现以及特点所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复