STM32F103C8使用内部温度传感器,温度不增加反而降低
2019-07-14 18:50发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
使用的是某宝买来的STM32F103C8的核心板,原理图如下
实验电路为核心板加USB转TTL,其他并无外设。
尝试使用内部的ADCx_IN16连接的内部的温度传感器做实验,但是测出的结果一直都是十七点几,而且不增反降,结果是利用串口显示如图
现将关于温度传感器数值转化和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;
希望能偶遇大神解决这个问题。
一周热门 更多>