STM32搭配NTC热敏电阻实现温度测量
创作时间:
作者:
@小白创作中心
STM32搭配NTC热敏电阻实现温度测量
引用
CSDN
1.
https://m.blog.csdn.net/weixin_61869372/article/details/138474839
本文将介绍如何使用STM32F103C8T6微控制器和10K B3435 NTC热敏电阻进行温度测量。通过详细的硬件连接、软件配置和代码实现,帮助读者掌握这一实用技能。
硬件连接
红色的线就是接线部分(比较简陋)
软件配置
使用CubeMX进行配置:
- 晶振配置
- ADC配置,选择通道1(PA0),其他默认
- USART配置,用于串口输出
- GPIO配置(可选),用于确认配置是否成功
- 最后生成代码
代码实现
在USART中添加串口重定向:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file usart.c
* @brief This file provides code for the configuration
* of the USART instances.
******************************************************************************
* @attention
*
* Copyright (c) 2023 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"
/* USER CODE BEGIN 0 */
#include "stdio.h"
/* 加入以下代码, 支持printf函数, 而不??要???择use MicroLIB */
#if 1
#if (__ARMCC_VERSION >= 6010050) /* 使用AC6编译器时 */
__asm(".global __use_no_semihosting\n\t"); /* 声明不使用半主机模式 */
__asm(".global __ARM_use_no_argv \n\t"); /* AC6下需要声明main函数为无参数格式,否则部分例程可能出现半主机模式 */
#else
/* 使用AC5编译器时, 要在这里定义__FILE ?? 不使用半主机模式 */
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* standard output using printf() for debugging, no file handling */
/* is required. */
};
#endif
/* 不使用半主机模式,至少需要重定义_ttywrch\_sys_exit\_sys_command_string函数,以同时兼容AC6和AC5模式 */
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* 定义_sys_exit()以避免使用半主机模式 */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE ?? stdio.h里面定义. */
FILE __stdout;
/* MDK下需要重定义fputc函数, printf函数??终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0)
; /* 等待上一个字符发送完?? */
USART1->DR = (uint8_t)ch; /* 将要发???的字符 ch 写入到DR寄存?? */
return ch;
}
#endif
/******************************************************************************************/
uint8_t g_rx_buffer[1]; /* HAL库使用的串口接收数据缓冲?? */
uint8_t g_usart1_rx_flag = 0; /* 串口接收到数据标?? */
/* USER CODE END 0 */
UART_HandleTypeDef huart1;
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, 1);
/* USER CODE END USART1_Init 2 */
}
void HAL_UART_MspInit(UART_HandleTypeDef *uartHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if (uartHandle->Instance == USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* USART1 clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN USART1_MspInit 1 */
HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
/* USER CODE END USART1_MspInit 1 */
}
}
void HAL_UART_MspDeInit(UART_HandleTypeDef *uartHandle)
{
if (uartHandle->Instance == USART1)
{
/* USER CODE BEGIN USART1_MspDeInit 0 */
/* USER CODE END USART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART1_CLK_DISABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9 | GPIO_PIN_10);
/* USER CODE BEGIN USART1_MspDeInit 1 */
/* USER CODE END USART1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, 1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1)
{
g_usart1_rx_flag = 1;
}
}
/* USER CODE END 1 */
main.c:
uint32_t ADC_Value;
double true_voltage;
double result_ou;
double temp;
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, 50);
if (HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC))
{
ADC_Value = HAL_ADC_GetValue(&hadc1);
true_voltage = ADC_Value * 3.3f / 4096;
printf("PA0 true Voltage value: %.4f \r\n", true_voltage);
result_ou = (2000 * true_voltage) / (3.27 - true_voltage);
printf("result_ou: %.4f\r\n", result_ou);
temp = 1.0 / (log(result_ou / 10000) / 3435 + 1 / (273.15 + 25)) - 273.15;
printf("temperature:%.4f\r\n", temp);
}
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
结果
(此处应有实验结果或数据展示,但原文未提供具体结果)
热门推荐
老鹰可以驯服吗?野性的天空霸主能否成为人类伙伴?
古代皇帝犯错的惩罚方式
40岁手麻不慌,四招教你舒缓手部不适!
《天道》一个玄学现象:一旦你不争辩不讨好,你就彻底悟透了人性
柴荣——后周的光辉帝王与治国明君
A股震荡反弹,港股全线爆发:市场解读与资金流向分析
别再焦虑了!你可能根本不是“骨盆前倾”!
生肖相冲如何化解?了解生肖相冲的影響與應對策略
盘古开天地:一个关于宇宙起源的古老传说
哥特艺术如何启发现代艺术?看梵高蒙克的回应
AI客服是做什么的?全面解析AI客服的功能与优势
情感街访:在一段感情中,信任和沟通哪个更重要?
台湾语文课本文言文删掉了四分之三,一场对中国传统文化的轻视?
福建长汀:绿水青山带笑颜
如何理解数的含义?这个指数在投资中有何作用?
女孩有多喜欢才会倒追?从心理学角度解析女生主动追求背后的情感
人工智能支持的网络安全:人工智能如何增强保护
心眼坏的人有这三个特征,聪明人都会远离
INTP逻辑学家的恋爱指南:如何在感性与理性间找到平衡
如何选择合适的冰箱
豫商传奇:从商业起源到辉煌历程,揭秘河南商人的千年兴衰史
固态电池发展提速 多家上市公司发声加码布局
属鼠与属龙的婚姻匹配关系分析 属鼠属龙伴侣的性格与相处之道
为什么迈克·弗拉纳根的《黑暗塔》必须聚焦于真正的反派
英伟达市值一夜之间蒸发1285亿美元,业绩和前景引发市场担忧
新疆大盘鸡的美味做法与历史渊源
全网最全的哈尔滨冰雪大世界梦幻冰雪馆攻略来啦!
李渊是如何在五个月内攻占长安建立唐朝的?
“海底捞月”还是“水滴石穿”?期末数学题引热议,看了答案笑死
探索游戏世界:多样类型,哪种魅力最吸引你?