Stm32ADC-内部温度传感器的使用

搞完了ADC的基本配置步骤,下面就是ADC配合一些外设的应用了,首先就是stm32f1内部的温度传感器通过adc采集获得温度;

内部温度传感器在ADC1的通道16上,所以只需要初始化以下ADC1就好了,然后再写两个函数来获得ADC转换之后的值并根据公式将该值转换为温度即可.

温度公式:

公式中的 Avg_Slope 的典型值 4.3 的单位是 mv/C,而通过ADC采集并计算后的电压单位是 V,所以这里 Avg_Slope 应该取 0.0043.这里好像一个坑,不知道正点原子怎么想的,在计算温度的时候来了下面的两行代码:

    result=temperate*=100;                  //扩大100倍.
    return result;

看不懂他这个扩大100倍,明明返回的值是没有扩大之前的值.不知道是不是bug,唉...现在想想,上学期模电没学好,现在才发现模电的知识还是很有用的,以后还是得把专业课学好.

另外,需要注意,初始化的时候要开启内部温度传感器功能,也可以说是使能内部温度传感器啦,其实也就是调用一个库函数而已:
void ADC_TempSensorVrefintCmd(FunctionalState NewState); //开启内部温度传感器
没错,就是这么简单;


下面贴一下代码,有关温度传感器配置相关的代码都放在了 /HARDWARE/TSensor.c 下.

初始化函数:void TSensor_Init(void)
void TSensor_Init(void)
{
    ADC_InitTypeDef adcInitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //ADC时钟设置为12MHz
    ADC_DeInit(ADC1);
    
    adcInitStruct.ADC_ContinuousConvMode = DISABLE;
    adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    adcInitStruct.ADC_Mode = ADC_Mode_Independent;
    adcInitStruct.ADC_NbrOfChannel = 1;
    adcInitStruct.ADC_ScanConvMode = DISABLE;
    ADC_Init(ADC1,&adcInitStruct);
    
    ADC_TempSensorVrefintCmd(ENABLE);
    ADC_Cmd(ADC1,ENABLE);
    
    ADC_ResetCalibration(ADC1);
    while(ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while(ADC_GetCalibrationStatus(ADC1));
}

获取指定通道ADC转换的结果:u16 ADC1_GetConvValue(uint8_t channel)
u16 ADC1_GetConvValue(uint8_t channel)
{
    ADC_RegularChannelConfig(ADC1,channel,1,ADC_SampleTime_239Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
    return ADC_GetConversionValue(ADC1);
}

获取多次ADC的值求平均值:u16 ADC1_GetAverageConvValue(uint8_t channel,uint8_t times)
u16 ADC1_GetAverageConvValue(uint8_t channel,uint8_t times)
{
    u8 i;
    u32 temp = 0;
    for(i = 0;i < times;i++)
    {
        temp += ADC1_GetConvValue(channel);
    }
    return temp/times;
}

将ADC采集到的值转换为电压值:double ACD1_SampleValue2ReadableValue(u16 sampleValue)
    double ACD1_SampleValue2ReadableValue(u16 sampleValue)
    {
        return (double)sampleValue*((double)ADC_RefVoltoge/4096.0);
    }

获得温度值:double TSensor_GetTemperature()
double TSensor_GetTemperature()
{
    double VSense = ACD1_SampleValue2ReadableValue(ADC1_GetAverageConvValue(ADC_Channel_16,20));
    USART_WriteLine("VSense:%.2f; %.2f",VSense,((1.43 - VSense)/0.0043+25.0));
    return (1.43 - VSense)/0.0043+25.0;
}

main.c代码

Init()函数
void Init(void)
{
    delay_init();
    USART_Debug_Init();
    TSensor_Init();
    USART_WriteLine("系统初始化完成!");
}
Loop()函数
void Loop(void)
{
    double temp = TSensor_GetTemperature();
    USART_WriteLine("温度:%.2f",temp);
    delay_ms(250);
}

这里面除了用到TSensor.c中的函数,还用到了我自己封装的 Usart.c中的串口函数.有时间会记录一下我是如何封装自己的Usart来进行调试输出的.

转载于:https://www.cnblogs.com/Laggage/p/10411865.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值