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 存储器中读出,其存放地址如下表所示:

通过 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);
}
}下载到开发板观察串口输出:

用手触摸芯片表面,可以看到温度会有上升,放开后下降。说明转换值是正确的。
【附工程源码】
我要赚赏金
