[PIC®/AVR®/dsPIC®产品] 使用MCC学习PIC单片机 – ADCC 电容分压器(CVD)

[复制链接]
3758|7
 楼主| oxygenzz 发表于 2019-4-3 17:44 | 显示全部楼层 |阅读模式
本帖最后由 oxygenzz 于 2019-4-3 17:48 编辑


ADCC外设除了数模转换和计算功能外,还有一大功能,即电容分压器CVD)。
这一特性是将ADC内部采样保持电容作为参考,来对引脚上连接的外部电容进行相对电容测量
此功能主要应用于触摸按键和接近检测。

下面是MCC的配置图和数据手册上的原理简图。




CVD分为预充,采集和转换三个工作阶段。在各个阶段中,CVD需要控制很多开关,如原理简图中的K1-K4Kpre,和附加采样保持电容上的开关。KpreK1-4在不同的工作阶段开关状态会有变化,附加采样保持电容开关在三个阶段开关状态不改变。
预充阶段
Kpre OFFK1-K4根据预充极性选择确定ON/OFF状态。有一个基本原则是,K1K4状态相同,K2K3状态相同,K1/K4 K2/K3状态相反。这样保证PIN脚外电容Csensor和内部采样保持电容Chold 被预充到相反的电平。

采集阶段
Kpre ONK1-4全部OFF,内外电容分压开始,最后达到电压稳定状态


转换阶段
ADC将采样保持电容的电压转换为数字量,得出结果。

下图是CVD运行时内外电容上电压变化的波形图。红色为内部采样保持电容电压波形,蓝色为外部引脚上触摸按键的电容。图上显示的是连续完成了两次CVD操作,两次采集结果相减,即可得到差分结果。这种两次CVD的差分操作可有效减小温度等带来的共模干扰。ADCC双采样设置启动后,每次运行自动进行两次CVD操作,获得两个采样值。




MCC代码
MCC 生成代码后,可在adcc.c文件中找到CVD相关的代码。

设置预充时间
void ADCC_SetPrechargeTime(uint16_tprechargeTime)
{
   //Load the ADPREH and ADPREL registers.
   ADPREH = prechargeTime >> 8;

   ADPREL = prechargeTime;

}

设置采集阶段时间
void ADCC_LoadAcquisitionRegister(uint16_tacquisitionValue)
{
   //Load the ADACQH and ADACQL registers.
   ADACQH = acquisitionValue >> 8;
   ADACQL = acquisitionValue;  
}

启动双采样模式,每次运行自动进行两次CVD操作,获得两个采样值。两次结果分别保存在ADPREV ADRES中。
void ADCC_EnableDoubleSampling(void)
{
   //Sets the ADCON1bits.ADDSEN
   ADCON1bits.ADDSEN = 1;
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
请叫我树人 发表于 2019-4-4 09:41 | 显示全部楼层
感谢分享啊! 真是不错啊!
mxkw0514 发表于 2021-6-8 17:09 | 显示全部楼层
请问内外电容是怎么分压的呀?
便携手到老 发表于 2021-6-8 17:26 | 显示全部楼层
感谢分享,这个确实不错的应用的。
自己造声卡 发表于 2021-6-9 12:34 | 显示全部楼层
基础贴,必须要好好学习一下的。
dql2015 发表于 2021-6-9 13:19 | 显示全部楼层
有触摸按键的应用吗
lcczg 发表于 2021-6-9 14:49 | 显示全部楼层
mxkw0514 发表于 2021-6-9 22:09 | 显示全部楼层
本帖最后由 mxkw0514 于 2021-6-9 22:10 编辑


楼主的图好像有一点点出入,电容上的电压不能突变的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

190

帖子

11

粉丝
快速回复 在线客服 返回列表 返回顶部