STM32F103基于公式计算实现3380 NTC温度检测电路设计与编程
引言
本教程将详细介绍如何使用STM32F103微控制器设计一个简单而有效的NTC温度检测电路,并附上完整的C代码示例。我们选择了3380 10K NTC热敏电阻,该电阻在-40°C至+125°C范围内表现出色。
NTC温度检测电路设计
1. NTC电阻的选择
首先,我们选择了3380 10K NTC热敏电阻,这是一个常见的型号,适用于多种温度检测应用。其阻值会随温度的变化而变化,为我们提供了可靠的温度信息。
2. 电路连接
我们使用一个简单的电压分压电路,将NTC电阻与一个10K电阻连接,中点通过ADC引脚连接到STM32F103微控制器。这样的电路配置允许我们通过ADC读取NTC电阻的电压,从而获取温度信息。
3. 分压电阻的选择
由于我们选择的NTC电阻是10K,我们也选择了一个10K的分压电阻。这确保了在较大的温度范围内提供较大的电压变化,以增加测量的灵敏度。
STM32F103代码示例
以下是使用STM32F103的C代码示例,用于读取NTC电阻的温度,并通过串口输出。代码中包含了详细的注释,方便理解和定制。
#include "stm32f10x.h"
#include "stdio.h"
// 定义分压电阻值
#define R1 10000.0
// 定义ADC通道
#define ADC_CHANNEL 0
// 温度相关参数
#define B_VALUE 3380
#define REFERENCE_RESISTANCE 10000.0
#define ROOM_TEMPERATURE 25.0
// 函数声明
void ADC_Configuration(void);
float Read_Temperature(void);
int main(void) {
// 初始化时钟
SystemInit();
// 配置ADC
ADC_Configuration();
// 初始化串口
// 请根据实际情况配置串口
// 主循环
while (1) {
// 读取温度
float temperature = Read_Temperature();
// 输出到串口
printf("Temperature: %.2f degrees Celsius\r\n", temperature);
// 延时
for (int i = 0; i < 500000; i++);
}
}
void ADC_Configuration(void) {
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
// 使能 ADC1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// 使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 ADC 输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置 ADC 参数
ADC_DeInit(ADC1);
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 配置 ADC 通道
ADC_RegularChannelConfig(ADC1, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);
// 使能 ADC
ADC_Cmd(ADC1, ENABLE);
// 校准 ADC
ADC_ResetCalibration(ADC1);
while (ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while (ADC_GetCalibrationStatus(ADC1));
}
float Read_Temperature(void) {
// 启动 ADC 转换
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
// 等待转换完成
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
// 读取 ADC 值
uint16_t adc_value = ADC_GetConversionValue(ADC1);
// 计算电压值
float voltage = (float)adc_value / 4095.0 * 3.3;
// 计算NTC电阻值
float ntc_resistance = (voltage * R1) / (3.3 - voltage);
// 计算温度
float temperature = 1.0 / ((1.0 / ROOM_TEMPERATURE) + (1.0 / B_VALUE) * log(ntc_resistance / REFERENCE_RESISTANCE));
return temperature - 273.15; // 转换为摄氏温度
}
温度计算和公式
在Read_Temperature
函数中,我们使用了热敏电阻的Steinhart-Hart方程进行温度计算。这个公式在数据手册中通常可以找到,用于将电阻值转换为温度。也可以基于组织表,通过查表形式转换温度。
注意事项
结论
通过本教程,我们详细介绍了如何使用STM32F103微控制器设计一个基本的NTC温度检测电路,并提供了完整的C代码示例。这个电路和代码可以作为起点,根据具体应用需求进行定制和优化。在实际应用中,请确保遵循相关硬件和软件设计的最佳实践,以获得准确和可靠的温度测量。
作者:字节人生