CKS32F4xx系列内部温度传感器使用

cathy的头像
cathy 发布于:周五, 08/18/2023 - 10:24 ,关键词:

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