STM32内部温度传感器

本章所要实现的功能是:通过芯片内部温度传感器读取温度,并将读取的温 度数据打印出去,DS0 指示灯闪烁提示系统正常运行。程序框架如下: (1)初始化内部温度传感器(初始化 ADC1_IN16,开启温度传感器) (2)编写温度读取函数

(3)编写主函数

开发步骤

(1)初始化 ADC1_IN16 相关参数,开启内度温度传感器 ADC1_IN16 的初始化步骤与上一章介绍 AD 模数转换实验一样,这里我们只 需要开启内部温度传感器即可,调用的库函数为: ADC_TempSensorVrefintCmd(ENABLE);//打开 ADC 内部温度传感器 (2)读取 ADC1_IN16 AD 值,将其转换为对应温度 上一步配置好后,我们就可以读取温度传感器的电压值,根据温度计算公式, 可以求出对应电压值的温度,具体方法与上一章一样

adc_temp.h+adc_temp.c

#ifndef _adc_temp_H
#define _adc_temp_H
#include "system.h"

void ADC_Temp_Init();
u16 Get_ADC_Temp_Value(u8 ch, u8 times);
float Get_Temperture();
#endif
#include "adc_temp.h"
#include "SysTick.h"

void ADC_Temp_Init()
{
    ADC_InitTypeDef ADC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 , ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div6);
    
    ADC_TempSensorVrefintCmd(ENABLE);
    
    ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;// ADC 单次转换disable或者连续转换选择enable
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;// ADC 数据寄存器对齐格式
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;// ADC 转换触发信号选择,未使用外部触发
    ADC_InitStructure.ADC_Mode=ADC_Mode_Independent ;// ADC 工作模式选择
    ADC_InitStructure.ADC_NbrOfChannel=1;// ADC 采集通道0x1-0x10
    ADC_InitStructure.ADC_ScanConvMode=DISABLE;; /* ADC 扫描enable(多通道)或者单次disable(单通道)模
式选择 */
    
    ADC_Init( ADC1, &ADC_InitStructure);
    
    ADC_Cmd( ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);//复位校准
    while(ADC_GetResetCalibrationStatus(ADC1));//检测到复位校准状态完成之后退出循环
    
    ADC_StartCalibration(ADC1);//开始指定adc1的校准状态
    while(ADC_GetCalibrationStatus( ADC1));//原理同上
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启ad转换,软件触发模式
    
        
}
u16 Get_ADC_Temp_Value(u8 ch, u8 times)//得到ADC的值,ch通道值,times循环多次取平均值得次数
{
    ADC_RegularChannelConfig( ADC1, ch,1, ADC_SampleTime_239Cycles5 );
    u8 i=0;
  u32 temp_val=0;
    for(i=0;i<times;i++)
    {
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);//因为选择的是单次转换
        //每采集一次就结束,采集关闭,所以要开启转换,从而多次开启取平均值
        while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0);//转换完成返回1
        temp_val+=ADC_GetConversionValue(ADC1);
        delay_ms(5);
    }
    return temp_val/times;

}

float Get_Temperture()
{
    u32 val=0;
    float V;
    float temperture=0;
    val=Get_ADC_Temp_Value(ADC_Channel_16,20);
    V=(float)val*(3.3)/4096;//电压转换公式,AD值*3.3/2的12次方(4096)
    temperture=((V-1.43)/0.0043)+25;//温度计算公式,具体看开发手册
    return temperture;
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "time.h"
#include "pwm.h"
#include "usart.h"
#include "stdio.h"
#include "iwdg.h"
#include "wwdg.h"
#include "input.h"
#include "touch_key.h"
#include "wkup.h"
#include "adc.h"
#include "adc_temp.h"
int main()
{
    u16 i=0;
    float tempture_val=0;
    float V;//将AD值转换为电压值
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组
  SysTick_Init(72);
    LED_Init();
    USART1_Init(115200);//波特率115200
    ADC_Temp_Init();
    while(1)
    {
        i++;
        if(i%20==0)LED1=!LED1;
        delay_ms(10);
        
        if(i%100==0)
        {
            tempture_val=Get_Temperture();
            if(tempture_val>0)
            {
                printf("内部温度是:%.2f ℃\r\n",tempture_val);
            }
            else
                printf("内部温度是:-%.2f ℃\r\n",tempture_val);
        }
    
    
    }
    
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值