这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【CW32L012】5、芯片温度值测量

共1条 1/1 1 跳转至

【CW32L012】5、芯片温度值测量

高工
2025-11-19 12:00:55     打赏

CW32L012内置温度传感器模块,传感器的输出电压随温度变化,设置ADC模块的采样通道为内部温度传感器,通过ADC测量结果可计算得到当前的环境温度。

温度传感器默认处于关闭状态,通过设置控制寄存器ADCx CR的TSEN位域为1,使能温度传感器,使能约30 us后才可以转换TS通道。

环境温度计算公式如下

环境温度 = T0 ×0.5 + 0.095765×( Vref×AdcValue – 4.095×Trim )

其中: Vref 是当前 ADC 模块的参考电压,取值为 VDDA,单位是 V。

To是8位的初始校准温度值,记录在芯片的 FLASH 存储器中,其地址是 0x0010 07CD,单位是 0.5 摄氏度,读取出来的值需要除以2,才是实际的温度。

AdcValue 是 ADC模块测量温度传感器输出电压的 ADC转换结果,取值范围为 0~4095.Trim 是 16 位的校准值,计算时需要从芯片的 FLASH 存储器中读出,其存放地址如下表所示:

image.png

通过 ADC 测量环境温度的参考操作流程如下:

步骤 1:设置 SYSCTRL APBEN1.ADC 为 1,使能 ADC 配置时钟及工作时钟;

步骤 2:设置 ADCX CR.EN 为 1,使能 ADC 模块;

步骤 3:延时约 1us 等待模拟电路初始化完成;

步骤 4:设置 ADCX CR.ENS为 0,转换 SORCHO;

步骤 5:设置 ADCX SORCFR.SORCH0 为 0xE,选择序列通道0待转换源为内置温度传感器;步骤 6:配置 ADCX SAMPLE.SORCHO 及ADCX CR.CLK,设置 ADC的转换速度;

步骤 7:设置 ADCX CR.TSEN 为 1,使能温度传感器,并等待约 30us 使其稳定;

步骤 8:设置 ADCX ICR.EOC为 0,清除ADCx ISR.EOC标志;

步骤 9:设置 ADCX START.START 为1,启动 ADC 转换;

步骤 10:等待 ADCX_ISR.EOC 变为 1,读取 ADCX_RESULTO 寄存器,以获取 ADC 转换结果;步骤 11:设置 ADCX CR.EN 为 0,关闭 ADC 模块;

步骤 12:读取 T0 及 Trim,根据公式计算出当前的环境温度。

【程序设计】:

1、在b


sp_adc中添加初始化配置函数如下:

void ADC_Temp_Init(void)
{
	  __SYSCTRL_ADC_CLK_ENABLE();                   //使能ADC的时钟
	  CW_ADC1->CR_f.CONT        =1;                 //选择连续转换
	  CW_ADC1->CR_f.CLKSRC      =3;                 //PCLK/8 主频为96/8 为12M
	  CW_ADC1->CR_f.EN          =1;                 // 设置 ADCx_CR.EN 为 1,使能 ADC 模块
	  __NOP();   
	  CW_ADC1->CR_f.ENS         =1;                 //1个通道
	  CW_ADC1->SQRCFR_f.SQRCH0  =0xE;               //温度传换通道
	  CW_ADC1->SQRCFR_f.SQRCH1  =0xF;               //参考电压传换通道
	  CW_ADC1->SAMPLE_f.SQRCH0 = 0xF;               //转换时钟  1111  518个时钟周期
	  CW_ADC1->SAMPLE_f.SQRCH1 = 0xF;               //转换时钟  1111  518个时钟周期
	  CW_BGR->CR_f.TSEN        = 1;                 //使能温度转换
	  CW_BGR->CR_f.BGREN       = 1;                 //使能参考电压转换
	  CW_ADC1->ICR_f.EOC = 0;                       //清除中断标志位
}

在这估程序中,根据用户手册,温度ADC通道为0x0E, 1.2V电压通道为0x0F通道,我把这两个通道配置好后,对应转换结果存于寄存器0、1,使能连续转换,因此我们只需要在获取他的转换好后的,读取出来就行了。

2、在app.c中修改获取温度值如下:

void Run(void)
{
	uint32_t valueAdcAcc;
	uint16_t valueAdc;
	float fTsDegree, fVoltage;
	ADC_Temp_Init();
	CW_ADC1->START_f.START    = 1;                 //开始转换

	while(1)
	{
		if(CW_ADC1->ISR_f.EOS)
		{
			valueAdc = CW_ADC1->RESULT1_f.RESULT;              //获取1.2V电压转换值
			fVoltage = ADC_BgrResult2Avcc(valueAdc);           //计算出ADD电压值
			valueAdc = CW_ADC1->RESULT0_f.RESULT;              //获取温度值计数值
			fTsDegree = ADC_GetTs(fVoltage, valueAdc);         //计算出温度
			printf("The Temperature is %2f\r\n", fTsDegree);
			printf("The Reference voltage is %2f\r\n", fVoltage);
		}
		SysTickDelay(1000);
		
	}
	
}

下载到开发板观察串口输出:

image.png

用手触摸芯片表面,可以看到温度会有上升,放开后下降。说明转换值是正确的。

【附工程源码】

temp_pro.zip





关键词: CW32L012     温度     ADC1    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]