模拟比较器 COMP 在 STM32H7 上的应用

judy的头像
judy 发布于:周二, 02/27/2018 - 11:23 ,关键词:

前言

STM32H7 集成了运算放大器(COMP),可与模拟信号进行比较来进行电压检测,内置的 COMP 节省了 MCU 外接 COMP 的硬件成本。本文将介绍 STM32H7 的片内 COMP 的不同工作模式,并提供配置 COMP 的例程。

STM32H7 模拟比较器(COMP)特性

以下是 STM32H7 模拟比较器主要特性:

• 两个独立的比较器 COMP1 和 COMP2 可以组合在一起来创建一个窗口比较器
• 可编程的比较器迟滞
• 可编程的速度和功耗
• 可配置的正和负输入
• 多路复用 I/O 引脚,DAC 通道 1 和 2,内部参考电压和三个因数值
• 输出重定向
o 配置 I/Os
o 计时器——打断事件给快速 PWM 关闭,逐周期电流控制,输入捕获给时间测量
o 输出 blanking 源
• 比较两个模拟信号,并提供数字输出指示哪个大
• 有能力从停止模式唤醒 CPU

模拟比较器 COMP 在 STM32H7 上的应用

STM32H7 模拟比较器(COMP)特性工作模式

COMP 窗口模式

模拟比较器 COMP 在 STM32H7 上的应用

窗口比较器的目的是指示,如果模拟电压比阈值电压更低或更高,应用于每一个比较器的反相输入。两个非反相输入端可以在内部连接,通过启用 WINMODE,可以节省一个 IO 口,用作其它的用途。

COMP 打断信号生成

模拟比较器 COMP 在 STM32H7 上的应用

比较器(COMP1/COMP2) 输出值能产生打断输入信号给定时器 (TIM1 & TIM8) 在输入脚 TIMx_BKIN or TIMx_BKIN2 通过配置 GPIO alternate function。

COMP Blanking

模拟比较器 COMP 在 STM32H7 上的应用

防止在 PWM 周期的开始由于短周期电流峰值,电流调节跳闸。掩码 COMP 输出重定向到定时器打断输入。

应用实例

硬件环境

本文硬件环境基于 STM32H743I_EVAL。CN6 的第 29 引脚(PB0)作为 COMP1 模拟电压的输入引脚。

软件配置

虽然 STM32H7 系列中的 ADC 可用作模拟看门狗,看门狗的阈值上限和下限均可编程,但是由于 ADC 在停机模式下会断电,因此 MCU 必须保持在运行模式下才能监视输入端的模拟电压。对于 STM32H743xx 器件,可将 COMP1,此看门狗可在 MCU 处于停机模式下时保持通电状态。这样既可降低功耗,又可实现节能。在模拟看门狗应用中, COMP1 通过外部中断线配置,以在模拟输入电压超过 VREFINT 时使 MCU 退出停机模式。若在整个过程中,模拟电压都处于定义的阈值范围内,MCU 将一直处于停机模式,从而降低功耗。当模拟电压超过定义的阈值时,可通过切换至运行模式来降低平均功耗。

以下是通过 STM32CubeMX 来配置工程实例:

1.选择 STM32H743XI,打开 HSE,PF10 设置为 GPIO 输出,PB0 设置为 COMP 输入。

模拟比较器 COMP 在 STM32H7 上的应用

2. 配置系统时钟为 400MHz 系统时钟以及其它总线时钟。
模拟比较器 COMP 在 STM32H7 上的应用

3. 配置 COMP1 中断为上升沿触发。
模拟比较器 COMP 在 STM32H7 上的应用

CubeMX 中已经配置了一个简单的 COMP1 模拟看门狗的例子,使用 STM32CubeMX 工具 STM32H743XI 生成工程代码,并在 main.c 中添加如下红色的部分代码来开启 COMP1、使能 COMP1 中断,以及添加应用代码。

int main(void)
{
…
 /* Initialize all configured peripherals */
 MX_GPIO_Init();
 /* LED1 Off */
 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);

 MX_COMP1_Init();
 /* Start COMP1 */
 if(HAL_COMP_Start_IT(&hcomp1) != HAL_OK)
 {
 /* Initialization Error */
 Error_Handler();
 }
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
 /* Insert 5 second delay */
 HAL_Delay(5000);
 /* LED1 Off */
 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_SET);

 /* Enter STOP mode */
 HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
 /* ... STOP mode ... */

 /* at that point, MCU has been awoken */
 /* Re-configure the system clock */
 SystemClock_Config();
 /* LED1 On */
 HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET);
 }
 /* USER CODE END 3 */
}

Startup_stm32h743xx.s 中定义的 COMP1 全局中断服务函数名是 COMP1_IRQHandler,而通过 STM32CubeMX 生成的COMP1 全局中断服务函数名是 COMP_IRQHandler。

DCD COMP1_IRQHandler ; COMP1 global Interrupt 

对 stm32h7xx_it.c 进行修改,如下所示:

/**
* @brief This function handles COMP1 and COMP2 interrupts through EXTI lines 20 and 21.
*/
void COMP_IRQHandler(void)
{
 /* USER CODE BEGIN COMP_IRQn 0 */
 /* USER CODE END COMP_IRQn 0 */
 HAL_COMP_IRQHandler(&hcomp1);
 /* USER CODE BEGIN COMP_IRQn 1 */
 /* USER CODE END COMP_IRQn 1 */
}

改为

/**
* @brief This function handles COMP1 and COMP2 interrupts through EXTI lines 20 and 21.
*/
void COMP1_IRQHandler(void)
{
 /* USER CODE BEGIN COMP_IRQn 0 */
 /* USER CODE END COMP_IRQn 0 */
 HAL_COMP_IRQHandler(&hcomp1);
 /* USER CODE BEGIN COMP_IRQn 1 */
 /

至此,完成的工程已经建立。运行软件后,LED1 默认熄灭并进入待机模式。加 1.22V 或者高于 1.22V 的外部电压到PB0 引脚将触发 COMP1 中断,MCU 被唤醒并点亮 LED1。延时大约 5 秒后,LED1 熄灭并再次进入待机模式,等待 PB0 引脚外部模拟信号触发中断。

总结

片内的 COMP 可对模拟信号进行比较处理,配合片内的 DAC 和定时器等外设联合工作,可满足各种不同的应用需求。本文提供了 STM32LH7 COMP 的一个简单易用的例子,更多详细的应用请参考 STM32H7x3 用户手册及相关资料。

来源: http://www.stmcu.com.cn

围观 5503