在之前的文章中,分别分享了比较器的检测外部差分输入和单端输入的使用方法,今天和大家继续分享比较器的使用经验;
主要分享内容:如何配置比较器外设将施加在 GPIO 引脚上的电压电平与两个阈值进行比较:在中断模式下,内部电压参考 (VrefInt) 和内部电压参考 (VrefInt/2) 的一部分。
一:代码主要内容:
比较器实例 COMP1 和 COMP2 配置为在窗口模式下协同工作,以比较 2 个阈值:
在模拟模式下,COMP1 input plus 设置为 GPIO 引脚(下面的 cf 引脚)。不使用 COMP2 input plus(内部连接到与 COMP1 相同的 input plus)。
COMP1 输入负值设置为内部电压参考 VrefInt(电压电平 1.2V,有关最小值/典型值/最大值,请参阅器件数据表)
COMP2 输入负设置为内部电压基准 VrefInt 的 1/2(电压电平 0.6V)当触发边沿设置为边沿上升和下降时,使能比较器中断。
二:stm32cube mx 软件配置过程如下所示:
主要是是对comp1 和 comp2 进行不同的配置,从而达到双路比较器的同时使用的目的
三:软件代码编写如下:
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_RISING_FALLING; if (HAL_COMP_Init(&hcomp1) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN COMP1_Init 2 */ /* USER CODE END COMP1_Init 2 */ }
/** * @brief COMP2 Initialization Function * @param None * @retval None */ static void MX_COMP2_Init(void) { /* USER CODE BEGIN COMP2_Init 0 */ /* USER CODE END COMP2_Init 0 */ /* USER CODE BEGIN COMP2_Init 1 */ /* USER CODE END COMP2_Init 1 */ hcomp2.Instance = COMP2; hcomp2.Init.InputPlus = COMP_INPUT_PLUS_IO1; hcomp2.Init.InputMinus = COMP_INPUT_MINUS_1_2VREFINT; hcomp2.Init.OutputPol = COMP_OUTPUTPOL_NONINVERTED; hcomp2.Init.WindowOutput = COMP_WINDOWOUTPUT_EACH_COMP; hcomp2.Init.Hysteresis = COMP_HYSTERESIS_MEDIUM; hcomp2.Init.BlankingSrce = COMP_BLANKINGSRC_NONE; hcomp2.Init.Mode = COMP_POWERMODE_HIGHSPEED; hcomp2.Init.WindowMode = COMP_WINDOWMODE_COMP1_INPUT_PLUS_COMMON; hcomp2.Init.TriggerMode = COMP_TRIGGERMODE_IT_RISING_FALLING; if (HAL_COMP_Init(&hcomp2) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN COMP2_Init 2 */ /* USER CODE END COMP2_Init 2 */ }
由于是使用的中断触发的模式,这里将库函数弱定义的中断回调函数重新编写一下即可,如下所示:
void HAL_COMP_TriggerCallback(COMP_HandleTypeDef *hcomp) { __IO uint32_t COMP1OutputLevel = HAL_COMP_GetOutputLevel(&hcomp1); __IO uint32_t COMP2OutputLevel = HAL_COMP_GetOutputLevel(&hcomp2); /* Set LED state in function of comparator output level */ /* Case of voltage above comparators thresholds window */ if ( (COMP1OutputLevel == COMP_OUTPUT_LEVEL_LOW) && (COMP2OutputLevel == COMP_OUTPUT_LEVEL_LOW) ) { BSP_LED_Off(LED4); } /* Case of voltage below comparators thresholds window */ else if ( (COMP1OutputLevel == COMP_OUTPUT_LEVEL_HIGH) && (COMP2OutputLevel == COMP_OUTPUT_LEVEL_HIGH) ) { BSP_LED_Off(LED4); } /* Case of voltage inside comparators thresholds window */ else /* COMP1 output high, COMP2 output low */ { BSP_LED_On(LED4); } }
代码运行情况,及其试验现象:
每当施加在 GPIO 引脚(比较器输入加)上的电压电平超过与 VrefInt 相关的两个阈值之一(比较器输入减)时,具有相应阈值的比较器就会产生中断。
LED4 用于监控程序执行状态:
正常:
如果比较器电压电平在窗口阈值内(VrefInt 和 1/2 VrefInt 之间:1.2V 和 0.6V 之间),则 LED 亮起
LED 熄灭超出窗口阈值
错误:LED 指示灯仍亮