今天继续对STM32系列的比较器(comp)进行深入的学习
一:学习内容:在中断模式下,如何使用比较器外设将施加在 GPIO 引脚上的电压电平与内部电压参考 (VrefInt) 进行比较;
硬件连接:使用PA1引脚作为COMP的正输入端;
可以使用外部电源产生 [0V;3.3V] 范围内的电压,并将其连接到模拟输入引脚(PA1引脚位置)。
注意:在浮空状态下,即PA1引脚没有接入电压时,会导致内部的COMP的输出不稳定。这点在我们调试代码时候要格外注意。
比较器实例 COMP1 配置为比较:
input plus 设置为模拟模式下的 GPIO 引脚(下面的 cf 引脚)。
input minus 设置为内部电压基准 VrefInt(电压电平 1.2V,有关最小值/typ/max 值,请参阅器件数据表)当触发边沿设置为边沿上升和下降时,使能比较器中断。
二:STM32 cube mx 软件配置
这里的配置需要区分一下,上个章节的配置,这里仅仅使用PA1引脚,直接使用的外部输入电压与内部基准进行比较;
而内部基准电压:可以为1/4,1/2,3/4的基准电压。
三:软件代码如下所示:
static void MX_COMP1_Init(void) { /* USER CODE BEGIN COMP1_Init 0 */ /* USER CODE END COMP1_Init 0 */ /* USER CODE BEGIN COMP1_Init 1 */ /* USER CODE END COMP1_Init 1 */ hcomp1.Instance = COMP1; hcomp1.Init.InputPlus = COMP_INPUT_PLUS_IO3; hcomp1.Init.InputMinus = COMP_INPUT_MINUS_VREFINT; hcomp1.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; hcomp1.Init.WindowOutput = COMP_WINDOWOUTPUT_EACH_COMP; hcomp1.Init.Hysteresis = COMP_HYSTERESIS_MEDIUM; hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE; hcomp1.Init.Mode = COMP_POWERMODE_HIGHSPEED; hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE; hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_IT_FALLING; if (HAL_COMP_Init(&hcomp1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN COMP1_Init 2 */ /* USER CODE END COMP1_Init 2 */ }
编写中断函数如下所示:
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp) { /* Set LED state in function of comparator output level */ if (HAL_COMP_GetOutputLevel(hcomp) == COMP_OUTPUT_LEVEL_HIGH) { BSP_LED_On(LED4); } else { BSP_LED_Off(LED4); } }
程序执行说明:
在主程序执行中,使能 comparator 。每当施加在 GPIO 引脚(比较器输入加)上的电压电平超过 VrefInt 电压阈值(比较器输入减)时,比较器就会产生中断。
LED4 用于监控程序执行状态:
正常执行情况如下所示:
如果 input plus 上的比较器电压电平高于 input -,则 LED 亮起
如果输入正上的比较器电压电平低于输入减,则 LED 熄灭
实物测试图片如下所示:
第二部分:
当系统进入停止模式后,依然可以通过比较器的中断依然正常工作;
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ /* Insert 5 second delay */ HAL_Delay(5000); /* Enter STOP mode */ HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); /* ... STOP mode ... */ /* Re-configure the system clock */ // SystemClock_Config(); }