[RISC-V MCU 应用开发] 十一、CH32V103应用教程——内置温度传感器

[复制链接]
 楼主| RISCVLAR 发表于 2020-11-12 14:02 | 显示全部楼层 |阅读模式
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文件
  1. #ifndef __TEMDET_H
  2. #define __TEMDET_H

  3. #include "ch32v10x_conf.h"

  4. void adc_Init(void);
  5. u16  get_adc(u8 ch);
  6. u16  get_adc_average(u8 ch,u8 times);
  7. float get_temperature(void);

  8. #endif
temdet.h文件主要是相关函数的声明。
temdet.c文件
  1. #include "temdet.h"

  2. void adc_Init(void)
  3. {
  4.     ADC_InitTypeDef ADC_InitStructure;
  5.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );

  6.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  7.     ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  8.     ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  9.     ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  10.     ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  11.     ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  12.     ADC_InitStructure.ADC_NbrOfChannel = 1;
  13.     ADC_Init(ADC1, &ADC_InitStructure);

  14.     ADC_TempSensorVrefintCmd(ENABLE);

  15.     ADC_Cmd(ADC1, ENABLE);

  16.     ADC_ResetCalibration(ADC1);

  17.     while(ADC_GetResetCalibrationStatus(ADC1));

  18.     ADC_StartCalibration(ADC1);

  19.     while(ADC_GetCalibrationStatus(ADC1));
  20. }

  21. u16 get_adc(u8 ch)
  22. {
  23.     ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );

  24.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  25.     while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));
  26.     return ADC_GetConversionValue(ADC1);
  27. }

  28. u16 get_adc_average(u8 ch,u8 times)
  29. {
  30.     u32 temp_val=0;
  31.     u8 t;
  32.     for(t=0;t<times;t++)
  33.     {
  34.         temp_val+=get_adc(ch);
  35.         Delay_Ms(5);
  36.     }
  37.     return temp_val/times;
  38. }

  39. float get_temperature(void)
  40. {
  41.     u32 adcx;
  42.     float temperate;
  43.     adcx=get_adc_average(ADC_Channel_16,20);
  44.     temperate=(float)adcx*(3.3/4096);
  45.     temperate=(1.43-temperate)/0.0043+25;
  46.     return temperate;
  47. }

temdet.c文件主要是内置温度传感器进行温度检测的相关配置,其配置流程和ADC差不多,主要增加了使能内部温度传感器和温度值计算,在此不再对流程进行介绍。
main.c文件
  1. int main(void)
  2. {
  3.     float tem;
  4.     Delay_Init();
  5.         USART_Printf_Init(115200);
  6.         adc_Init();
  7.         while(1)
  8.     {
  9.             Delay_Ms(500);
  10.             tem=get_temperature();
  11.         printf("temp=%.2f\n",tem);
  12.         }
  13. }
main.c文件主要进行相关函数初始化以及打印输出温度值。

4、下载验证
将编译好的程序下载到开发板并复位,串口打印情况具体如下:
图片2.png


10、温度检测.rar

570.06 KB, 下载次数: 120

评论

[url=home.php?mod=space&uid=1198114]@zhengfish[/url] :±1.5℃左右,此传感器适合用于检测温度变化,如有其他用途,建议使用外置温度传感器  发表于 2020-11-16 16:38
这个温度传感器的标称误差范围多少?  发表于 2020-11-16 16:03

评分

参与人数 1威望 +1 收起 理由
8889ssda + 1 赞一个!

查看全部评分

goniu 发表于 2022-2-13 23:08 | 显示全部楼层
整个工程下载下去运行正常,自己新建的工程温度读不出来,代码都用示例工程里的也读不出温度,请问怎么回事?

评论

[url=home.php?mod=space&uid=3141872]@RISCVLAR[/url] :我也遇到这个问题,请教一下,直接使用你上传压缩包里的hex文件,串口可以打印出温度,自己编译的就不行,串口只打印temp=,第八章的PWM呼吸灯也是,用你的hex文件没问题,自己编译的就不行  发表于 2025-3-14 14:22
您好,示例代码应该是没有问题的,可以检查一下是否是串口打印或者MCU有问题  发表于 2022-2-14 13:31
海滨消消 发表于 2022-2-16 10:50 来自手机 | 显示全部楼层
学习学习
beacherblack 发表于 2022-3-3 22:09 | 显示全部楼层
这个还需要检测单片机温度吗
01ddd 发表于 2022-5-1 18:30 | 显示全部楼层
实测 ADC值 1561 套用例子64.90度
根据WCH论坛说明 公式为temperate=(temperate-1.34)/0.0043+25;
直接是负的
老光头 发表于 2022-7-27 23:06 | 显示全部楼层
goniu 发表于 2022-2-13 23:08
整个工程下载下去运行正常,自己新建的工程温度读不出来,代码都用示例工程里的也读不出温度,请问怎么回事 ...

里面tem变量采用了浮点数,需要在你自己建立工程中设置浮点输出打印选项,参考如下:
https://blog.csdn.net/armcsdn/article/details/125552668
kjkujkj21 发表于 2022-8-4 15:32 | 显示全部楼层
这个温度传感器的精度可以达到多少?如果使用这个芯片直接做户外温度校准,是否可以?
麻花油条 发表于 2022-8-5 16:37 来自手机 | 显示全部楼层
这个温度传感器精度可以达到多少了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

44

粉丝
快速回复 在线客服 返回列表 返回顶部

133

主题

296

帖子

44

粉丝
快速回复 在线客服 返回列表 返回顶部