<strong>前言</strong>
STM32H7 集成了运算放大器(COMP),可与模拟信号进行比较来进行电压检测,内置的 COMP 节省了 MCU 外接 COMP 的硬件成本。本文将介绍 STM32H7 的片内 COMP 的不同工作模式,并提供配置 COMP 的例程。
<strong>STM32H7 模拟比较器(COMP)特性</strong>
以下是 STM32H7 模拟比较器主要特性:
• 两个独立的比较器 COMP1 和 COMP2 可以组合在一起来创建一个窗口比较器
• 可编程的比较器迟滞
• 可编程的速度和功耗
• 可配置的正和负输入
• 多路复用 I/O 引脚,DAC 通道 1 和 2,内部参考电压和三个因数值
• 输出重定向
o 配置 I/Os
o 计时器——打断事件给快速 PWM 关闭,逐周期电流控制,输入捕获给时间测量
o 输出 blanking 源
• 比较两个模拟信号,并提供数字输出指示哪个大
• 有能力从停止模式唤醒 CPU
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36047-1.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
<strong>STM32H7 模拟比较器(COMP)特性工作模式</strong>
<font color="blue">COMP 窗口模式</font>
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36048-2.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
窗口比较器的目的是指示,如果模拟电压比阈值电压更低或更高,应用于每一个比较器的反相输入。两个非反相输入端可以在内部连接,通过启用 WINMODE,可以节省一个 IO 口,用作其它的用途。
<font color="blue">COMP 打断信号生成</font>
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36049-3.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
比较器(COMP1/COMP2) 输出值能产生打断输入信号给定时器 (TIM1 & TIM8) 在输入脚 TIMx_BKIN or TIMx_BKIN2 通过配置 GPIO alternate function。
<font color="blue">COMP Blanking</font>
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36050-4.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
防止在 PWM 周期的开始由于短周期电流峰值,电流调节跳闸。掩码 COMP 输出重定向到定时器打断输入。
<strong>应用实例</strong>
<font color="blue">硬件环境</font>
本文硬件环境基于 STM32H743I_EVAL。CN6 的第 29 引脚(PB0)作为 COMP1 模拟电压的输入引脚。
<font color="blue">软件配置</font>
虽然 STM32H7 系列中的 ADC 可用作模拟看门狗,看门狗的阈值上限和下限均可编程,但是由于 ADC 在停机模式下会断电,因此 MCU 必须保持在运行模式下才能监视输入端的模拟电压。对于 STM32H743xx 器件,可将 COMP1,此看门狗可在 MCU 处于停机模式下时保持通电状态。这样既可降低功耗,又可实现节能。在模拟看门狗应用中, COMP1 通过外部中断线配置,以在模拟输入电压超过 VREFINT 时使 MCU 退出停机模式。若在整个过程中,模拟电压都处于定义的阈值范围内,MCU 将一直处于停机模式,从而降低功耗。当模拟电压超过定义的阈值时,可通过切换至运行模式来降低平均功耗。
以下是通过 STM32CubeMX 来配置工程实例:
1.选择 STM32H743XI,打开 HSE,PF10 设置为 GPIO 输出,PB0 设置为 COMP 输入。
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36051-5.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
2. 配置系统时钟为 400MHz 系统时钟以及其它总线时钟。
<center><img width="600" src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36052-6.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
3. 配置 COMP1 中断为上升沿触发。
<center><img src="http://mcu.eetrend.com/files/2018-02/wen_zhang_/100010404-36053-7.png&q…; alt="模拟比较器 COMP 在 STM32H7 上的应用"></center>
CubeMX 中已经配置了一个简单的 COMP1 模拟看门狗的例子,使用 STM32CubeMX 工具 STM32H743XI 生成工程代码,并在 main.c 中添加如下红色的部分代码来开启 COMP1、使能 COMP1 中断,以及添加应用代码。
<pre style="background-color:#e9e9e9;">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 */
}
</pre>
Startup_stm32h743xx.s 中定义的 COMP1 全局中断服务函数名是 COMP1_IRQHandler,而通过 STM32CubeMX 生成的COMP1 全局中断服务函数名是 COMP_IRQHandler。
<pre style="background-color:#e9e9e9;">DCD COMP1_IRQHandler ; COMP1 global Interrupt </pre>
对 stm32h7xx_it.c 进行修改,如下所示:
<pre style="background-color:#e9e9e9;">/**
* @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 */
}
</pre>
改为
<pre style="background-color:#e9e9e9;">/**
* @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 */
/</pre>
至此,完成的工程已经建立。运行软件后,LED1 默认熄灭并进入待机模式。加 1.22V 或者高于 1.22V 的外部电压到PB0 引脚将触发 COMP1 中断,MCU 被唤醒并点亮 LED1。延时大约 5 秒后,LED1 熄灭并再次进入待机模式,等待 PB0 引脚外部模拟信号触发中断。
<strong>总结</strong>
片内的 COMP 可对模拟信号进行比较处理,配合片内的 DAC 和定时器等外设联合工作,可满足各种不同的应用需求。本文提供了 STM32LH7 COMP 的一个简单易用的例子,更多详细的应用请参考 <a href="http://mcu.eetrend.com/content/2018/100010405.html">STM32H7x3 用户手册</a>及相关资料。