首页 > 其他分享 >XL6601系列ACMP模拟比较器使用

XL6601系列ACMP模拟比较器使用

时间:2024-01-15 13:01:05浏览次数:35  
标签:Status DAC 中断 ACMP 模拟 FUNC 输入 XL6601

目录

模拟比较器(ACMP)

实现一个简单的小功能,掉电检测,使用到了ACMP外设,认为学习东西后总得产出点什么,所以在此简单记录一下。

简介特性

模拟比较器模块(ACMP)提供一个用于比较两个模拟输入电压的电路。此比较器电路适用于在整个供电电压范围内操作(全摆幅操作);

  • 可在 2.7 V 至 5.5 V 的整个电源电压范围上操作
  • 片上 6 位分辨率 DAC,基准电压源可以选择 VDD 或内部带隙基准
  • 可配置迟滞(个人理解是)
  • 可在比较器输出上升沿、下降沿或者任何边沿时选择产生中断
  • 最多 4 个可选择比较器输入

实现

使用引脚复用外设ACMP0作为比较引脚,对此IO口电压进行比较,当引脚电压低于设定的对比值(DAC值),并在上升沿下降沿触发中断。

结构框图

结构框图

要想怎么实现的肯定要先理解结构框图了:

  1. 比较器输入端IN+ 6位DAC选择VDDA为基准与输入端IN- ACM0进行比较;
  2. 输出一路到外部输出,一路到ACO(返回比较器输出的当前值)寄存器;
  3. 将编译控制逻辑 ACMPMOD(确定中断触发器的触发模式)进行设置;
  4. 产生有效边沿后ACF产生中断标志位置位,触发中断;
  5. ACIE(中断使能)触发中断;

Demo

实例代码,一些理解写在了注释中


void Judge_Status(Return_Status flag)  
{    //正常执行就都会返回RET_STATE_OK,否则死循环
	if(flag != RET_STATE_OK)
	{
		while(1);
	}
}

/*********** ACMP配置初始化 ***************/
static void ACMP_Config(ACMP_Type *ACMPx)
{
	ACMP_InitTypeDef ACMP_Initstructure;	
	NVIC_InitTypeDef NVIC_InitStructure;

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	NVIC_InitStructure.NVIC_IRQChannel = (uint32_t)ACMP0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 	
	NVIC_Init(&NVIC_InitStructure); 
	
	FUNC_Status = SIM_SCGC_Cmd(SIM_SCGC_ACMP0,ENABLE);		
	Judge_Status(FUNC_Status);    
	
	ACMP_Initstructure.ACMP_HystMode = ACMP_Hyst_20mv;                //ACMP选择了20mv的停滞
	ACMP_Initstructure.ACMP_IntTrigMode = ACMP_Int_FallorRiseEdge;    //上升沿下降沿均可触发中断        
	ACMP_Initstructure.ACMP_InputP = ACMP_Positive_EXT0;               //这里有个注意的,这是比较器输入IN+和IN-是反过来的,即为IN+为ACMP0,IN-为DAC输入       
	ACMP_Initstructure.ACMP_InputN = ACMP_Negative_DAC;               
	ACMP_Initstructure.ACMP_InputPin = ACMP_IN0;                       //以ACMP0为比较口
	ACMP_Initstructure.ACMP_DACEN = ENABLE;                            //使能
	ACMP_Initstructure.ACMP_DACRefVoltage = ACMP_DACRef_VDDA;          //以VDDA为基准
	ACMP_Initstructure.ACMP_DACValue =  0x1F;		                   //DAC电平选择 = Vin/64*(1+0x1f) = 5/64*(1+31) = 2.5(V)
    //比较电压,掉电触发下降沿中断,当ACMP复用IO口低于这个电压输出0或者1(设置(IN+,IN-)ACMP_InputN、ACMP_InputP,结构框图对应的比较器输入脚即可决定)

	FUNC_Status = ACMP_Init(ACMPx, &ACMP_Initstructure );	    //初始化ACMP	
	Judge_Status(FUNC_Status);
	FUNC_Status = ACMP_InterruptEn(ACMPx, ENABLE );	            //启用ACMP中断
	Judge_Status(FUNC_Status);
	FUNC_Status = ACMP_OutputPinEn(ACMPx, ENABLE );		        //输出引脚使能
	Judge_Status(FUNC_Status);
	FUNC_Status = ACMP_EnableCmd(ACMPx, ENABLE); 		        //ACMP模块使能
	Judge_Status(FUNC_Status);
}

/*********** 主函数 ***************/
int32_t main (void) 
{
	SYS_CLK_STATUS clk_state;
	clk_state = SystemSetFEI(ICS_IRC_50K, ICS_FLLFACTOR_1920);
	if(clk_state != SYS_CLK_OK)
	{
		while(1);
	}
	
	Systick_Init();
	ACMP_Config(ACMP0);
	FUNC_Status = GPIO_SetPinDir(GPIO_PTH5 ,GPIO_Direction_Output); 	//LED引脚配置为输出	
	Judge_Status(FUNC_Status);
	for(;;)
	{
		Delay_ms(1000);
	}	
}

/***********  ACMP中断调用函数 ***************/
static void ACMPx_IRQ_CallBack(ACMP_Type *ACMPx)
{
	uint8_t ACMP_Out = 0;
	FUNC_Status = ACMP_GetOutPutLogic(ACMPx, &ACMP_Out);  //获取比较器输出值	
	Judge_Status(FUNC_Status);    //根据上面配置信息,IN+电压小于IN-电压即为掉电
	if(ACMP_Out)  //输出为1,未掉电
	{
		FUNC_Status = GPIO_ClrPin(GPIO_PTH5);		
		Judge_Status(FUNC_Status);
	}
	else      //输出为0,确定掉电,因为配置IN-是DAC值
	{
        // 全局标志位置位,另写函数获取是否掉电,后续调用此函数写掉电后执行的操作
		FUNC_Status = GPIO_SetPin(GPIO_PTH5);		
		Judge_Status(FUNC_Status);
	}
	FUNC_Status = ACMP_ClearIntFlag(ACMPx);		//清除标志位
	Judge_Status(FUNC_Status);
}


/***********  ACMP0中断服务函数 ***************/
void ACMP0_IRQHandler(void)
{
	ACMPx_IRQ_CallBack(ACMP0);
}

官方解释

相关寄存器的描述已写出,以便更好阅读理解(阅读可更好理解ACMP的工作)。

功能说明

ACMP 模块就功能而言由两部分组成:数模转换器(DAC)和比较器(CMP)。

DAC 包括 64 级 DAC(数模转换器)和相关控制逻辑。通过置位 ACMP_C1[DACREF](DAC基准选择),DAC 可选择 VDDA 或片上带隙基准源这两个基准输入的其中之一作为 DAC 输入 Vin(这边选择的就是VDDA)。DAC 使能后,将ACMP_C1[DACVAL](DAC输入电平)中设置的数据转换为步进式模拟输出,然后馈入 ACMP 作为内部基准输入。输出电压范围为 Vin/64 到 Vin。步进大小为 Vin/64。

正输入与负输入

ACMP 可以实现正输入与负输入的模拟比较,然后提供一个数字输出和相关的中断。ACMP 的正负输入均可从四个通用输入中选择:三个外部基准输入和一个来自 DAC 输出的内部基准输入。
ACMP 的正输入由 ACMP_C0[ACPSEL](正输入选择)选定,其负输入由 ACMP_C0[ACNSEL](负输入选择)(Demo区注释已解释过)选定。可通过使用适当的值配置 ACMPC0 来比较 8 个输入的任何配对。

输出

通过置位 ACMP_CS[ACE](ACMP使能)使能 ACMP 之后,比较结果以数字输出呈现(1、0)。只要 ACMP_CS[ACMOD](中断边沿触发方式)中定义的有效边沿出现,ACMP_CS[ACF](中断标志位)的电平就会变为有效值。

输出标志

ACMP_CS[ACO](ACPC输出,比较后的结果)根据比较结果而改变,因此它可以用作一个跟踪标志,连续指示输入的电压变化。
如果选择芯片外部的基准输入作为 ACMP 的输入,那么必须置位对应的 ACMP_C2[ACIPE](是否允许对应的外部模拟输入,这边是允许DAC输入的,2.5V数字量转2.5V模拟量)位以使能来自焊盘接口的输入。如果需要将ACMP的输出置于外部引脚上(比较后的结果输出到引脚,这边不需要,只需得知是否掉电,其这个功能仅ACMP1支持),那么必须置位ACMP_CS[ACOPE](是否允许ACMP输出置于外部引脚上)位以使能焊盘逻辑的 ACMP 引脚功能。

中断

如果 ACMP_CS[ACMOD](中断边沿触发方式)定义的有效边沿出现时总线时钟可用,那么 ACMP_CS[ACF](中断标志位)的电平就会变为有效值。如果 ACMP_CS[ACIE](使能中断)置位,那么会发生 ACMP 中断事件。 ACMP_CS[ACF](中断标志位)位的电平将一直保持有效值,直到 ACMP 中断被软件清零。将 0 写入 ACMP_CS[ACF](中断标志位)位可清零该中断。

设置与操作

ACMP 两部分( DAC 和 CMP)的设置和操作可以独立进行。但是,如果 DAC 用作 CMP 的输入,那么在使能 ACMP 之前必须对 DAC 进行配置。
由于输入转换会导致 ACMP 输入上出现问题,因此用户应在启用 ACMP 之前完成输入选择,并且不能在启用 ACMP 时更改选择输入以避免意外输出。同样,更改 ACMP_C1[DACVAL](DAC输入电平,即为设置的2.5V)之后,DAC会有一定的设置延迟,因此用户应当在使能 DAC 之前完成 ACMP_C1[DACVAL](DAC输入电平)的设置。


标签:Status,DAC,中断,ACMP,模拟,FUNC,输入,XL6601
From: https://www.cnblogs.com/AurodaChenJie/p/17961367

相关文章

  • 4.【初中信息奥赛模拟测试】
    \(\Huge{打了一场模拟赛,又垫底了。qwq}\)初中信息奥赛模拟测试T1ZEW玩扫雷\(100pts\)定义\(\largeans_i{_,}{_j}\)为如果\((i,j)\)这个地块不是雷,旁边有多少个雷,枚举每一个点周围八个地块,如果是空地则不变,如果是雷就加一。时间复杂度为\(O(n*m)\)include<bits/st......
  • 初中信息奥赛模拟测试
    初中信息奥赛模拟测试T1ZEW玩扫雷\(n\)和\(m\)都是小的,枚举即可。#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;constintN=1010;template<typenameTp>inlinevoidread(Tp&x){x=0;registerboolz=1......
  • 模拟 - CF1196C Robot Breakout
    RobotBreakout(CF1196C)思路这道题因为平面极大,暴力枚举每个点肯定会超时。所以,我们不妨从机器人出发。我们可以枚举每个机器人可以执行的操作:位置从\((X_i,Y_i)\)变为\((X_i-1,Y_i)\),即向左走。位置从\((X_i,Y_i)\)变为\((X_i,Y_i+1)\),即向上走。位置从\((X_......
  • 初中信息奥赛模拟测试
    初中信息奥赛模拟测试\(T1\)ZEW玩扫雷\(100pts\)原题:luoguP2670[NOIP2015普及组]扫雷游戏本题修改:本题的非地雷地区为.。正解chara[1010][1010];intmain(){ //freopen("mine.in","r",stdin); //freopen("mine.out","w",stdout); intn,m,i,j......
  • Ubuntu下运行LVGL模拟器
    目录一、前言二、下载并安装VSCode(方法很多,总之装好VSCode就行了)三、获取源码3.2方法一:从Github拉取源码(有梯子)3.3方法二:从Gitee码云拉取源码(无梯子)四、安装LinuxSDL2驱动五、编译源码一、前言​ LVGL是一个可高度可裁剪、低资源占用、界面美观且易用的C语言嵌入式系统......
  • NES 模拟器中音画同步问题
    背景模拟器是与游戏和播放器都有相似之处的系统。模拟器与游戏的相似之处,在于都需要一个采集输入--执行逻辑--然后按一定帧率(通常是60FPS)把画面显示出来的循环。但是模拟器又需要模拟音频设备,播放音频设备产生的声音样本,这点与播放器相似。与播放器一样,模拟器也要处理音、视频......
  • 1.11模拟赛 T1题解
    简要题意\(n\le10^3,\sumK_i\le3\times10^5\)思路首先容易想到一个暴力DP,\(f_{l,r,x}\)表示区间中最大值为\(x\)的最大值稍微想亿下可以发现如果这个位置选的不是区间最大值的话,答案一定不优所以我们可以直接\(f_{l,r}\)DP转移,但复杂度还是没变,我们把柿子列出来\(......
  • [ 20230308 CQYC省选模拟赛 T2 ] 塑料内存条
    题意给定\(n\)个不可重集,初始每个集合\(i\)有元素\(c_i\)。请你以下\(3\)种操作:1xy在集合\(x\)插入\(y\)。2xy将\(y\)集合所有数插入\(x\),并删除\(y\)集合(不影响别的集合的下标)3xy求\(x\)集合与\(y\)集合的交之和。Sol可塑性记忆。注意到前......
  • 1.11模拟赛 T2题解
    简要题意每个点有一定概率向前面的点连边,求两点之间距离的期望思路推柿子code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN1000005intn,m,u,v;constintmod=1e9+7;inta[N],sum[N],c[N],dep[N],s[N],f[N],g[N],h[N];intksm(intx......
  • 利用Python和fake_useragent模拟不同浏览器访问
    在Python中,您可以使用requests库来发送HTTP请求,并使用UserAgent对象设置请求头中的User-Agent字段,以模拟不同浏览器或设备。以下是一个示例代码,演示如何使用requests库和fake_useragent库获取https://www.mafengwo.cn/网页的内容:首先,确保您已经安装了requests和fake_useragent库,您......