首页 > 其他分享 >4.PIC16F877 ADC

4.PIC16F877 ADC

时间:2022-11-01 17:26:01浏览次数:38  
标签:转换 PIC16F877 ADCON0 ADC 设置 寄存器 GO

1.相关寄存器及前言

PIC16F877A 有 8通道 10位模数转换器模块 8个A/D通道为AN0至AN7,通道及引脚对应如下表:

AN0 AN1 AN2 AN3 AN4 AN5 AN6 AN7
RA0 RA1 RA2 RA3 RA4

RE0

RE1 RE2

在数据手册113页有相关的寄存器(灰色为无关的,白色为相关的):

 

其中各部分寄存器对应功能(灰色为无关的,白色为相关的):

 

使用PIC16F877A的过程主要就是读写相应的寄存器

需要在初始化时(或者使用前)配置好相关寄存器功能参数,接着再读取AD转换结果计算为电压值

本教程中只讲解AD转换结果AD配置这部分的寄存器,中断相关的之后再讲

 

 

 2.各部分寄存器的详细配置

ADCON0中的ADCS1,ADCS0,和ADCON1中的ADCS2

 

 

 

 

 这部分是配置转换时钟相关

数据手册131页写到

每位A/D转换时间定义为Tad,A/D转换需要每10位至少12 Tad,A/D转换时钟的来源是软件的选择。  

设置不同转换时间对应的ADCS配置如下

 

 

 

 而具体的转换时间不是随便定的,有个下限,不能低于1.6us,低于这一时间转换会不准确

 

ADCON1中的ADFM

ADFM是配置转换结果左右对齐的,2byte是16bit,而PIC16F877A的ADC是10位的,所以会存在左对齐还是右对齐这一问题

ADFM=1则为左对齐,ADFM=0则为右对齐,(ADRESH<<8)|ADRESL即为读取结果

 

 

 ADCON0中的CHS2,CHS1,CHS0

 

这几位是选择ADC的通道的,单片机只要一个ADC,所以需要选择输入到ADC的通道来实现多个引脚AD转换,对应的值及通道引脚如图片所示:

 

ADCON0中的PCFG3,PCFG2,PCFG1,PCFG0

 

 

这个是选择引脚是数字脚还是模拟脚,还有选择参考电压源的,配置相关如下

 

 

 

 

比如想全部为数字脚且参考电压为Vdd和Vss就配置成0110或者0111

 

ADCON0中的GO和ADON

ADON好理解,就相当一个开关,设置为1的打开ADC,设置为0的时候关闭ADC(会省点电)

GO是开始信号,设置为1时开始转换,当转换完成后GO这一位会被硬件设置为0

 

 

ADC转换的流程如下

 

 

 

开始先设置GO为1,等待12个TAD,结束后GO这位被清零,

然后就能读取转换结果ADRESH和ADRESL

并根据这个公示计算

 

比如开始设置时设置参考电压为电源电压(5v),且用的是PIC16F877A(10位ADC),计算结果是这样

 

ADC转换对应参考代码

//设置部分,放在初始化的函数中
ADCON0 = 0b01010001;
ADCON1 = 0b00000010;


//获取电压部分

void getVoltage(){
    __delay_us(50);
    GO = 1;//开始转换
    while(GO = 1);//等待转换结束
    __delay_us(20);
    voltage = 5*(ADRESH<<2)/1024;//voltage是一个全局变量,设置为左对齐,只取高位舍五入
}

 

标签:转换,PIC16F877,ADCON0,ADC,设置,寄存器,GO
From: https://www.cnblogs.com/AnyWriter/p/16848066.html

相关文章

  • [nrf51] ADC采集导致蓝牙ble服务断开
      从上图得知,如果P0.26和p0.27接了外部晶振,这时候在启动ADC_AIN0和ADC_AIN1,进行通道采集,就会导致BLE断开。因为外部晶振受到干扰导致的。这个问题需要仔细看清楚硬件设计......
  • Android6.0以后,在BroadcastReceiver中启动AlertDialog导致程序停止运行的问题及解决办
    这里有几个重点,Android6.0及以后,BroadcastReceiver中启动Dialog,以及程序停止运行的原因,这三点,哪一个出问题了都会直接导致程序的崩溃先说我自己的问题,我用的sdk版本是目前......
  • [单片机框架][bsp层][cx32l003][bsp_adc] ADC配置和使用
    ADC是模数转换器转换器的供应商的英文简称,是一种能将模拟信号转变为数字信号的电子元件。通常是将信号采样并保持以后,再进行量化和编码,这两个过程是在转化的同时实现的。分......
  • [单片机框架][bsp层][AT32F415][bsp_adc] adc配置和使用
    12.1ADC介绍12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。......
  • CH573/579/582 ADC例程介绍
    在adc的例程中共有六种AD测量,1、温度测量,2、单通道测量,3、DMA单通道测量,4、差分通道测量,5、触摸按键测量,6、中断方式单通道测量,接下来我们逐一描述。一、温度测量首先调......
  • ADC采样信号RMS测量值的Verilog实现
    术语“RMS”代表“Root-Mean-Squared”。大多数书籍将此定义为“产生与等效直流电源相同的加热效果的交流电量”,或者沿着这些线路类似的东西,但RMS值不仅仅是这个。RMS......
  • osiThreadCallback 什么用途
    看下实现,就是给一个任务发送了一个事件。event有3个参数,第一个参数是回调,第2个参数是回调函数的实现,第3个参数是回调函数的参数。boolosiThreadCallback(osiThread_t*......
  • STC32G12K128-ADC
    最近开发一个12VBMS的项目,为了降成本和提高开发周期,硬件工程师选择了一款国产MCU作为主控,基本上能满足功能要求项目主要模块就是AD采样,CAN报文发送,故障诊断今天记录一下A......
  • 怎样理解ADC的噪声、有效分辨率
     一个24位的ADC,真正能使用的位数能达到24位吗?答案是否定的,由于器件本身噪声的存在,且噪声范围已经超过了ADC的最小分辨率。所以,基本上24位ADC都不能做到24位无跳动。 那......
  • 外设驱动库开发笔记47:ADS111x系列ADC驱动
      关于ADC我们已经讨论过不少了,但在不同的应用需求下,我们会选择不同的原件。在这里我们将讨论ADS111x系列ADC驱动的设计与实现。1、功能概述  ADS1113、ADS1114和......