在之前的文章中,分别分享了比较器的检测外部差分输入和单端输入的使用方法,今天和大家继续分享比较器的使用经验;
主要分享内容:如何配置比较器外设将施加在 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 指示灯仍亮
我要赚赏金
