STM32新手入门教程:T型贴片式热电偶温度传感器的使用

STM32新手入门教程:T型贴片式热电偶温度传感器的使用

  • 一:基础知识
  • 二:硬件介绍
  • 三:软件介绍
  • 四:硬件连接
  • 五:程序代码
  • 实现功能:利用STM32单片机采集T型贴片式热电偶温度传感器的温度数据,并显示在OLED显示屏上。

    一:基础知识

    STM32简介:是意法半导体(STMicroelectronics)推出的一款基于ARM Cortex-M内核的32位微控制器系列,具有高性能、低功耗和丰富的外设接口等特点。‌ STM32微控制器广泛应用于各种嵌入式系统设计和开发中,适用于手机、电脑、电视、汽车电子、军工、无线基带、工控、消费电子、家电和医疗器械等领域。

    二:硬件介绍

    本例程采用STM32F103C8T6开发板、温度传感器使用T型贴片式热电偶温度传感器、热电偶型温度变送器模块、电流转电压模块;

  • STM32F103C8T6:在模拟数字转换方面有2路12位ADC转换单元(ADC1、ADC2),ADC1和ADC2分别有10个转换头通道,分别为ADC12_IN1-ADC12_IN9,分别对应单片机上的PA0-PA7、PB0-PB1共10个引脚。模拟量输入为0-3.3V电压信号,对应的数字转换范围是0-4095(2的12次方)。
  • T型贴片式热电偶温度传感器:输出0-几十mV的弱电压信号,容易受到干扰,产生较大误差,所以不能直接接在单片机上,需要用到信号放大器,本例程选择热电偶型温度变送器充当信号放大器。
  • 热电偶型温度变送器:可以将热电偶温度传感器测量的温度信号转化为标准4-20mA、0-5V或0-10V等信号‌输出,方便远距离传输和后续处理‌。
  • 电流转电压模块:在电路信号传输的过程中电压信号会随着传输距离的增加变弱,而采用电流传输可以避免信号的变弱。本模块将用于传输末端将信号的电流信号转换成电压信号供单片机检测。电流输入支持4-20MA、0-20MA,电压输出支持0-3.3V、0-5V、0-10V。
  • 三:软件介绍

    本例程需要使用KEIL MDK软件以及STM32库文件进行编写程序;

  • KEIL MDK软件:也称MDK-ARM、Realview MDK、I-MDK、uVision4 等。Keil MDK是由三家国内代理商提供技术支持和相关服务。MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。 MDK-ARM专为微控制器应用而设计,不仅易学易用,而且功能强大,能够满足大多数苛刻的嵌入式应用。
  • STM32库文件:‌提供了大量的现成函数和驱动程序,库文件中的代码可以在多个项目中重复使用,减少了重复编码的工作量‌,开发者可以直接调用这些函数来配置硬件,而无需深入了解底层硬件细节,从而简化了开发过程‌,可以快速实现功能,减少开发时间,提高开发效率‌。
  • 四:硬件连接

    首先使用万用表对电流转电压模块进行调试。使用IT6302三路可编程直流电源供应器其中一路给模块提供24V电压(24V+接模块VCC,24V-接模块GND),一路给模块输入电流端提供4-20mA直流电流(电流+接模块I+,电流-接模块I-),对模块的输出电压范围选择为0-3.3V(可通过模块的跳线帽选择相应的量程),将万用表量程调到直流电压20V挡位,模块VOUT端接万用表电压端正极,模块GND端接万用表电压端负极,使用IT6302直流电源给模块输入4mA时调节模块ZERO电位器直至万用表显示0V,输入20mA时调节SPAN电位器直至万用表显示3.3V,即调试完成。

    电流转电压模块调试图1:电流转电压模块调试接线图

    模块调试完成后,即可对各传感器进行接线。将热电偶型温度变送器模块的1、2引脚分别接热电偶温度传感器的红黑插针,直流电源24V+接温度变送器的+端,温度变送器的-端接温度传感器的I+端,温度传感器的I-端接直流电源的24V-(这样才形成闭合回路);此时用调试完成的电流转电压模块,将其VOUT引脚接STM32F103C8T6单片机的PA1引脚(根据个人设置而定,可选引脚为PA0-PA7、PB0-PB1共10个模拟数字转换通道),电流转电压模块的GND引脚与单片机的GND引脚相连,即完成硬件接线。

    图2:传感器与单片机接线图

    五:程序代码

    硬件连接完成后,即可在KEIL MDK软件中进行编程来实现在OLED显示屏上实时显示温度数据。

  • ADC.c源文件程序:源文件主要用于实现头文件中声明的外设驱动函数。这些函数通常包括初始化函数、操作函数(如读、写、配置等)以及中断处理函数等。
  • #include "stm32f10x.h"                  // Device header
    
    void ADC_Config_Init(void)//ADC初始化配置
    {
      ADC_InitTypeDef  ADC_InitStructure;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
      RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    	
      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);
    
      /* ADC1 regular channel4 configuration */ 
    
      ADC_Cmd(ADC1, ENABLE);
    
      /* Enable ADC1 reset calibration register */   
      ADC_ResetCalibration(ADC1);
      /* Check the end of ADC1 reset calibration register */
      while(ADC_GetResetCalibrationStatus(ADC1)==SET);
    
    	
      /* Start ADC1 calibration */
      ADC_StartCalibration(ADC1);
      /* Check the end of ADC1 calibration */
      while(ADC_GetCalibrationStatus(ADC1)==SET);
    
      /* Start ADC1 Software Conversion */ 
      ADC_SoftwareStartConvCmd(ADC1, ENABLE);//启动ADC1,软件方式
    	
    }
    
    void GPIO_Config_Init(void)//GPIO初始化,PA1配置成ADC模拟输入
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;//模拟输入
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
    }
    
    
    uint16_t ADC_Read(uint8_t ADC_Channel)//ADC寄存器值
       {
    		 ADC_RegularChannelConfig(ADC1, ADC_Channel,1,ADC_SampleTime_71Cycles5); // 配置当前要读取的通道
    	     ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    		 while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET);
    		 return ADC_GetConversionValue(ADC1);
       }
    
    
  • ADC.h头文件:头文件主要包含对外设寄存器映射、功能函数和宏定义的声明。
    其他源文件(.c)需要包含这些头文件,以便使用外设的相关功能。
  • #include "stm32f10x.h"                  // Device header
    
    
    #ifndef _AD_H
    #define _AD_H
    
    void ADC_Config_Init(void);
    void GPIO_Config_Init(void);
    uint16_t ADC_Read(uint8_t ADC_Channel);//ADC寄存器值
    
    #endif
    
    
  • main主程序:在主程序中,通过包含头文件的方式,使编译器能够识别源文件中声明的函数。当需要使用某个外设功能时,只需在主程序中调用相应的函数即可。以 GPIO 为例,首先在头文件(如 stm32f10x.h)中声明 GPIO 相关的寄存器映射和功能函数,然后在相应的源文件(如 stm32f10xgpio.c)中实现这些函数。在主程序中,通过包含 stm32f10xh 头文件,就可以调用 GPIO 的初始化函数和操作函数。
  • #include "delay.h"
    #include "sys.h"
    #include "oled.h"
    #include "ADC.h"
    int Volt1,Tem;//定义电压和温度
    int main(void)
     {	
    	delay_init();//延时函数初始化,通过Systick中断实现1ms延时功能  
    	OLED_Init();//OLED初始化  
    	OLED_Clear();//清屏
        GPIO_Config_Init();//PA4引脚配置成模拟输入
    	ADC_Config_Init();//ADC配置,ADC1通道0
        OLED_ShowString(00,0,(uint8_t *)"Volt1: 000 mV");//显示电压值,单位mV
    	OLED_ShowString(00,2,(uint8_t *)"Tem:     ");//显示温度值,单位℃
      while (1) 
      {
            delay_init();//延时函数初始化,通过Systick中断实现1ms延时功能  
       		delay_ms(200);//等待200ms
    		ADCDat1 = ADC_Read(ADC_Channel_1);
    		Volt1 = (float)ADCDat1 / 4095 *3300;//数模转换公式
    		Tem = (float)ADCDat1 / 4095 *100;//现实的温度值
            OLED_ShowNum(55,0,Volt1,4,16);//显示温度电压值,单位mV	
    		OLED_ShowNum(45,2,Tem,3,16);//显示温度值,单位℃
    		delay_ms(200);//等待200ms
       }
     }
    
    

    T型贴片式热电偶温度传感器的使用

    作者:陆仁迦

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32新手入门教程:T型贴片式热电偶温度传感器的使用

    发表回复