打印
[PIC®/AVR®/dsPIC®产品]

使用MCC学习PIC单片机 – ADCC 模数转换

[复制链接]
7970|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 oxygenzz 于 2019-3-25 18:42 编辑

ADCMCU的基本外设,用于采集模拟信号进行模数转换。ADCC是一种高级的ADC外设。下面以PIC16F18446为例,使用MCC来学习这款外设。

我们先把ADCCMCC配置界面和数据手册中的模块框图做一对比。ADC时钟配置,电压参考,通道是需要配置的主要参数。



1.     ADC时钟设设置,TAD需要满足数据手册的规定。转换时间基本上为11.5倍的TAD,而且时间太长太短都不建议采用。见图。



2.     参考电压文档里也有详细介绍,需要注意的是,如果使用FVR 1.024/2.048/4.096V 作为正参考电压,需要使能FVR外设。

3.     ADC转换通道分为内部通道和由管脚引入的外部通道。内部通道涉及到其他外设的,相关外设需要使能。

外部通道需要通过MCC 的管脚管理器配置。选择的管脚(如RB6, RC2)会设置为模拟通道。


由框图可知,通道由PCH<5:0>来选择。

4.     转换结果保存在ADRESH和ADRESL中。可选择左对齐或右对齐方式。


以上设置都是基于ADC工作在基本模式下的。从MCC下拉框可知,共有5种操作模式。下面简单看下其他的工作模式。

数据手册里找到对应解释。

基本模式就是普通的ADC转换器。其他模式是在ADC转换结果的基础上,加入了各种计算操作。以前需要软件做的平均和滤波操作现在都集成到ADCC硬件里了。模块的名字也从ADC升级到了ADCC,原来多出来的字母C是计算的意思。


MCC生成代码后。
初始化函数ADCC_Initialize(),通过寄存器操作,已经将操作模式,ADC时钟,参考电压,结果对齐方式等设置好。
void ADCC_Initialize(void)
{

   // ADDSEN disabled; ADGPOL digital_low; ADIPEN disabled; ADPPOL Vss;
   ADCON1 = 0x00;
   // ADCRS 0; ADMD Basic_mode; ADACLR disabled; ADPSIS RES;
   ADCON2 = 0x00;
   // ADCALC First derivative of Single measurement; ADTMD disabled; ADSOIADGO not cleared;
   ADCON3 = 0x00;
   // ADMATH registers not updated;
   ADSTAT = 0x00;
   // ADNREF VSS; ADPREF VDD;
   ADREF = 0x00;
   // ADACT disabled;
   ADACT = 0x00;
   // ADCS FOSC/6;
   ADCLK = 0x02;
   // ADGO stop; ADFM right; ADON enabled; ADCS FOSC/ADCLK; ADCONTdisabled;
   ADCON0 = 0x84;
   }

因为在MCC界面上没有选择使用中断,生产的代码是以Polling 方式工作的。
开始转换  -> 查询是否转换完成 -> 如完成, 读取结果

开始转换,需要给定通道号。ADPCH寄存器设定通道。ADCON0ADON开启ADC功能,ADGO设为1启动转换。需要注意的是,在选择通道之后,开启转换之前,有时候需要人为插入一下延迟,以避免外部通道输入电阻电容过大带来的影响。
void ADCC_StartConversion(adcc_channel_tchannel)
{
   // select the A/D channel
   ADPCH = channel;      

   // Turn on the ADC module
   ADCON0bits.ADON = 1;

   // Start the conversion
   ADCON0bits.ADGO = 1;
}

检查转换是否完成。ADGO变低意味着转换完成。
bool ADCC_IsConversionDone()
{
   // Start the conversion
   return ((unsigned char)(!ADCON0bits.ADGO));
}

读取结果,16位全部读出。然后用户程序需要根据结果对齐选择,来处理转换输出。
adc_result_t ADCC_GetConversionResult(void)
{
   // Return the result
   return ((adc_result_t)((ADRESH << 8) + ADRESL));
}


除了以上分步处理外,还提供了一下单一函数完成一次转换。
adc_result_tADCC_GetSingleConversion(adcc_channel_t channel)
{
   // select the A/D channel
   ADPCH = channel;  

   // Turn on the ADC module
   ADCON0bits.ADON = 1;

   //Disable the continuous mode.
   ADCON0bits.ADCONT = 0;   

   // Start the conversion
   ADCON0bits.ADGO = 1;

   // Wait for the conversion to finish
   while (ADCON0bits.ADGO)
    {
    }

   // Conversion finished, return the result
   return ((adc_result_t)((ADRESH << 8) + ADRESL));
}

评论
forgot 2024-5-9 13:30 回复TA
谢谢分享 
du12311 2019-8-30 14:10 回复TA
那个小锁头打开和关闭到底是什么意思啊。 
沙发
zyaoping| | 2019-3-23 09:32 | 只看该作者
谢谢分享啊,学习中。。。。。。

使用特权

评论回复
板凳
xinxianshi| | 2019-3-23 21:28 | 只看该作者
PIC的结构非常好理解。

使用特权

评论回复
地板
wds-zou| | 2019-3-24 17:38 | 只看该作者
谢谢分享!好好。。。。。。

使用特权

评论回复
5
mnmjmkml| | 2019-3-26 15:20 | 只看该作者
感谢分享!很好的学习资料。

使用特权

评论回复
6
wanduzi| | 2019-3-28 11:18 | 只看该作者
有教程就好学

使用特权

评论回复
7
触觉的爱| | 2019-3-28 21:19 | 只看该作者
辅助软件、工具越来越齐全了。话说不是应该出一份国文版的说明文档吗

使用特权

评论回复
8
CoolSilicon| | 2019-3-29 08:33 | 只看该作者
加油加油!!还有19个模块的MCC!!

使用特权

评论回复
9
奔波儿熊| | 2019-3-29 11:34 | 只看该作者
顶起来!

使用特权

评论回复
10
skyfans000| | 2019-4-26 22:52 | 只看该作者
太好了 ,感觉比ST的好用得多啊

使用特权

评论回复
11
monitoring| | 2019-4-28 16:12 | 只看该作者
感谢楼主分享!好好学习下

使用特权

评论回复
12
hesmile| | 2021-10-9 10:00 | 只看该作者
请问新建工程中无法打开MCC怎么回事?

使用特权

评论回复
13
usysm| | 2021-11-12 18:02 | 只看该作者
我用的是mplab,用MCC18  

使用特权

评论回复
14
jkl21| | 2021-11-12 18:03 | 只看该作者
使用MCC学习PIC单片机方便多了。   

使用特权

评论回复
15
wwppd| | 2021-11-12 18:03 | 只看该作者
MCC配置详细指南         

使用特权

评论回复
16
maqianqu| | 2021-11-12 18:03 | 只看该作者
PIC/MCC 高级了。            

使用特权

评论回复
17
dspmana| | 2021-11-12 18:04 | 只看该作者
MCC时钟配置界面。   

使用特权

评论回复
18
eefas| | 2021-11-12 18:04 | 只看该作者
使用MPLAB X IDE新建项目和通过MCC配置引脚

使用特权

评论回复
19
pl202| | 2021-11-12 18:04 | 只看该作者
ADCC第一次听说了。   

使用特权

评论回复
20
htmlme| | 2021-11-12 18:04 | 只看该作者
用MCC配置pic单片机好用。   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

190

帖子

11

粉丝