这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程23-内部比较器控制板载LED灯

共7条 1/1 1 跳转至

NUCLEO-U083RC学习历程23-内部比较器控制板载LED灯

助工
2025-02-01 22:33:49     打赏

今天和大家分享一下STM32U0系列的比较器(COMP)的学习例程;

一:查看STM32U0的手册我们可以得知如下信息:

STM32U083xC嵌入了两个嵌入式轨对轨模拟比较器,这些比较器具有可编程参考电压(内部或外部)、滞环、速度(低功率时为低)和输出极性。

参考电压可以是下列电压之一:外部,来自I/O、内部,来自DAC、内部基准电压(VREFINT)或其子电压(1/4,1/2,3/4)

用途:比较器可以从停止模式唤醒设备,为定时器生成中断、中断或触发,还可以组合成窗口比较器。

下面是对手册知识的一些个人的理解:

基本概念:比较器通常具有两个输入引脚,分别为非反相输入(IN+)和反相输入(IN-)。IN+输入接收待比较的信号,而IN-输入接收一个参考电压。比较器会根据这两个输入的电压大小关系输出一个比较结果,可以是高电平(逻辑1)或低电平(逻辑0)。这个功能比较简单,本次对该处进行学习调试;

stm32的比较器模块支持配置为窗口比较器,即在两个参考电压之间进行比较。此外,一些stm32微控制器还支持模拟窗口模式,即通过设置比较器阈值来限制输入信号的有效范围。

比较器模块可与功能模块(TIME、EXIT等)进行连接,以实现更复杂的应用。例如,可以使用比较器输出触发定时器的计数、产生中断或控制其他外设的操作。

二:本次学习的内容

使用STM32 cube MX 配置comp外设,以将施加在特定引脚上的外部电压与 DAC 产生的锯齿信号进行比较。

2.1 COMP 比较器的配置如下所示:

0202-1.png

2.2 DAC引脚的配置如下所示:

0202-2.png

2.3 引脚的配置如下所示:

0202-3.png

三:代码如下所示:

3.1 comp1代码初始化:

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_NONE;
  hcomp1.Init.BlankingSrce = COMP_BLANKINGSRC_NONE;
  hcomp1.Init.Mode = COMP_POWERMODE_HIGHSPEED;
  hcomp1.Init.WindowMode = COMP_WINDOWMODE_DISABLE;
  hcomp1.Init.TriggerMode = COMP_TRIGGERMODE_NONE;
  if (HAL_COMP_Init(&hcomp1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN COMP1_Init 2 */

  /* USER CODE END COMP1_Init 2 */

}

3.2 DAC的配置初始化:

/**
  * @brief DAC1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_DAC1_Init(void)
{

  /* USER CODE BEGIN DAC1_Init 0 */

  /* USER CODE END DAC1_Init 0 */

  DAC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN DAC1_Init 1 */

  /* USER CODE END DAC1_Init 1 */

  /** DAC Initialization
  */
  hdac1.Instance = DAC1;
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    Error_Handler();
  }

  /** DAC channel OUT1 config
  */
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_BOTH;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DAC1_Init 2 */

  /* USER CODE END DAC1_Init 2 */

}

3.3 主程序代码:判断引脚电压 与DAC引脚电压,从而控制板载的LED灯

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1,
                        DAC_ALIGN_12B_R,
                        dac_steps*DAC_SAWTOOTH_STEPINC) != HAL_OK)
    {
      /* Setting value Error */
      Error_Handler();
    }
    dac_steps++;
    if (dac_steps > DAC_SAWTOOTH_STEPS)
    {
      dac_steps = 0;
    }
    HAL_Delay(5);
    
    /* Set LED state in function of state of comparator output.               */
    /* Note: State of comparator is monitored for the purpose of this example.*/
    if (HAL_COMP_GetOutputLevel(&hcomp1) == COMP_OUTPUT_LEVEL_HIGH)
    {
      BSP_LED_On(LED4);
      
    }
    else
    {
      BSP_LED_Off(LED4);
    }
  }

实物测试图如下所示:

0202 00_00_00-00_00_30.gif

本节总结:

比较器输入连接到引脚 PA1上,接入板载电压3V3。DAC 输出在内部连接到比较器的其他输入,在外部连接到引脚 PA4(连接器 CN8 上的引脚 A2)。比较器输出连接到引脚 PA0。

 INP 高于 INM 时,OUT 为高电平。否则,OUT 为低电平。即可以看到板载LED灯的亮灭。




关键词: NUCLEO-U083RC     比较器    

院士
2025-02-02 00:04:11     打赏
2楼

这个比较器可以在内部与DAC形成回环吗?从而可以轻松配置比较器触发的阈值啊?


高工
2025-02-02 13:47:32     打赏
3楼


院士
2025-02-02 22:53:27     打赏
4楼

明白了,谢谢。

之前没有仔细阅读过DAC外设这一章的内容


专家
2025-02-03 00:26:27     打赏
5楼

感谢分享


专家
2025-02-03 00:28:46     打赏
6楼

感谢分享


专家
2025-02-03 00:31:36     打赏
7楼

感谢分享


共7条 1/1 1 跳转至

回复

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