单片机:实现温度传感器(附带源码)

一、设计思路

  1. 选择传感器:

    • LM35 是一种常用的模拟温度传感器,它的输出电压是线性变化的。对于每增加 1°C,输出电压增加 10 mV,适合通过 ADC 读取其输出并计算温度。
  2. 硬件连接:

    • LM35 的输出引脚需要接到 STM32 的 ADC 输入引脚(如 PA0)。通过 ADC,STM32 可以读取该引脚的电压,并计算温度值。
    • LM35 的电源引脚需要连接到 5V,地线连接到 GND。
  3. 系统流程:

    • 配置 STM32 的 ADC 模块来读取 LM35 的输出电压。
    • 根据读取的 ADC 值,利用公式计算出温度值。
    • 显示温度(通过串口输出,或通过 LCD 显示等)。
  4. 注意事项:

    • LM35 的输出电压与温度成正比,因此需要使用 STM32 的 ADC 功能来获取模拟信号。
    • 由于 STM32 的 ADC 输出是数字值,需要进行适当的计算和转换,最终得出温度。

二、硬件连接

  1. LM35 引脚:

    • VCC:连接到 5V 电源。
    • GND:连接到地。
    • Vout:输出模拟信号,连接到 STM32 的 ADC 输入引脚(如 PA0)。
  2. STM32 配置:

    • PA0 连接到 LM35 的输出端,作为 ADC 输入。
    • 需要使用 STM32 的 ADC 模块读取 PA0 的电压。

三、实现步骤

  1. ADC 配置:

    • 配置 STM32 的 ADC 模块读取模拟输入(PA0 引脚)。
    • 配置 ADC 的分辨率(通常 12 位),并启动 ADC 转换。
  2. 读取 ADC 数据:

    • 在 ADC 转换完成后,读取 ADC 的结果。
    • 将 ADC 结果转换为实际的电压值。
  3. 温度计算:

    • LM35 输出电压与温度成正比。每升高 1°C,输出电压增加 10 mV。通过计算公式:
    • 需要根据 STM32 ADC 的分辨率将 ADC 数据转换为电压,然后用上述公式计算温度。

四、代码实现

以下是一个简化的示例代码,展示如何读取 LM35 温度传感器的输出并计算温度值。

cpp 复制代码
#include "stm32f10x.h"
#include <stdio.h>

// 温度传感器计算公式
#define VREF 3.3f    // 假设 STM32 的参考电压为 3.3V
#define ADC_RESOLUTION 4096  // 12 位 ADC 分辨率

// ADC 初始化函数
void ADC1_Init(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
    
    // 配置 PA0 为模拟输入
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // ADC 配置
    ADC_InitTypeDef ADC_InitStruct;
    ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStruct.ADC_ScanConvMode = DISABLE;
    ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStruct);
    
    // 配置 ADC1 的通道 0 (PA0)
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
    
    // 启动 ADC
    ADC_Cmd(ADC1, ENABLE);
    
    // 校准 ADC
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));
}

// 读取 ADC 值并计算温度
float Read_Temperature(void) {
    // 启动 ADC 转换
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    
    // 等待转换完成
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    
    // 获取 ADC 转换结果
    uint16_t adc_value = ADC_GetConversionValue(ADC1);
    
    // 将 ADC 值转换为电压 (假设参考电压为 3.3V,12 位 ADC)
    float voltage = (adc_value / (float)ADC_RESOLUTION) * VREF;
    
    // 计算温度 (每增加 1°C,输出电压增加 10 mV)
    float temperature = voltage * 100.0f;  // 温度 = 电压 (V) * 100 (因为 1°C 对应 10mV)
    
    return temperature;
}

int main(void) {
    // 系统初始化
    SystemInit();
    
    // 初始化 ADC
    ADC1_Init();
    
    // 主循环
    while (1) {
        // 读取温度
        float temperature = Read_Temperature();
        
        // 打印温度值(可以使用串口或其他显示方式)
        printf("Temperature: %.2f°C\n", temperature);
        
        // 延时 (避免输出过于频繁)
        for (int i = 0; i < 1000000; i++);
    }
}

五、代码解读

  1. ADC1_Init 函数:

    • 该函数初始化 ADC1 模块,配置 PA0 为模拟输入,并设置 ADC 模式。
    • 使用 ADC_Init 配置 ADC 的基本参数,如工作模式、转换触发方式等。
    • 配置 ADC 的采样时间和通道,使其读取 PA0 引脚的电压。
  2. Read_Temperature 函数:

    • 启动 ADC 转换并等待转换完成。
    • 从 ADC 获取转换结果(12 位数据),并将其转换为实际电压。
    • 使用公式 温度 = 电压 * 100 将电压转换为温度。因为 LM35 的输出电压每增加 1°C 增加 10 mV,因此乘以 100 即为最终温度值。
  3. 主程序:

    • 在主程序中,我们通过 Read_Temperature 获取温度,并通过 printf 打印温度值。打印过程可以通过串口、LCD 或其他显示设备输出。

六、总结

  • 硬件设计:我们使用了 LM35 温度传感器并通过 STM32 的 ADC 模块读取其输出电压。通过 ADC 获取的值可以转换为实际的温度。
  • 关键点:ADC 的配置与读取、温度计算的公式以及如何处理 ADC 输出。
  • 应用场景:该设计可以应用于温度监控系统、环境检测、智能家居等嵌入式项目中。
  • 扩展性:这个基本框架可以根据需求进一步扩展,比如使用数字温度传感器(如 DS18B20),或者将温度数据传输到远程服务器进行处理等。
相关推荐
芯岭技术郦4 小时前
32 位 ARM® Cortex®-M0+ 内核MCU普冉MS32C001-C
单片机·嵌入式硬件
骑着毛驴数星星4 小时前
STM32 CAN波特率与采样点计算,基于HAL库
stm32·单片机·嵌入式硬件
zhangrelay5 小时前
Arduino-MEGA-ESP单片机理论课笔记02-硬件-2026
笔记·单片机·嵌入式硬件
艾芯微科技5 小时前
钰泰 ETA5055V330DD1E|SOT-223 3.3V LDO,低压差、大电流线性稳压选型分享
网络·单片机·嵌入式硬件·集成测试·51单片机
新晨单片机设计6 小时前
S023A-基于STM32单片机智能插座【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·单片机智能插座
威嵌神州7 小时前
恩智浦 T1022 性能怎么样?QorIQ 架构中端工业嵌入式优势解析
嵌入式硬件
weixin_690654747 小时前
龙迅#LT9611EX 现MIPI转HDMI1.4功能主推型号,分辨率高达4K30HZ,IC内置I2C无需外部12C控制。
嵌入式硬件·音视频·信号处理
EatFans7 小时前
全栈自造 Status Deck(四):硬件终于到了,从点亮屏幕到跑通第一个 Demo
单片机·物联网
qq_401700417 小时前
STM32 GPIO 精讲|推挽 / 开漏 / 上拉浮空,工程选型避坑
stm32·单片机·嵌入式硬件
创界工坊工作室8 小时前
19-基于单片机的宠物喂养控制系统设计
stm32·单片机·嵌入式硬件·proteus·宠物