1、cubemx配置
1.1、系统配置
1.2、GPIO配置
PB2设置为“GPIO_Output”
user label设置为“LED”
1.3、串口配置
模式选择为“Asynchronous”,其他默认
1.4、时钟树配置
全部保持默认
2、ADC配置
通道选择“Temperature Sensor Channel”,其他默认
3、程序
3.1、头文件
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
#include <string.h>
#include <stdio.h>
#include <math.h>
/* USER CODE END 0 */
3.2、变量定义
/* USER CODE BEGIN 1 */
uint8_t tx_data[100];
uint32_t ADC_Value;
float ADC_Voltage,ADC_Temperature;
/* USER CODE END 1 */
3.3、ADC采集
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
if(HAL_ADC_PollForConversion(&hadc1, 20)==HAL_OK)
{
ADC_Value=HAL_ADC_GetValue(&hadc1);
// ADC_Voltage=ADC_Value*3.3/4096;
// ADC_Temperature = ( ADC_Voltage - 0.76)/0.0025 + 25;
//mv
ADC_Voltage=ADC_Value*3300/4096;
ADC_Temperature = ( ADC_Voltage - 760)/2.5 + 25;
sprintf((char *)tx_data,"采样值=%d,电压值=%fmV,温度值=%f℃",(int)ADC_Value,ADC_Voltage,ADC_Temperature);
HAL_UART_Transmit(&huart1, tx_data, sizeof(tx_data), 1000);
}
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
HAL_ADC_Stop(&hadc1);
HAL_Delay(1500);
/* USER CODE END WHILE */
4、实验结果
5、bug处理记录
5.1、串口输出中文乱码
IDE在sprintf出提示
The float formatting support is not enabled, check your MCU Settings from "Project Properties > C/C++ Build > Settings > Tool Settings", or add manually "-u _printf_float" in linker flags.
解决方法
菜单栏:Project→Properties
5.2、温度采集偏差太大
解决方法
采用更稳定的电源供电
jlink供电时VREF+引脚的测量结果 | usb供电时VREF+引脚的测量结果 |
参考
【【小蜜蜂笔记】基于STM32CubeMX的嵌入式开发基础教程】 https://www.bilibili.com/video/BV1m7411H7oT/?p=8&share_source=copy_web&vd_source=f42320918d590ee8bddbeea3951af1af
HAL STM32F4内部温度读取+ADC阻塞式读取_hal 407 内部温度-CSDN博客https://blog.csdn.net/weixin_42880082/article/details/137615388STM32CubeMX | HAL库的ADC多通道数据采集(轮训、DMA、DMA+TIM)、读取内部传感器温度_tim+adc+dma采集-CSDN博客https://blog.csdn.net/qq153471503/article/details/108123019STM32F407内部温度偏差太大 (stmicroelectronics.cn)https://shequ.stmicroelectronics.cn/forum.php?mod=viewthread&tid=605494&&extra=