本例介绍了两个例程STM32模数转换器(ADC),第一个通过ADC收集内部温度传感器通道的电压,然后得到MCU内部温度。第二个通过ADC读取电位调压模块输出的电压。
打开时钟的频率为72MHz
打开串口1,不打开串口中断
ADC选择温度传感器通道选择。
ADC1配置如下,选择默认设置。Date Alignment设置为数据右对齐。
生成报告、代码和编译程序。adc.c可以在文件中看到ADC初始化函数。
在stm32f1xx_hal_adc.h在头文件中可以找到以下内容ADC操作函数。和串口一样,ADC也可以三种方式控制。
在main变量保存在函数前面AD采集的值。
在main函数while循环里面添加函数声明变量保存AD采集的值。
HAL_ADC_Start(&hadc1);//打开ADC1 HAL_ADC_PollForConversion(&hadc1, 50) if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))//是判断转换标志位是否设置 { AD_Value = HAL_ADC_GetValue(&hadc1);//阅读ADC转换数据 printf("MCU Temperature:%.1f???\r\n",((AD_Value*3.3/4096-0.76)/2.5 25)); } HAL_Delay(1000);
AD_Value*3.3/4096将转换后的数据转换为电压,单位为V,参考电压为3.3V。查询数据手册中电压和温度之间的关系。计算公式后更换MCU内部温度值。
将编译程序下载到开发板上。打开串口助手,将波特率设置为115200,串口助手显示温度
2.读取单个引脚上的电压
在前面在此基础上打开ADC1里的IN0(PA0)
在主程序中添加以下程序
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1, 50); if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC)) { AD_Value = HAL_ADC_GetValue(&hadc1); printf("ADC1_IN0 AD_value: %.2fV\r\n",((AD_Value*3.3/4096))); } HAL_Delay(1000); } /* USER CODE END 3 */
编译正确后下载到开发板,调整电位器时获得AD转换值和电压值将变化,并通过串口打印出来.