今天和大家分享一下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 比较器的配置如下所示:
2.2 DAC引脚的配置如下所示:
2.3 引脚的配置如下所示:
三:代码如下所示:
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); } }
实物测试图如下所示:
本节总结:
比较器输入连接到引脚 PA1上,接入板载电压3V3。DAC 输出在内部连接到比较器的其他输入,在外部连接到引脚 PA4(连接器 CN8 上的引脚 A2)。比较器输出连接到引脚 PA0。
INP 高于 INM 时,OUT 为高电平。否则,OUT 为低电平。即可以看到板载LED灯的亮灭。