CH32V103应用教程——内置温度传感器
本章教程使用CH32V103的内部温度传感器检测器件周围温度,并通过串口调试助手打印显示。
1、温度传感器简介及相关函数介绍
CH32V103内置温度传感器,连接ADC_INT16通道,通过 ADC 将传感器输出的电压转换成数字值来反馈器件周围温度,推荐设置采样时间是 17.1us。温度传感器输出的电压随温度线性变化,由于生产差异,其线性变化的曲线斜率和偏移有所不同,所以内部温度传感器更适合于检测温度的变化,而不是测量绝对的温度。如果需要测量精确的温度,应该使用一个外置的温度传感器。
通过设置ADC_CTLR2寄存器的TSVREFE位置1,唤醒ADC内部采样通道,软件启动或者外部触发启动ADC的温度传感器通道转换,读取数据结果(mV)。其中,数字值和温度(℃)换算公式如下:
温度(℃) = ((VSENSE-V25)/Avg_Slope)+25
VSENSE:温度传感器的当前输出电压;
V25:温度传感器在 25℃下的电压值;
Avg_Slope:温度与 VSENSE曲线的平均斜率(mV/℃)
参考数据手册电气特性章节中 V25和 Avg_Slope 的实际值。
注:内部温度传感器上电(TSVREFE 位从 0 改为 1)需要一个建立时间,而 ADC 模块上电也需要一个建立时间(ADON 位从 0 改为 1),所以为了缩短等待时间,可以同时设置 ADON 和 TSVREFE 位。
关于CH32V103内置温度传感器具体信息,可参考CH32V103应用手册。温度检测程序所用库函数在ADC教程中已介绍,在此不再赘述。
2、硬件设计
内置温度传感器属于其内部资源,无需进行硬件连接,只需进行软件设计即可。
3、软件设计
本章教程通过ADC_INT16通道读取内置温度传感器值,其程序相较于ADC,变化不大,增加了使能内部温度传感器和温度值计算,主要程序如下:
temdet.h文件
- #ifndef __TEMDET_H
- #define __TEMDET_H
- #include "ch32v10x_conf.h"
- void adc_Init(void);
- u16 get_adc(u8 ch);
- u16 get_adc_average(u8 ch,u8 times);
- float get_temperature(void);
- #endif
temdet.h文件主要是相关函数的声明。
temdet.c文件
- #include "temdet.h"
- void adc_Init(void)
- {
- ADC_InitTypeDef ADC_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );
- RCC_ADCCLKConfig(RCC_PCLK2_Div6);
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfChannel = 1;
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_TempSensorVrefintCmd(ENABLE);
- ADC_Cmd(ADC1, ENABLE);
- ADC_ResetCalibration(ADC1);
- while(ADC_GetResetCalibrationStatus(ADC1));
- ADC_StartCalibration(ADC1);
- while(ADC_GetCalibrationStatus(ADC1));
- }
- u16 get_adc(u8 ch)
- {
- ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
- return ADC_GetConversionValue(ADC1);
- }
- u16 get_adc_average(u8 ch,u8 times)
- {
- u32 temp_val=0;
- u8 t;
- for(t=0;t<times;t++)
- {
- temp_val+=get_adc(ch);
- Delay_Ms(5);
- }
- return temp_val/times;
- }
- float get_temperature(void)
- {
- u32 adcx;
- float temperate;
- adcx=get_adc_average(ADC_Channel_16,20);
- temperate=(float)adcx*(3.3/4096);
- temperate=(1.43-temperate)/0.0043+25;
- return temperate;
- }
temdet.c文件主要是内置温度传感器进行温度检测的相关配置,其配置流程和ADC差不多,主要增加了使能内部温度传感器和温度值计算,在此不再对流程进行介绍。
main.c文件
- int main(void)
- {
- float tem;
- Delay_Init();
- USART_Printf_Init(115200);
- adc_Init();
- while(1)
- {
- Delay_Ms(500);
- tem=get_temperature();
- printf("temp=%.2f\n",tem);
- }
- }
main.c文件主要进行相关函数初始化以及打印输出温度值。
4、下载验证
将编译好的程序下载到开发板并复位,串口打印情况具体如下:
|