STM32F4开发板:ADC检测内部温度传感器的温度

温度传感器内部连接到与 VBAT 共用的输入通道 ADC1_IN18


1、配置ADC1的属性


        使能ADC1时钟
        设置ADC的模式为独立模式
        设置时钟频率为2分频
        禁止DMA模式
        设置采样延迟

        设置ADC分辨率为12位
        设置单通道转换模式
        设置连续转换
        禁止外部触发检测,这里采用软件触发检测
        外部触发来源定时转换通道
        ADC数据右对齐
        1个转换数

        初始化ADC外围设备

        设置常规通道配置功能

        使能ADC1

        开始ADC1转换,软件触发

        使能温度传感器
    

void ADC1_ADC_Init(void)
{
    ADC_CommonInitTypeDef   ADC1_Common_InitStructure;
    ADC_InitTypeDef         ADC1_InitStructure;

    // 使能ADC1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    
    //设置独立ADC模式
    ADC1_Common_InitStructure.ADC_Mode = ADC_Mode_Independent;
    //设置时钟频率为2分频
    ADC1_Common_InitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
    //禁止DMA模式
    ADC1_Common_InitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
    //设置采样时间
    ADC1_Common_InitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;

    //设置ADC分辨率为12位
    ADC1_InitStructure.ADC_Resolution = ADC_Resolution_12b;   
    //设置单通道转换模式
    ADC1_InitStructure.ADC_ScanConvMode = DISABLE;
    //设置连续转换
    ADC1_InitStructure.ADC_ContinuousConvMode = ENABLE;
    //禁止外部触发检测,这里采用软件触发检测
    ADC1_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    //外部触发来源定时转换通道
    ADC1_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
    //ADC数据右对齐
    ADC1_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    //1个转换数
    ADC1_InitStructure.ADC_NbrOfConversion = 1;
    
    //初始化ADC外围设备
    ADC_CommonInit(&ADC1_Common_InitStructure);
    ADC_Init(ADC1, &ADC1_InitStructure);
    
    
    //常规通道配置功能
    ADC_RegularChannelConfig(ADC1, ADC_Channel_18, 1, ADC_SampleTime_56Cycles);
    
    //使能ADC1
    ADC_Cmd(ADC1, ENABLE);  
    //开始ADC1转换,软件触发
    ADC_SoftwareStartConv(ADC1);
    //使能温度传感器
    ADC_TempSensorVrefintCmd(ENABLE);
}

2、配置嵌套向量中断控制器NVIC


        设置嵌套向量中断控制器组为组2
        设置中断向量源为ADC_IRQn
        设置抢占优先级为0
        设置子优先级为0
        使能ADC的中断
        初始化嵌套向量中断控制器NVIC
        开启ADC1中断

void ADC1_NVIC_Init(void)
{
    NVIC_InitTypeDef    ADC_NVIC_InitStructure;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    ADC_NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
    ADC_NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    ADC_NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    ADC_NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
    //初始化ADC的NVIC
    NVIC_Init(&ADC_NVIC_InitStructure);
    
    //开启ADC1中断
    ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
}

3、初始化ADC1

void ADC1_Init(void)
{
    ADC1_ADC_Init();
    ADC1_NVIC_Init();
}

4、中断服务函数


注:在中断服务函数中读取ADC检测到的值
        检查指定的ADC中断是否已发生。
                调用系统的库函数,返回常规通道的最后一个ADC1转换结果数据
        清除ADC1的中断挂起位

void ADC_IRQHandler(void)
{
	if(ADC_GetITStatus(ADC1, ADC_IT_EOC) == 1)
	{
        //读取ADC的转换值
		AdcTempValue = ADC_GetConversionValue(ADC1);
	}
	ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
}	

5、main函数测试

#define     V25         0.76f           //0.76V
#define     Avg_Slope   0.0025f         //2.5mV/C
int main(void)
{	
    float VoltageTempValue;//电压值
    float TrueTempValue;//真实温度值
    
    /* 配置SysTick 为10us中断一次,时间到后触发定时中断,
    *进入stm32fxx_it.c文件的SysTick_Handler处理,通过数中断次数计时
    */
    SysTick_Init();
    //初始化USART1
    USART1_Init();
    //初始化ADC1
    ADC1_Init();
    
    printf("串口打印内部温度传感器检测到的温度!\r\n");
    
    while(1)
    {
        VoltageTempValue =(float)(AdcTempValue) / 4096 * (float)3.3;
        TrueTempValue = (VoltageTempValue - V25) / Avg_Slope + 25;
        
        printf("\r\n");
        printf("AdcTempValue      = %d   D     \r\n", AdcTempValue);        //十进制
        printf("AdcTempValue      = 0x%x H     \r\n", AdcTempValue);        //十六进制
        printf("VoltageTempValue  = %.1f   V   \r\n", VoltageTempValue);    //电压值
        printf("TrueTempValue     = %.1f 度    \r\n", TrueTempValue);       //真实温度值
        
        Delay_ms(2000);
    }
}


 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4系列微控制器内部集成了一个温度传感器,该传感器可以用于测量芯片的温度内部温度传感器的测量原理是基于芯片本身的温度对某个特定电压的影响。该电压值可以通过ADC模块进行读取和转换。 在使用内部温度传感器之前,需要先对ADC进行初始化设置。然后,可以通过以下代码读取芯片当前的温度值: ```c float temperature; uint16_t adc_value; // 使能内部温度传感器 ADC_TempSensorVrefintCmd(ENABLE); // 设置ADC转换模式 ADC_CommonInitTypeDef ADC_CommonInitStruct; ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent; ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div4; ADC_CommonInitStruct.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; ADC_CommonInitStruct.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStruct); // 设置ADC通道和采样时间 ADC_InitTypeDef ADC_InitStruct; ADC_StructInit(&ADC_InitStruct); ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStruct.ADC_NbrOfConversion = 1; ADC_Init(ADC1, &ADC_InitStruct); ADC_RegularChannelConfig(ADC1, ADC_Channel_TempSensor, 1, ADC_SampleTime_480Cycles); // 启动ADC转换 ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1); // 等待ADC转换完成 while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); // 读取ADC值并计算温度 adc_value = ADC_GetConversionValue(ADC1); temperature = (float)((int32_t)adc_value - (int32_t)0x0800) / 4.0f + 25.0f; ``` 需要注意的是,由于内部温度传感器的精度较低,因此需要进行一些校准操作才能得到较为准确的温度值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值