一、ADC简介

ADC 操作顺序

        依序设定ADC时钟(ADCLK),ADC采样时间(SHCLK),ADC位数(ADCR),ADC参考电压(寄存器ADVREFH), 选择模拟输入通道并将寄存器PACON相应位设置为 1,再将ADEN位设置为 1。 在ADEN设置为 1 后必须等待 256us(ADC电路启动时间),再将START位写 1 来启动ADC模数转换。ADC转 换尚未完成时,读取EOC位会得到 0。当ADC模数转换完成后会自动将EOC位设置为 1。

二、ADC配置

1.时钟配置

        ADR寄存器的ADCK1~0位是时钟选择位,配置这两位的0和1可以选择ADC的时钟,高两位为ADC的中断标志位与中断使能位,可以单独操作,低四位为ADC转换结果低四位数据。

ADR = 0X00;    // 00 时钟选择十六分频系统时钟,中断标志位与使能位为0

图1.1  ADR寄存器

2.采样时间与采样位数配置

        ADCR寄存器的低四位控制ADC的采样时间与采样位数,高四位为PB引脚的纯ADC模拟输入脚选择位,可以减小功耗,配置时可以根据实际需求一起配置,也可以后面单独操作位来配置0

ADCR = 0xX0;    // 0000 0000,采样时间一个ADC时钟,八位采样位数,PB根据需要选择为纯AD

图2.1  ADCR寄存器

3.参考电压配置

        ADVREFH寄存器可以配置ADC的电压来源与参考电压大小

ADVREFH = 0x03 // 0xxx xx11,内部参考电压VDD

图3.1  ADVREFH寄存器

4.ADC引脚数模选择配置

        PACON寄存器与ADCR寄存器高四位控制所有带ADC功能引脚的纯ADC模拟输入,在引脚充足不复用IO功能时可以选择仅作为ADC模拟输入脚使用,我也建议选择为此模式,特别是有低功耗需求时。

ADCR  = 0xX0;     // PB根据需要选择为仅作为AD脚
PACON = 0xXX;    // PA脚根据实际ADC引脚选择为仅作为AD脚

图4.1  PACON寄存器

5.模式选择

        由ADMD寄存器控制,包含选择开启关闭AD功能位,启动转换控制位,总通道开启关闭位,当前通道选择位以及只读位状态位,注意使用时要等待状态位由0变为1才能继续下一次ADC转换操作

ADMD  = 0x10;    // 暂时只开启总通道选择PA0位当前通道
ADEN  = 1;       // 开启ADC功能
delay_ms(1);     // 等待1ms(256us以上)
START = 1;       // 开始转换 
// 可以只配置,在主程序函数中启动转换,转换完成后关闭转换

图5.1  ADMD寄存器

6.提取转换数据

        转换数据储存在ADR低四位ADD寄存器中,共十二位,如果精度选择八位的话,低位自动截断,只读取ADD的值就行了。

ADC_DATA = (u16)ADD <<4  | (ADR & 0x0F);    // 高八位左移四位再 或上低四位
//ADC_DATA = ADD;

图6.1  ADD寄存器

三、总结

        完整配置代码如下,可以根据需要开启ADC中断,每次转换完成可以START一次,此外还有ADC校准模式,此处不做配置,有需求可以参考官方示例去进行校准。

DISI();            // 关闭总中断

ADR = 0X00;        // 00 时钟选择十六分频系统时钟,中断标志位与使能位为0
ADCR = 0xX0;       // 0000 0000,采样时间一个ADC时钟,八位采样位数,PB根据需要选择为纯AD
ADVREFH = 0x03     // 0xxx xx11,内部参考电压VDD
PACON = 0xXX;      // PA脚根据实际ADC引脚选择为仅作为AD脚
ADMD  = 0x10;      // 暂时只开启总通道选择PA0位当前通道
ADEN  = 1;         // 开启ADC功能
delay_ms(1);       // 等待1ms(256us以上) 

// 需要ADC中断时可以开启
//ADIE = 1;          // 开启ADC中断
//ADIF = 0;          // ADC标志位初始清0
START = 1;         // 开始转换

ENI();             // 开启总中断

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐