DAC +NTC 二分查表法 实现温度检测

硬件

STM32F4IGT6   +  NTC C13879

软件

Keil5 + STM32CubeMX

所用外设

USART + ADC 

电路图如图

用一个10K的电阻   用光敏电阻来代替NTC(主要在AD里没找到对应的器件),NTC在25℃下阻值为10K。

USART的配置

做一下重定向即可,主要是用printf()函数

将下面代码放在USART.C下即可

    int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
 

int fgetc(FILE *f)
{
  uint8_t ch;
  HAL_UART_Receive(&huart2, &ch, 1, 0xffff);
  return ch;
}

ADC具体可看正点或野火官方论坛以及《STM32F4XX系列中文手册》

下面就说一下配置,调试的话可以去看ADC寄存器一章,写的很详细

ADC配置如下(我的板子使用的是3通道,该板子1通道坏了)

 ADC的传输模式——扫描转换模式、不连续转换模式、连续转换模式,具体看手册。

ADC的通道配置——规则通道(Regular),注入通道(injected),简单的理解就是注入通道可以插队,规则通道不行。

使用ADC要注意转换时间和输入信号的变化时间,否则无法采集到正确的数据

ADC轮询式转换

void ADC_Value_Get(void)//轮询式发送 
{
    HAL_ADC_Start(&hadc1);

        if(HAL_ADC_PollForConversion(&hadc1,100) == HAL_OK)
        {
                ADC_Value = HAL_ADC_GetValue(&hadc1);
              ADC_Volt  = ADC_Value*330/4095;
            printf("电压值是 : %d.%d%d\n",ADC_Volt/100,ADC_Volt%100/10,ADC_Volt%10);
            printf("此时的温度 :%d",Temp);
        }
    HAL_ADC_Stop(&hadc1);    

}

(中断方式也一样不过配置上要勾上Intrruption 代码基本差不多,带IT就是中断 不带IT就是阻塞)

中断方式对CPU的占用率较低,相应的轮询法占用率很高

配置到这就结论 接下来就讲一下二分查找表法的思路吧

我使用利用matlab对数据预处理,得到不同温度下ADC理论应该采到值,但只是粗略的估算故取整
>> all_data = 10+data;  %data为NTC在-25~71℃时的阻值
>> y = all_data.\data;     
>> y_Value = 4095*y;    %求不同温度是 ADC采到的Value
>> y_Value = round(y_Value); %取整
>> empty = [0,0,0];
>> y_Value1 = [y_Value,empty];
>> y_Value2 = reshape(y_Value1,10,10);
>> fid = fopen('b.txt','wt');
for i = 1:1:10
for j = 1:1:10
if j == 10
fprintf(fid,'%g\n,',y_Value2(j,i));
else
fprintf(fid,'%g,',y_Value2(j,i));
end
end
end
fclose(fid);

我们就会得到以下的数组

static const unsigned int NTC[size] = 
{3773,3757,3740,3722,3703,3684,3664,3644,3622,3600,
3577,3553,3528,3502,3475,3448,3419,3390,3360,3329,
3297,3264,3230,3195,3160,3123,3086,3048,3010,2970,
2930,2889,2848,2806,2763,2720,2676,2633,2588,2544,   
2499,2454,2408,2363,2317,2272,2226,2181,2136,2091,
2048,2001,1957,1913,1869,1826,1783,1741,1699,1657, 
1617,1576,1537,1498,1459,1422,1385,1348,1312,1277,   
1243,1209,1176,1144,1112,1081,1051,1022,993,965,
937,910,884,859,834,810,786,764,741,720,           
699,679,659,639,621,602,585};// -25 ~ 71  

所谓二分法,实际上就是对半查询,以此来确定我们ADC所采到的值,在那两个温度范围直接,然后根据不同的处理方式,取小,取大,或者线性处理都可

查询代码如下

int tempDetect(uint16_t Value)
{
    int s=0,m=0,e=size;

    if(Value < 585)
      return -25;
    else if(Value > 3773)
      return 71;
    else 
    {
        while(s < e)//二分法进行查找
        {
            m = ((s+e)>>1);//右移一位 即除以2
            if(Value < NTC[m])
                s = m+1;
            else 
                e = m;
        }
        return m-26;
    }
}

然后把原来的代码加上下面两句代码

void ADC_Value_Get(void)//轮询式发送 
{
    HAL_ADC_Start(&hadc1);

        if(HAL_ADC_PollForConversion(&hadc1,100) == HAL_OK)
        {
                ADC_Value = HAL_ADC_GetValue(&hadc1);
              ADC_Volt  = ADC_Value*330/4095;
                Temp = tempDetect(ADC_Value);
            printf("ADC的值是 : %d\n",ADC_Value);
            printf("电压值是 : %d.%d%d\n",ADC_Volt/100,ADC_Volt%100/10,ADC_Volt%10);
            printf("此时的温度 :%d",Temp);
        }
    HAL_ADC_Stop(&hadc1);    

}

最后在int main()中写入

  while (1)
  {
    /* USER CODE END WHILE */
    
    /* USER CODE BEGIN 3 */
        ADC_Value_Get();
        HAL_Delay(1000);
  }

最后上板调试即可。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: NTC(Negative Temperature Coefficient)是一种负温度系数热敏电阻,在测量温度方面具有广泛应用。为了获取准确的温度信息,需要进行数据采集和插值查表的过程。 首先,需要进行数据采集。通过N个温度点,测量NTC电阻的实际电阻值。这些温度点可以遍布整个温度范围,以确保有足够的数据点进行后续的查表和插值计算。 接下来,将采集到的温度和相应的电阻值记录在表格中。这个表格被称为NTC温度-电阻特性曲线表或查表表格。这个表格包含了不同温度下的电阻值,可以作为后续插值计算的基础。 当需要测量某个温度时,可以通过查表的方式来获取对应温度下的电阻值。如果所需的温度点在已有的数据点之间,可以使用插值的方来计算出该温度下的电阻值。插值算通常使用线性插值、拉格朗日插值或牛顿插值等方,根据已有数据点的位置和数值,来推算出目标温度对应的电阻值。 通过采集温度和进行插值查表,可以更准确地获取NTC电阻在不同温度下的电阻值,从而计算出对应的温度值。这种方温度测量方面被广泛使用,具有简单、快速和准确的优点。 ### 回答2: NTC(Negative Temperature Coefficient)是一种负温度系数热敏电阻,其电阻值随温度变化而改变。为了准确测量温度,我们可以使用NTC来采集温度数据,并通过插值查表的方式来获取实际温度值。 NTC温度插值查表的方是基于已知温度-电阻值对的数据表。通常,这个数据表由厂家根据NTC的特性进行实验测定,并提供给用户使用。 当我们需要测量温度时,首先需要将NTC安装在要测量的物体表面或者近距离接触到物体中。NTC的电阻值将受到物体的温度影响而改变。然后,我们将读取NTC的电阻值,这个值将作为输入。 接下来,我们可以使用数据表来进行插值计算。我们首先找到两个最接近的已知温度-电阻值对,然后通过线性插值的方计算出我们所需的温度值。 线性插值的公式为: 温度 = (电阻值 - R₁) × (温度₂ - 温度₁) ÷ (R₂ - R₁) + 温度₁ 其中,R₁和R₂分别是离目标电阻值最近的两个已知电阻值,温度₁和温度₂分别是对应的已知温度。 通过这种方式,我们可以根据NTC的电阻值获取相应的温度值。这种方虽然有一定的误差,但在实际应用中通常可以提供足够的精度来满足需求。 总的来说,NTC采集温度插值查表是一种常用的方,通过将NTC的电阻值与已知温度值进行插值计算,可以得到准确的温度值。这种方简单有效,特别适用于温度测量和控制领域。 ### 回答3: NTC采集温度插值查表是一种常见的温度测量方NTC(Negative Temperature Coefficient)热敏电阻是一种电阻值随温度变化呈负相关关系的元件,常用于测量温度。而NTC的电阻-温度特性是非线性的,故无直接通过测量电阻值来准确获得温度信息。 为了解决这个问题,人们通常会在预先测量一系列已知温度下的NTC电阻值,并将其制作成一张查表。这张表能够通过对已知的NTC电阻值进行插值,来预测未知温度值。 使用NTC采集温度插值查表的步骤如下: 首先,将NTC热敏电阻与电路相连。当电阻与环境温度接触时,它的电阻值会发生变化。 然后,通过电阻测量装置测量NTC的电阻值。 接下来,使用这个测量到的NTC电阻值,在查表中找到离测量值最近的两个已知温度对应的电阻值。 然后,通过对这两个电阻值进行插值运算,根据已知温度与电阻值的关系,计算出未知温度的估计值。 最后,根据查表得到的估计温度值,以及相应的插值误差,来进行相应的校准和调整。 总之,NTC采集温度插值查表是一种通过测量NTC电阻值来预测温度的方。通过建立一个电阻值与温度值的对应关系查表,可以用已知的电阻值来推测未知的温度值,并提供温度测量的准确性和稳定性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值