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

2019-07-14 18:50发布

使用的是某宝买来的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<times;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;

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


0条回答

一周热门 更多>