STM32H750 COMP模拟比较器
STM32H750内置两个超低功耗比较器通道(COMP1 和 COMP2).
功能应用:
在模拟信号的触发下从低功耗模式唤醒
模拟信号调理
与定时器的 PWM 输出结合使用时,构成逐周期电流控制环路.
COMP主要特性
可选反相模拟输入:
I/O 引脚(因通道而异)
DAC 通道 1 和通道 2 输出
通过调节器(缓冲分压器)提供的内部参考电压和三个因数分压值(1/4、1/2、3/4)
每个通道有两个 I/O 引脚可选作非反相模拟输入
可编程迟滞
可编程速度/功耗
将输出映射到 I/O
将输出重定向到用于触发以下事件的定时器输入:
捕捉事件
OCREF_CLR 事件(用于逐周期电流控制)
断路事件(用于快速 PWM 关断)
消隐比较器输出
窗口比较器
可生成中断,用于使器件从睡眠模式和停止模式唤醒(通过 EXIT 控制器)
将中断输出定向到 CPU
2路比较器功能框图
比较器功能描述
COMP 引脚和内部信号
用作比较器输入的 I/O 必须在 GPIO 寄存器中配置为模拟模式。
比较器输出可通过其复用功能连接到 I/O。
输出也可以在内部重定向到用于以下用途的各种定时器输入:
使用 BKIN 和 BKIN2 输入紧急关断 PWM 信号
使用定时器的 ETR 输入进行逐周期电流控制
用于时序测量的输入捕捉.
比较器输出可以在内部同时连接到 I/O 引脚。
COMP 复位和时钟
时钟控制器提供的时钟 comp_pclk 与 APB 时钟同步。
注: 重要提示:极性选择逻辑和到端口的输出重定向独立于 APB 时钟。因此,即使在停止模式下 ,比较器仍能正常工作。连接至 CPU 的 NVIC 的中断线需要 APB 时钟 (comp_pclk) 才能工 作。如果没有 APB 时钟,则无法生成中断信号 comp_it。
比较器锁定机制
这两个比较器可用于过流或热保护等安全用途。对于具有特定功能安全要求的应用,可对比较器配置进行保护,以防发生意外修改(例如,当程序计数器损坏时)。为此,可以对比较器配置寄存器进行写保护(只读)。一旦比较器通道配置完成,其 LOCK 位设置为 1。从而使得只能读取比较器通道的整个寄存 器组以及通用 COMP_OR 寄存器,包括 LOCK 位。
只能通过 MCU 复位来移除写保护。
COMP_OR 寄存器由 COMP_CFGR1 或 COMP_CFGR2 的 LOCK 位进行锁定。
窗口比较器
窗口比较器用于监视模拟电压并检查其是否处于阈值上下限所定义的特定电压范围内。
窗口比较器需要两个 COMP 通道。受监视的模拟电压连接至其非反相 (+) 输入,阈值上下限
电压分别连接至各比较器的反相 (-) 输入。通过使能 WINMODE 位,可使 COMP 通道 2 的
非反相输入在内部与 COMP 通道 1 的非反相输入相连。这可以节省 COMP 通道 2 的输入引
脚以用于其他用途。
迟滞
比较器具有可编程迟滞,可在有噪声信号时避免发生意外输出转换。迟滞可在不需要时(例如,退出低功耗模式时)禁止,以便使用外部组件强制迟滞值.
比较器输出消隐功能
消隐功能的目的是防止电流调节在 PWM 周期开始处出现短暂电流尖峰(通常为功率开关反向并联二极管中的恢复电流)时发生跳闸。该功能使用通过定时器输出比较信号定义的消隐窗口。有关可选消隐信号,请参见寄存器说明。消隐信号对内部比较器输出进行门控,以便能使 comp_out 免受因电流尖峰而导致的寄生脉冲的干扰,
GPIO 上的比较器输出
比较器通道的 COMP1_OUT 和 COMP2_OUT 输出通过 COMP_OR 寄存器的 AFOP 字段 (位 [10:0])以及通过 GPIO 复用功能映射到 GPIO。
两种比较器通道输出的 GPIO 分配都必须在锁定任一通道的寄存器之前完成,因为在锁定任一比较器通道的寄存器时会锁定通用 COMP_OR 寄存器。
比较器输出重定向
任一 COMP 通道的输出均可重定向到定时器刹车输入(TIMx_BKIN 或 TIMx_BKIN2)可将 COMP 通道输出连接至其中一个 GPIO(可在复用功能中进行编程),作为定时器刹车输入。见表 218 和表 219。所选 GPIO 必须被设置为开漏模式。
COMP 输出通过 GPIO 传递至定时器刹车输入。通过上拉电阻,所选 GPIO 可用作定时器刹
车输入(与比较器输出进行逻辑 OR 运算)。
COMP 功耗和速度模式
对于给定的应用,可调节 COMP 通道功耗与传播延迟以获得最佳平衡。
COMP_CFGRx 寄存器的位 PWRMODE[1:0] 可编程为如下值:
00:高速/全功耗
01:中速/中等功耗
10:中速/中等功耗
11:极低速/超低功耗
COMP 低功耗模式
注: 当内部参考电压关闭时,不能使用比较器将器件从休眠或停止模式退出。
COMP 中断
可通过两种方式将比较器用作中断源。
比较器输出从内部连接到扩展中断和事件控制器。每个比较器都具有其各自的 EXTI 线,能
够产生中断或事件,可使器件退出低功耗模式。
比较器还提供有连接至 CPU 的 NVIC 的中断线。在 CPU 激活时使用该功能处理低延迟中
断。这需要 APB 时钟处于运行状态。
通过 EXTI 模块实现的中断
更多详细信息,请参见中断和事件部分。通过 EXTI 模块实现 COMPx 中断的程序:
将 EXTI 线(用于接收 comp_wkup 信号)配置为中断模式,选择上升沿、下降沿或任
一边沿有效,然后使能 EXTI 线。
配置并使能映射到相应 EXTI 线的 NVIC IRQ 通道。
使能 COMPx。
通过 CPU 的 NVIC 实现中断
通过 CPU 的 NVIC 实现 COMPx 中断的程序:
配置并使能映射到 comp_it 线的 NVIC IRQ 通道。
在 COMP_CFGRx 中配置并使能 ITEN。
使能 COMPx。
注: 要使用该中断,需要使能 APB 时钟。如果未使能该时钟,则不会生成中断。
SCALER 功能
调节器模块用于为各个比较器输入提供不同的参考电压。其基于一个驱动电阻桥的放大器。
放大器输入连接至内部参考电压。
放大器和电阻桥可单独使能。放大器由 COMP_CFGRx 寄存器的 SCALEN 位使能。电阻桥由 COMP_CFGRx 寄存器的 BRGEN 位使能。
如果未使用电阻分压,则可断开电阻桥,以降低功耗。断开后,1/4 VREF_COMP、1/2 VREF_COMP和 3/4 VREF_COMP 值等于 VREF_COMP。
作为模拟信号的触发源,从低功耗模式唤醒
模拟比较器用作信号触发源,从低功耗模式中唤醒。此应用例程可以在.pack包中找到相关例程:COMP_Interrupt
从低功耗模式中唤醒例程配置:使用内部1.2V参考电压,作为反向端(INM),正向端(INP):PB0引脚作为信号输入端。
/**
* @brief COMP configuration
* @param None
* @retval None
*/
void COMP_Config(void)
{
/*##-1- Configure the COMP1 peripheral ###################################*/
Comp1Handle.Instance = COMP1;
Comp1Handle.Init.InvertingInput = COMP_INPUT_MINUS_VREFINT;//内部参考电压作为VINP:1.2V±02
Comp1Handle.Init.NonInvertingInput = COMP_INPUT_PLUS_IO1; /* PB.00 */
Comp1Handle.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED;
Comp1Handle.Init.Mode = COMP_POWERMODE_HIGHSPEED;
Comp1Handle.Init.Hysteresis = COMP_HYSTERESIS_NONE;
Comp1Handle.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
Comp1Handle.Init.WindowMode = COMP_WINDOWMODE_DISABLE;
Comp1Handle.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING;
if(HAL_COMP_Init(&Comp1Handle) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
}
/**
* @brief COMP MSP Initialization
* This function configures the hardware resources used in this example:
* - Peripheral's clock enable
* - Peripheral's GPIO Configuration
* - NVIC configuration for COMP interrupt request enable
* @param hcomp: COMP handle pointer
* @retval None
*/
void HAL_COMP_MspInit(COMP_HandleTypeDef *hcomp)
{
GPIO_InitTypeDef GPIO_InitStruct;
/*##-1- Enable peripherals and GPIO Clocks #################################*/
/* Enable GPIO clock ***************************************************/
COMPx_GPIO_CLK_ENABLE();
/* Enable COMP peripheral clock ****************************************/
__HAL_RCC_COMP12_CLK_ENABLE();
/*##-2- Configure peripheral GPIO ##########################################*/
/* COMP GPIO pin configuration */
GPIO_InitStruct.Pin = COMPx_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(COMPx_GPIO_PORT, &GPIO_InitStruct);
/*##-3- Configure the NVIC for COMPx #######################################*/
/* Enable the COMPx IRQ Channel */
HAL_NVIC_SetPriority(COMPx_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(COMPx_IRQn);
}
main:
/* Configure the COMP1 peripheral */
COMP_Config();
/*## Enable peripherals ####################################################*/
/* Start COMP1 */
if(HAL_COMP_Start_IT(&Comp1Handle) != HAL_OK)
{
/* Initialization Error */
Error_Handler();
}
/* Enter STOP mode */
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);//进入停机模式
/* ... STOP mode ... */
/* at that point, MCU has been awoken */
//当PB0引脚电压信号大于1.2V时,停机模式会被唤醒,继续执行下面的代码,需要重新初始化时钟和其他需要使用到的外设。
/* Re-configure the system clock */
SystemClock_Config();
比较器中断回调:
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp)
{
if (hcomp->Instance==COMP1)
{
// 执行相应的操作
COMP_TRG_** =1;
}
}
当比较器输入引脚PB0,输入电压在超过1.2V时,会响应中断。如果开启了停机模式,则会唤醒,继续执行HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);之后的代码。
————————————————
本文为Perseverance52博主原创文章,未经博主允许,不得转载!
原文链接:https://blog.csdn.net/weixin_42880082/article/details/143629612
|