用STM32单片机ADC+NTC热敏电阻采集温度的设计思路 | 附参考电路

目录

前言

一、热敏电阻NTC

二、参考电路

 三、激励电压选择


前言

记录一些我在工作和学习过程中遇到的问题

NTC:在淘宝随便买的

单片机型号:STM32G030C8T6

目的:用单片机采集NTC温度

本文主要是介绍关于NTC激励电压的选择

一、热敏电阻NTC

       热敏电阻NTC(Negative Temperature Coefficient)直译过来就是负温度系数,表示其阻值随着温度的升高而呈指数下降。热敏电阻是无源器件,自身不能产生电气输出,需要激励电压或者激励电流来测量传感器的电阻,也就是用一个小电流流过传感器以产生电压,单片机ADC采集这个电压计算出此时NTC的阻值进而推出其温度值。

二、参考电路

        用单片机和NTC热敏电阻测量温度的推荐电路,这是相对简单的电路,如果要考虑稳定性和抗干扰的问题最好加一个射级跟随器,我这里用运放完成,参考电路如下:

          在PCB布局的时候,NTC的信号是模拟信号,要注意布局的时候与数字信号隔离开。

 三、激励电压选择

        

         以上电路设计出来,还要考虑一个问题就是激励电压Vcc的选择,这在之前是我一直忽略的一个问题,经过我经理的讲解才知道,要想单片机采集的温度更精确,激励电压是不能随便选择的。

        首先我的单片机是12位ADC,但是在实际应用中,相信很多和我一样在电子行业经验不足的,设计出来的产品是很难匹配这个数值的,不论是器件本身的误差还是来自其他电路的干扰以及信号耦合的问题,都会导致单片机最终采集到的模拟信号存在误差。经理的意思是12位ADC就看成8位来计算,但是考虑到电路比较简单相对能出现干扰的部分不多所以我还是按照10位ADC来计算。

       关于精度的计算:假设单片机ADC的参考电压是0~3.3v,那么其采样范围也是0~3.3v,10位ADC分辨率为2^10 = 1024,我们可以理解成0~3.3v的电压分布在这1024个数字上,每一个数字变化的电压就表示他的精度,计算公式:3.3/2^10 = 0.003。

我简单拉了一个表格,懒得算的可以参考:(注:计算的时候要注意你设计的单片机参考电压范围)

要使用STM32HAL库通过NTC热敏电阻读取温度,需要进行以下几个步骤。 1.首先,需要配置ADC模块,将其与热敏电阻连接。在STM32HAL库中,可以使用以下代码进行初始化和配置。 ADC_HandleTypeDef hadc; hadc.Instance = ADC1; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = DISABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T1_CC1; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; hadc.Init.DMAContinuousRequests = DISABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { // init失败处理 } // 配置ADC通道 ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { // 配置错误处理 } 2.然后,需要读取ADC的值,并转换为对应的温度值。可以使用以下代码进行读取和转换。 ADC_ChannelConfTypeDef sConfig = {0}; sConfig.Channel = ADC_CHANNEL_1; sConfig.Rank = ADC_REGULAR_RANK_1; sConfig.SamplingTime = ADC_SAMPLETIME_84CYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { // 配置错误处理 } // 等待ADC转换完成 if (HAL_ADC_PollForConversion(&hadc, 100) != HAL_OK) { // 转换错误处理 } // 读取ADC的值 uint16_t adcVal = HAL_ADC_GetValue(&hadc); // 根据NTC的特性曲线计算温度值 float rntc = (float) (10000 * (4095 - adcVal) / adcVal); // 其中4100应该替换为参考电压 float beta = 3950; // NTC热敏元件的Beta值为3950 float T0 = 298.15; // NTC热敏元件的零度温度为298.15K float R0 = 10000; // NTC热敏元件在25度时的电阻值为10K float T = 1 / ((1/T0) + (1/beta) * log(rntc/R0)); 最后,可以根据读取到的温度值进行其他的操作。需要注意的是,不同型号的NTC热敏电阻有不同的特性曲线,需要根据具体的曲线参数进行计算。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值