STM32/STM8技术william hill官网
直播中

赵宇

9年用户 115经验值
擅长:可编程逻辑 嵌入式技术 模拟技术 控制/MCU
私信 关注
[问答]

STM32F103C8使用内部温度传感器,温度不增加反而降低

使用的是某宝买来的STM32F103C8的核心板,原理图如下 原理图.png

实验威廉希尔官方网站 为核心板加USB转TTL,其他并无外设。
尝试使用内部的ADCx_IN16连接的内部的温度传感器做实验,但是测出的结果一直都是十七点几,而且不增反降,结果是利用串口显示如图
串口结果显示.png
现将关于温度传感器数值转化和ADC部分代码(temper.c文件全部内容)粘贴如下:
//temper.c文件起始
void Temprt_Init( void )
{
    ADC_InitTypeDef ADC_InitStructure;
     //使能GPIOA,ADC1通道时钟
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE );   
    //将外设 ADC1 的全部寄存器重设为缺省值
     ADC_DeInit( ADC1 );  
    //ADC工作模式:ADC1和ADC2工作在独立模式
    ADC_InitStructure.ADC_Mode               = ADC_Mode_Independent;      
    //模数转换工作在单通道模式
    ADC_InitStructure.ADC_ScanConvMode       = ENABLE;                  
    //模数转换工作在单次转换模式
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;        
    //转换由软件而不是外部触发启动
    ADC_InitStructure.ADC_ExternalTrigConv   = ADC_ExternalTrigConv_None;
    //ADC数据右对齐
    ADC_InitStructure.ADC_DataAlign          = ADC_DataAlign_Right;  
     //顺序进行规则转换的ADC通道的数目
    ADC_InitStructure.ADC_NbrOfChannel       = 1;        
     //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);
    ADC_TempSensorVrefintCmd(ENABLE); //开启内部温度传感器
    ADC_Cmd(ADC1, ENABLE);  //使能指定的ADC1
    ADC_ResetCalibration(ADC1); //重置指定的ADC1的复位寄存器
    //获取ADC1重置校准寄存器的状态,设置状态则等待
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));      //获取指定ADC1的校准程序,设置状态则等待

    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
}


uint16_t T_Get_Adc(uint8_t ch)
{
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );  //ADC1,ADC通道3,第一个转换,采样时间为239.5周期                    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //使能指定的ADC1的软件转换启动功能
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    return ADC_GetConversionValue(ADC1);    //返回最近一次ADC1规则组的转换结果
}

//得到ADC采样内部温度传感器的值 取10次,然后平均
uint16_t T_Get_Temp(void)
{
    uint16_t temp_val=0;
    uint8_t t;
    for(t=0;t<10;t++)
    {
        temp_val+=T_Get_Adc(ADC_Channel_16);      
        DelayNms(5);
    }
    return temp_val/10;
}

//获取通道ch的转换值 取times次,然后平均
uint16_t T_Get_Adc_Average(uint8_t ch,uint8_t times)
{
    uint32_t temp_val=0;
    uint8_t t;

    for(t=0;t     {
        temp_val+=T_Get_Adc(ch);
        DelayNms(5);
    }
    return temp_val/times;
}      

//得到温度值 返回值:温度值(扩大了100倍,单位:℃.)
short Get_Temprate(void)    //获取内部温度传感器温度值
{
    uint32_t adcx;
    short result;
    double temperate;

    adcx=T_Get_Adc_Average(ADC_Channel_16,20);  //读取通道16,20次取平均
    temperate=(float)adcx*(3.3/4096);       //电压值
    temperate=(1.42-temperate)*1000/4.35+25;   //转换为温度值     
    result=temperate*=100;                  //扩大100倍.
    return result;
}
//temper.c文件结束

在主函数中添加初始化函数后,在循环中添加将整形转化为浮点型,并发送到串口显示就是我的串口结果图。帖子省略代码部分为串口设置部分,使用主频是72MHz。
temperature = (uint8_t)(temperature_read /100) + (temperature_read %100) * 0.01;

希望能偶遇大神解决这个问题。


回帖(2)

赵宇

2018-4-26 16:27:03
已解决,谢谢大家了,原因匪夷所思,函数用错了,返回值也错了,结果就错了。
1 举报
  • 心雨6688: 您好,请问你是哪里出现的问题呢?我的代码和你一样,温度高出来20度,找不到原因

jf_37844145

2021-4-23 16:41:32
麻烦问下是什么原因导致的,我现在也出现这个情况
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分