这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程25-中断模式下使用内部两路比较器的使用过程

共2条 1/1 1 跳转至

NUCLEO-U083RC学习历程25-中断模式下使用内部两路比较器的使用过程

助工
2025-02-04 22:54:36     打赏

在之前的文章中,分别分享了比较器的检测外部差分输入和单端输入的使用方法,今天和大家继续分享比较器的使用经验;

主要分享内容:如何配置比较器外设将施加在 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 指示灯仍亮




关键词: NUCLEO-U083RC     双路比较器     中断模式    

专家
2025-02-05 10:50:25     打赏
2楼

谢谢楼主分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]