温度传感器

一、前言

有客户反馈,在使用 STM32H5 读取温度传感器校准值地址时,会进入 HardFault,而在其他系列芯片中读取这个参数时并没有此现象。在 NUCLEO-H563ZI 开发板上去复现此问题,发现只有开启 ICACHE 后才会复现,初步验证说明进入 HardFault 与 ICACHE 相关,如果直接关闭ICACHE 虽然可以解决进入 HardFault 的问题,但势必会影响代码执行的效率。所以,我们希望能找到一种更好的方式去处理此问题。

二、问题分析

经 Datasheet 查询,两个温度传感器校准值 TS_CAL1 和 TS_CAL2 的地址分别为 0x08FF F814-0x08FF F815 和 0x08FF F818-0x08FF F819。

1.png

根据下表,可以知道 TS_CAL1 和 TS_CAL2 是属于 Read-only 区域的,而 Read-only 区域是通过 AHB system bus 访问的。

2.png

3.png

根据参考手册的描述,所有的 AHB memory 默认都是 cacheable 的,对于无法实现缓存的区域(OTP、RO、data area),必须使用 MPU 来禁用本地缓存。

4.png

也就是说,不仅是 TS_CAL1 和 TS_CAL2,其实整个 OTP、RO(Table 39)、data area区域的访问都无法经过 Cache,需要使用 MPU 将其配置为 none-cacheable 属性。

既然知道了问题所在,那剩下的问题就是确定 OPT、RO、data area 各个区域的地址,data area 是由用户选项字节配置的可进行 100k 次擦除的区域,用于存储用户掉电不丢失的数据,需要根据实际的配置去设置 MPU 区域。剩下的就是 OPT 和 RO 区域,在 STM32H563 中,分别有 2K byte。

5.png

OTP 的地址为[0x08FF F000-0x08FF F7FF]和 RO 的地址为[0x08FF F800-0x08FF FFFF],两个地址其实是连续的。

6.png

三、解决方法

经上述分析后,我们只需要把[0x08FF F000-0x08FF FFFF]这段地址区域设置为 none cacheable,通过 CubeMX 进行配置。

7.png

void MPU_Config(void)
{ 
    MPU_Region_InitTypeDef MPU_InitStruct = {0}; 
    MPU_Attributes_InitTypeDef MPU_AttributesInit = {0};
    
    /* Disables the MPU */ 
    HAL_MPU_Disable();
    
    /** Initializes and configures the Region and the memory to be protected 
    */     
    MPU_InitStruct.Enable = MPU_REGION_ENABLE; 
    MPU_InitStruct.Number = MPU_REGION_NUMBER0; 
    MPU_InitStruct.BaseAddress = 0x08FFF000; 
    MPU_InitStruct.LimitAddress = 0x08FFFFFF; 
    MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0; 
    MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO; 
    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE; 
    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
    
    HAL_MPU_ConfigRegion(&MPU_InitStruct); 
    MPU_AttributesInit.Number = MPU_REGION_NUMBER0; 
    MPU_AttributesInit.Attributes = INNER_OUTER (MPU_DEVICE_nGnRnE | MPU_NOT_CACHEABLE 
    | MPU_TRANSIENT | MPU_NO_ALLOCATE);
    
    HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit); 
    /* Enables the MPU */
    HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

经 MPU 配置 OTP 和 RO 的内存访问属性后,就可以正常去读取温度传感器校准值了,同时属于这两个区域的其他值,如 UID、Flash Size、Package 等信息也能正常读取了。

uint16_t TS_CAL1_Val,TS_CAL2_Val; 

uint16_t *TS_CAL1 = (uint16_t *)0x08fff814; 
uint16_t *TS_CAL2 = (uint16_t *)0x08fff818; 
TS_CAL1_Val = *TS_CAL1; 
TS_CAL2_Val = *TS_CAL2;

四、总结

温度传感器校准值及 UID 等一些信息在 H5 中属于只读区域,而这个区域在 AHB 访问时,默认内存属性为 cacheable,需要通过 MPU 把这些区域设置为 none-cacheable,才能正常访问。每个系列的芯片架构都或多或少有差别,当按以往经验操作不能实现功能时,不妨对照相应芯片的数据手册、参考手册、应用笔记、甚至勘误手册,也许就能发现问题所在。

来源:STM32

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 15

01、引言

STM32 在内部都集成了一个温度传感器,STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度,但是用于监控晶圆上的温度还是挺好的,以防止芯片过温运行。

02、问题

2.1.问题详情

某客户在使用 STM32U575ZIT6Q 时,使用 ADC4 对内部温度传感器 VSENSE进行采样计算,但是总觉得温度值不对。那么,应该如何对内部温度传感器信号的 ADC 采样进行计算以得到正确温度值呢?

2.2. 问题分析

首先,我们应该看一下参考手册如何描述内部温度传感器的。参考手册说明了,未经校准的内部温度传感器更适用于对温度变化而非绝对温度进行测量的应用。为了提高温度传感器测量的准确性,ST 在生产过程中将校准值存储在每个器件的系统存储器中,用户可以在应用中去读取这些数据。 

这个校准值是写在数据手册的,如图 1 所示。

1.jpg

图1. 内部温度传感器

这张表格告诉我们,校准值 TS_CAL1 的数值位于存储器地址 0x0BFA0710 和0x0BFA0711,也就是它是一个 16-bit 的数据;同理,校准值 TS_CAL2 的数值位于存储器地址 0x0BFA0742 和 0x0BFA0743。 

再回过头来看一下参考手册是如何描述怎么读取内部温度传感器的温度的,如图 2 所示。

2.jpg

图2. 读取温度传感器

这里描述的是如何读取内部温度传感器的温度,前面主要介绍 ADC 的配置和对温度传感器的采样,最后根据得到的数据使用公式进行计算,得到温度值。前面的 ADC 的配置和采样就不说了,我们主要来看一下公式的使用。

3.jpg

其中,

Temperature (in ℃) 就是内部传感器的当前温度结果; 

TS_DATA 为内部传感器当前温度对应的采样值; 

TS_CAL2_TEMP 为校准值 2 的温度值,TS_CAL2 为对应的采样值,对于 STM32U5来说,TS_CAL2_TEMP 为 130℃,对应的采样值存储在 0x0BFA0742 和 0x0BFA0743; 

TS_CAL1_TEMP 为校准值 1 的温度值,TS_CAL1 为对应的采样值,对于 STM32U5来说,TS_CAL1_TEMP 为 30℃,对应的采样值存储在 0x0BFA0710 和 0x0BFA0711; 

对于 STM32U5 来说,公式可简化为:

4.jpg

那么,是不是直接读取了 TS_CAL2 和 TS_CAL1,放到公式里,然后通过 ADC 得到TS_DATA,就可以直接算温度了呢?接着往下看。

2.3. 问题解决

在室温下使用 NUCLEO-U575ZI-Q 做个实验: 

读取 0x0BFA0742 和 0x0BFA0743 得到 TS_CAL2 为 0x155D,也就是 0d5469;读取 0x0BFA0710 和 0x0BFA0711 得到 TS_CAL1 的值为 0x102F,也就是 0d4143。 

此时,由 ADC1 对内部温度传感器进行采样转换,得到 TS_DATA 为 0xEAA,也就是0d3754。 

那么,如果直接放进去算:

5.jpg

室温下,这个 0.66℃显然不对。

2.3.1. 使用 ADC1 测量内部温度传感器的温度值 

再来看数据手册里对校准值的描述,如图 3 所示。

6.jpg

图3. 温度传感器校准值重要参数

这个表格有一个非常重要的参数,就是 ADC1 的参考电压,它是 3.0V,而 NUCLEOU575ZI-Q 板子的 ADC 参考电压为 3.3V。所以,这两个 TS_CAL1 和 TS_CAL2 对于NUCLEO-U575ZI-Q 中的 STM32U575ZIT6Q 的内部温度传感器肯定是不能直接用的,需要先换算为 3.3V 参考电压的值才行。 

所以,新的值计算如下: 

TS_CAL2 = 5469 × 3 / 3.3 = 4972 

TS_CAL1 = 4143 × 3 / 3.3 = 3766 

再回到刚才的实验中,计算的公式如下:

7.jpg

这次算出来的结果为 29℃就对了。

2.3.2. 使用 ADC4 测量内部温度传感器的温度值 

那对于 ADC4 是否也是一样的呢? 

首先,要知道在 STM32U5 中,ADC1 为 14-bit SAR ADC,而 ADC4 为 12-bit SARADC。同样的这块板子,同样的室温下,由 ADC4 对内部温度传感器进行采样转换得到的值是 0x3AA,也就是 0d938。 

要使用 0d938 计算温度值,TS_CAL1 和 TS_CAL2 也要相应转为 12 位的数据才行。将它们由 14 位数据转为 12 位的数据,相当于就是右移 2 位,也相当于除以 4。 

由于参考电压仍然是 3.3V,所以针对 ADC4 的 TS_CAL2 和 TS_CAL1 应该计算如下: 

TS_CAL2 :由读取到的 0x155D 右移 2 位,得到 0x557,也就是 0d1367,再换算成3.3V 的 。 

TS_CAL2 = 1367 × 3 / 3.3 = 1243也可以直接使用上面 ADC1 例子的值来计算。 

TS_CAL2 = 4972 / 4 = 1243 

TS_CAL1 :由读取到的 0x102F 右移 2 位,得到 0x40B,也就是 0d1035,再换算成3.3V 的 。 

TS_CAL2 = 1035 × 3 / 3.3 = 941 

也可以直接使用上面 ADC1 例子的值来计算。 

TS_CAL2 = 3766 / 4 = 941 

计算的公式如下:

8.jpg

算出来的结果也是 29℃。

03、小结

当我们使用芯片的内部温度传感器计算内部温度时,需注意校准值是使用哪个 ADC、在什么参考电压下得到的。当实际应用与内部温度传感器校准时所使用 ADC 及条件不一样时,应该对存储单元里的校准值先做计算转化,然后才可以使用参考手册所提供的公式进行计算,否则将会得到错误值。

来源:STM32单片机

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 14

12位ADC是逐次趋近型模数转换器,它具有多达19个复用通道,可测量来自16个外部源、2个内部源(温度传感器、VREF)和VBAT通道的信号。这些通道的A/D转换可在单次、连续、扫描或不连续采样模式下进行,并将ADC的结果存储在一个左对齐或右对齐的16位数据寄存器中。

除此之外,ADC还具有模拟看门狗特性,允许应用检测输入电压是否超过了用户自定义的阈值上限/下限。

ADC主要特性

·可配置12位、10位、8位或6位分辨率

·转换结束、注入转换结束以及发生模拟看门狗或溢出事件时产生中断

    ·单次和连续转换模式

·用于自动将通道0转换为通道“n”的扫描模式

·数据对齐以保持内置数据一致性

·可独立设置各通道采样时间

·外部触发器选项,可为规则转换和注入转换配置极性

·不连续采样模式

·双重/三重模式(具有2个或更多ADC的器件提供)

·双重/三重ADC模式下可配置的DMA数据存储

·双重/三重交替模式下可配置的转换间延迟

·ADC转换类型(参见数据手册)

·ADC电源要求:全速运行时为2.4V到3.6V,慢速运行时为1.8V

·ADC输入范围:VREF≤VIN≤VREF+

·规则通道转换期间可产生DMA请求

1.png

图1.ADC框图

注意:VREF-如果可用(取决于封装),则必须将其连接到VSSA。

ADC功能说明

1.ADC开关控制    

ADC的开关控制可通过将ADC_CR2寄存器中的ADON位置1来为ADC供电。首次将ADON位置1时,会将ADC从掉电模式中唤醒,在SWSTART或JSWSTART位置1时,启动AD转换,然后可通过将ADON位清零,用于停止转换并使ADC进入掉电模式。在此模式下,ADC几乎不耗电(只有几μA)。

2.ADC时钟    

ADC具有两个时钟方案:    

①用于模拟电路的时钟:ADCCLK,所有ADC共用此时钟,时钟来源于经可编程预分频器分频的APB2时钟,该预分频器允许ADC在fPCLK2/2、/4、/6或/8下工作,有关ADCCLK的最大值,请参见数据手册。

②用于数字接口的时钟(用于寄存器读/写访问)
此时钟等效于APB2时钟,即可通过RCC APB2外设时钟使能寄存器(RCC_APB2ENR)分别为每个ADC使能/禁止数字接口时钟。

3.通道选择

对于CKS32F4XX器件,温度传感器内部连接到通道ADC1_IN16,内部参考电压VREFINT连接到ADC1_IN17。

注意:温度传感器、VREFINT和VBAT通道只在主ADC1外设上可用

4.单次转换模式

在单次转换模式下,ADC执行一次转换,且CONT位为0时,可通过以下方式启动此模式:

·将ADC_CR2寄存器中的SWSTART位置1(仅适用于规则通道);

·将JSWSTART位置1(适用于注入通道);

·外部触发(适用于规则通道或注入通道);

完成所选通道的转换之后:

·如果转换了规则通道:

-转换数据存储在16位ADC_DR寄存器中;

-EOC(转换结束)标志置1;

-EOCIE位置1时将产生中断;

·如果转换了注入通道:

-转换数据存储在16位ADC_JDR1寄存器中;

-JEOC(注入转换结束)标志置1;

-JEOCIE位置1时将产生中断;

完成以上步骤之后,停止ADC。

5.时序图

ADC在开始精确转换之前需要一段稳定时间tSTAB,并且在ADC开始转换经过15个时钟周期后,EOC标志将置1,最后将转换结果存放在16位ADC数据寄存器中,时序如图2所示。

2.png

图2.时序图

数据对齐

    DC_CR2寄存器中的ALIGN位用于选择转换后存储的数据的对齐方式,在ADC配置时可根据需求选择左对齐和右对齐两种方式,如图3和图4所示。

3.png

图3.12位数据的右对齐

4.png

图4.12位数据的左对齐

需注意的是,注入通道组的转换数据将减去 ADC_JOFRx寄存器中写入的用户自定义偏移量,因此结果可以是一个负值,图中的SEXT位表示扩展符号值。

对于规则组中的通道,不会减去任何偏移量,因此只有十二个位有效。

可独立设置各通道采样时间

ADC会在数个ADCCLK周期内对输入电压进行采样,在进行配置时,可通过修改ADC_SMPR1和ADC_SMPR2寄存器中的SMP[2:0]位来更改相应的周期数,对于ADC的多个通道而言,每个通道均可以使用不同的采样时间进行采样。
总转换时间的计算公式如下:

Tconv=采样时间+12个周期

示例:

ADCCLK=30MHz且采样时间=3个周期时:
Tconv=3+12=15个周期=0.5μs(APB2为60MHz时)

温度传感器

CKS32有一个内部的温度传感器,温度传感器可用于测量器件的环境温度(TA)。该温度传感器内部连接到ADC1_IN16通道,ADC1用于将传感器输出电压转换为数字值,图5显示了温度传感器框图,当不使用时,可将传感器置于掉电模式。
注意:必须将TSVREFE位置1才能同时对两个通道进行转换。ADC1_IN16(温度传感器)和ADC1_IN17(VREFINT)。
主要特性:

·支持的温度范围:-40°C到125°C

·精度:±1.5°C

5.png

图5.温度传感器与Vrefint通道框图

VSENSE是连接到ADC1_IN16的输入:

CKS32内部温度传感器的使用较为简单,只要设置一下内部ADC,并激活其内部通道即可。关于ADC的设置,在之前的章节已经进行了详细的介绍,本章节仅做简要讲解,接下来介绍一下如何读取内部温度传感器采集到的温度。

读取温度,要使用传感器,请执行以下操作:

1) 选择ADC1_IN16输入通道;

2) 选择一个采样时间,该采样时间要大于数据手册中所指定的最低采样时间;

3) 在ADC_CCR寄存器中将TSVREFE位置1,以便将温度传感器从掉电模式中唤醒;

4) 通过将SWSTART位置1(或通过外部触发)开始ADC转换;

5) 读取ADC数据寄存器中生成的VSENSE数据;

6) 使用以下公式计算温度:温度(单位为°C)={(VSENSE-V25)/Avg_Slope}+25

其中:

-V25=25°C时的VSENSE

-Avg_Slope=温度与VSENSE曲线的平均斜率(以mV/°C或μV/°C表示)

有关V25和Avg_Slope实际值的相关信息,请参见数据手册中的电气特性一节。

注意:传感器从掉电模式中唤醒需要一个启动时间,启动时间过后其才能正确输出VSENSE。ADC在上电后同样需要一个启动时间,因此,为尽可能减少延迟间,应同时将ADON和TSVREFE位置1。

温度传感器的输出电压随温度线性变化。由于工艺不同,该线性函数的偏移量取决于各个芯片(芯片之间的温度变化可达45°C)。    

内部温度传感器更适用于对温度变量而非绝对温度进行测量的应用情况。如果需要读取精确温度,则应使用外部温度传感器。    

通过以上讲解,即可总结一下CKS32内部温度传感器使用的步骤了,如下:

1)设置ADC,开启内部温度传感器    

关于如何设置ADC,之前已经介绍了,我们采用与常规ADC配置相似的设置。不同的是之前温度传感器读取外部通道的值,而内部温度传感器相当于把通道端口连接在内部温度传感器上,所以这里,我们要开启内部温度传感器功能:

ADC_TempSensorVrefintCmd(ENABLE);

2)读取通道16的AD值,计算结果    

在设置完之后,即可读取温度传感器的电压值了,得到该值后,利用上面的公式计算温度值。如文中所述,可知ADC通道与GPIO的对应关系,内部温度传感器是通过对应ADC通道16,其它的跟上一节的讲解是一样的。

软件设计

打开内部温度传感器实验工程,即可看到adc.c与adc.h文件。函数的作用跟之前ADC实验基本是一样的。不同的是在adc_Init函数中设置为开启内部温度传感器模式,代码如下:

voidadc_Init(void)
{
    ADC_CommonInitTypeDefADC_CommonInitStructure;
    ADC_InitTypeDef       ADC_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); 
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; 
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
    ADC_CommonInit(&ADC_CommonInitStructure);
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_TempSensorVrefintCmd(ENABLE);
    ADC_Cmd(ADC1, ENABLE);
}

这部分代码与之前的ADC测试代码类似,仅去掉外部IO初始化。

我们还在adc.c里面添加了Get_Temprate函数,用来获取温度值,也就是把采集到的电压根据计算公式转换为温度值,Get_Temprate函数代码如下:

short Get_Temprate(void)
{
    u32 adcx;  
    double temperate;
    ADC_SoftwareStartConv(ADC1);
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø
    ADC_RegularChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_480Cycles );
    adcx = ADC_GetConversionValue(ADC1);
    temperate=(float)adcx*(3.3/4096);
    temperate=(temperate-0.76)/0.0025 + 25;
    printf("温度:%f ℃\r\n",temperate);
}

接下来我们就可以开始读取温度传感器的电压了。在main.c文件里面我们的main函数代码如下:

int main(void)
{
    u8 len,t;
    u16 parse_num;
    float temp,temperate;
    delay_init(168);      
    uart_init(115200);
    adc_Init();
    while(1)
    {
        Get_Temprate();
        printf("\r\n\r\n");
        delay_ms(500);
    }
}

这里同上一章的主函数也大同小异,上面的代码将温度传感器得到的电压值,换算成温度值,下载后通过串口打印结果进行验证。

6.png

以上即为ADC内部温度传感器的实验内容。

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 13

概述

AT32单片机芯片内含温度传感器,它产生一个随温度线性变化的电压,在内部被连接到ADC1_IN16的输入通道上,用于将传感器的输出转换到数字数值。

应用须知

使用者可在数据手册内找到温度传感器的各项特性规格,范例规格如下:

“表1.
表1. 温度传感器特性

只要遵守以下公式,即可求得目前温度传感器量测出的温度。

温度(°C)={(V25-VTS)/Avg_Slope}+25

这里:

V25=VTS在25°C时的数值

Avg_Slope=温度与VTS曲线的平均斜率(单位为mV/°C)

其中VTS为温度传感器经由ADC转换出的电压换算成mV,再依照上述公式,只要将V25带入典型值1280mV,Avg_Slope带入-4.20mV/°C即可求得。下图即为套用典型值计算出的温度与传感器输出电压(VTS)的特性曲线。

“图1.
图1. VTS对温度理想曲线图

应用此温度传感器需注意因生产过程的变化,每个芯片的温度传感器V25具有相对大的偏移,以上表所述最小值与最大值来看有最多200mV的误差。若以Avg_Slope典型值来换算相当于47.6°C。因此内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器。

另外需注意温度传感器为芯片内部弱电压源,ADC进行采样时需要足够时间让VTS输出为采样电路达到充放电平衡而稳定,使用者需确实遵照数据手册中的TS_TEMP参数为内部温度传感器设置足够的采样时间,以获得正确的转换数值。

特性评估测试方法

温度传感器的特性评估是在特殊设计的量测环境下进行的。每次进行温度传感器特性评估都会任意挑选10颗芯片焊在专属特性测试的板子上,并送进高低温箱内进行全部操作电压和操作温度的测试。
专属测试板上特别使用ADT7410精准温度传感器作为量测参考源。它具有0.5°C准确度、高分辨率特性,是适合作为特性评估AT32芯片上温度传感器的器件。

量测时首先设定高低温箱到AT32芯片操作温度最低温,待温度到达且稳定后再命令温箱以极慢速度缓缓升温。此时开始约以1°C为量测间隔,同时多次采样ADT7410和AT32芯片温度传感器的结果,将其各自采出值作平均后上传至上位机记录,再待温度上升1°C重复以上采样动作,直到温度上升到达AT32芯片操作温度最高温,测试即停止。上位机收集到所有温度下的数值后即存档并后续进行Avg_Slope和V25的估算,以及线性度TL的分析。

测试数据

AT32温度传感器在操作电压3.6V,3.3V,和2.6V条件下,以10颗芯片的实测特性结果如下图所示,可以看出Avg_Slope在各条件下各芯片几乎一致,但细部分析各芯片V25参数之间具有相对较大的差异,这是造成AT32温度传感器量测与实际温度徧差的主要原因。

“图2.
图2. VTS对温度实测曲线图

若以软件校正偏移量(offset)后或仅作为相对温度量测时,在芯片全温度-40到105°C操作范围内,温度误差(线性度)可以达到±2°C之内。

“图3.
图3. 温度传感器线性特性实测曲线图(偏移已校正)

但若未做偏移校正或用以量测绝对温度,因温度传感器本身架构于芯片生产过程的变化,温度变化曲线的偏移在不同芯片上会有明显差异。实测10颗AT32F413结果V25最大差异可达约为±10°C,考虑整体设计仿真结果可能更大至±20°C以上。综合以上特性考量,建议AT32芯片内部温度传感器更适合使用作为检测温度的变化,而不是测量绝对的温度。

比较一般大厂MCU的内部温度传感器应用,基本上皆受此限制。

“图4.
图4. 温度传感器误差特性实测曲线图(偏移未校正)

来源:AT32 MCU 雅特力科技
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 116

TDK集团针对电动车的严苛应用要求推出全新B58703M1103A*温度传感器。新型NTC传感器可满足电动车应用的超高长期稳定性要求,额定工作温度范围为-40°C至+ 150°C,短时可耐受温度高达200°C。在25°C常温条件下,其额定电阻为10kΩ,B25 / 100值为3625 K,公差仅为±1%。

传感器通过相关耐候、化学和机械冲击测试,使用寿命符合LV 124的要求,电阻也达到LV 123 H3等级,相当于2.5 kV DC。这种优异且长期稳定的电气强度能有效防止设备损坏,满足汽车应用的严苛要求,如在车辆的整个使用寿命中控制设备。

新型温度传感器采用绞线连接以提高EMC性能,并符合适用于机动车电缆的LV 112-4标准。线材标准长度为655 mm和1000 mm。传感器配备M4尺寸的铜合金固定片,不仅易于安装,确保卓越的热耦合性能,还与铜母线具有良好的材料兼容性,防止接触腐蚀。

新型传感器广泛用于监测电动车母线、电池模块或连接器系统的温度。

主要应用

  • 监测电动车母线、电池模块或连接器系统的温度

主要特点与优势

  • 工作温度范围:-40°C 至 +150°C
  • 卓越的电气强度:2.5 kV DC,符合LV 123 H3等级
  • 绞线连接,确保优异的EMC性能

如需了解该产品的更多信息,请访问 www.tdk-electronics.tdk.com/zh/ntc.

关于 TDK 公司

TDK株式会社总部位于日本东京,是一家为智能社会提供电子解决方案的全球领先的电子公司。TDK建立在精通材料科学的基础上,始终不移地处于科技发展的最前沿并以“科技,吸引未来”,迎接社会的变革。公司成立于1935年,主营铁氧体,是一种用于电子和磁性产品的关键材料。TDK全面和创新驱动的产品组合包括无源元件,如陶瓷电容器、铝电解电容器、薄膜电容器、磁性产品、高频元件、压电和保护器件、以及传感器和传感器系统(如:温度和压力、磁性和MEMS传感器)。此外,TDK还提供电源和能源装置、磁头等产品。产品品牌包括TDK、爱普科斯(EPCOS)、InvenSense、Micronas、Tronics以及TDK-Lambda。TDK重点开展如汽车、工业和消费电子、以及信息和通信技术市场领域。公司在亚洲、欧洲、北美洲和南美洲拥有设计、制造和销售办事处网络。在2020财年,TDK的销售总额为125亿美元,全球雇员约为107,000人。

围观 32

本文提出了基于51单片机两路温度控制器的设计方案,该设计方案采用两个DS18B20温度传感器,采集两个不同地方的温度,通过AT89C51处理进行,由四位LED数码管显示所测量温度,前两位为第一个温度传感器的温度,后两位为第二个温度传感器的温度。采用3个按键实现温度最高和最低的设定,采用蜂鸣器和电动机实现温度过高或过低报警。

1. 引言

目前,温度控制器存在的问题是如何缩减成本,减少功耗,温度测量的准确性和多路温度的同时显示。本方案设计的实现基于C51单片机的两路温度控制器,做到成本最低化,精确度高,两路温度的显示和控制,能在温度超出设定的最高温度时启动电风扇进行降温,在温度低于设定的最低温度时启动蜂鸣器报警,能够用户设定最高最低温。

2. 系统结构

温度控制器系统包括以下几个主要部分:温度传感器,报警电路,LED显示电路,键盘控制,89C51控制部分。如图所示:

基于51单片机对两路DS18B20温度传感器的设计

本系统设计实现:启动温度控制器后,绿灯亮起,四位LED数码显示器上前两位为温度传感器1所测的环境温度,后两位为温度传感器2所测的环境温度。

3. 硬件结构

3.1 温度传感器

本设计采用的是DS18B20作为温度传感器,DS18B20与传统的热敏电阻相比具有精确度高,测量误差小,方便实现多点测温等优点,因此用DS18B20作温度传感器。

3.2 报警电路

本设计采用蜂鸣器和电风扇报警电路。蜂鸣器报警电路由三极管和蜂鸣器组成。当温度低于设定的最低温度时,则蜂鸣器报警。电风扇报警电路由三极管和电风扇组成。当温度高于设定的最高温度时,则电风扇报警。

3.3 显示电路

本系统采用L E D数码显示管显示,LED亮度高,可视角度高。LCD的可视角度低,亮度较低,价格高。考虑到此温度传感器主要用于温室大棚等亮度不太高的环境,从经济与实用的角度来看选LED作为显示器。

3.4 键盘控制

本系统采用3个独立的按键作为键盘控制电路。键盘一般分为独立式和矩阵键盘两种。独立式键盘结构简单,但占用的资源较多;矩阵键盘结构比较复杂,但占用的口线少。考虑到本设计所需按键数不多,采用三个独立键盘完成两个温度传感器温度的设定。

3.5 89C51控制部分

本系统采用的是AT89C51,小电子产品用51,硬件设计电路如图1所示。

基于51单片机对两路DS18B20温度传感器的设计

4. 软件设计

本系统使用汇编语言编码实现的,比C语言编码的程序处理时间更快。

主程序中包含系统初始化,键盘扫描选择子程序,温度比较子程序,温度测量子程序,温度计算子程序,显示子程序。

4.1 主程序模块

主程序中先对数据进行初始化,然后调用键盘扫描子程序KEY_TEST,温度比较子程序C O M P A R E,温度采集子程序G E T _ T E M P,温度显示子程序D I S _ S E T和DISPLAY,再判断采集,显示第二个温度传感器的温度值。编写程序如下:

基于51单片机对两路DS18B20温度传感器的设计

4.2 LED显示模块

LED显示可以分为动态显示和静态显示两种,静态显示占用更多口线,为了减少硬件成本,本设计采用动态扫描显示的方法显示两个温度传感器的温度值。

DISPLAY和DISPLAY1函数分别读取第一个和第二个温度传感器的温度并根据暂存单元的数据显示两个温度传感器的温度。编程思路:根据SIGN标志来判断转入不同的显示,将查表所得的数据存入不同的单元并显示在LED上。

4.3 键盘控制模块

键盘通过设定SIGN标志来判断设定第一个或者第二个温度传感器的最高温或者最低温,编程思路为:将SIGN初始设定为0,当第一个按键按下时将其赋为1,再次按下时加一,直到按到第5次重新赋值为0,根据SIGN的值确定进行不同的设置。

4.4 温度传感器模块

根据温度传感器DS18B20完成温度转换所必须经过的3个步骤,程序:MOV A,#0CCH//跳过ROM MOV A,#44H / / 进行温度变换 MOV A,#0BEH//读暂存存储器内容。

4.5 报警模块

当实时温度高于设定的最高温度时或者实时温度低于设定的最低温度时,单片机会控制蜂鸣器或者电风扇工作,判断当前温度是否在正常范围的函数为COMPARE,高温部分程序如下:

基于51单片机对两路DS18B20温度传感器的设计

5. 仿真测试

我们对DS18B20写入程序之前,必须调试自己的程序。但我们不能看到程序是怎样运行的。因此我们可以用仿真机来仿真,通过仿真机我们可以看到DS18B20发送过来的数据,读出来的温度值,所利用寄存的值的变化。系统连接示意图如下图所示:

基于51单片机对两路DS18B20温度传感器的设计

我们现在能把DS18B20所采集到的温度在PC机上显示出来并且每一个温度值显示后换一行。试验证明了系统实用性强,达到了预定的功能。

6. 总结

本方案中所设计的温度控制器,采用AT89C51单片机作为内核,采用DS18B20作为温度传感器,通过四位LED显示,通过循环扫描实现了两路温度的采集与显示。然后又经过过仿真测试证实了改设计方案经济适用,实用性强,能够测量两个地方的温度,满足温室大棚,室内家居,工业控制等不同环境下的使用。

来源:电子发烧友

围观 577

在很多电子类应用场合中,我们经常需要采集产品工作的周围环境温度,一般采取的方式有两种:

1)外加温度传感器

2)采用MCU内部温度传感器

外加温度传感器会增加产品的成本以及布板空间,所以在很多场合,我们只要使用内部温度传感器就可以了,今天给大家介分享一下自带内部温度传感器EFM32JG系列MCU的使用方法和步骤。

基本原理:

EFM32JG的内部ADC集成在模拟模块部分,内部温度传感器上面的电压随着温度变化,需要通过12bit ADC采集温度传感器的ADC值,把ADC值换算成为温度值。

第一步:ADC采集

设置需要采集内部温度传感器的ADC通道,这里需要注意,ADC采用精度需要设置为12bit,参考源选择内部Vref 1.25V,采集信号源选择内部温度传感器。

第二步:读取内部出厂校准值

需要读取两个值:

1)校准的温度值

calTemp0 = ((DEVINFO->CAL & _DEVINFO_CAL_TEMP_MASK)

/ >> _DEVINFO_CAL_TEMP_SHIFT);

2)校准温度在46度下的ADC值

calValue0 = ((DEVINFO->ADC0CAL3

/* _DEVINFO_ADC0CAL3_TEMPREAD1V25_MASK is not correct in

current CMSIS. This is a 12-bit value, not 16-bit. */

& 0xFFF0)

>> _DEVINFO_ADC0CAL3_TEMPREAD1V25_SHIFT);

第三步:根据实际环境ADC采用的值,与校准值之间进行运算补偿,得出环境温度值

计算公式为:

TCELSIUS = CAL_TEMP-(ADC0CAL3_TEMPREAD1V25 - ADC_result)×VFS /(4096× V_TS_SLOPE)

具体代码实现:

readDiff =calValue0/2 - adcSample;

temp=((float)readDiff * 1250);

temp/=(4096 * -1.835);

/* Calculate offset from calibration temperature */

temp =(float)calTemp0-temp;

转自: Ph_one

围观 342
订阅 RSS - 温度传感器