GD32开发实战指南第14章内部温度传感器
开发环境:
MDK:Keil5。30
开发板:GD32F207IEVAL
MCU:GD32F207IK14。1内部温度传感器工作原理
GD32有一个内部的温度传感器,可以用来测量CPU及周围的温度(TA)。该温度传感器在内部和ADCxIN16输入通道相连接,此通道把传感器输出的电压转换成数字值。温度传感器模拟输入推荐采样时间是17。1s。GD32的内部温度传感器支持的温度范围为:40125度。精度比较差,为1。5左右。
GD32内部温度传感器的使用很简单,只要设置一下内部ADC,并激活其内部通道就差不多了。关于ADC的设置,我们在前面的章节已经进行了详细的介绍,这里就不再多说。接下来我们介绍一下和温度传感器设置相关的2个地方。
第一个地方,我们要使用GD32的内部温度传感器,必须先激活ADC的内部通道,这里通过ADCCTL1的TSVREN位(bit23)设置。设置该位为1则启用内部温度传感器。置位ADCCTL1寄存器的ADCON位,或者由外部触发启动ADC转换。
第二个地方,GD32的内部温度传感器固定的连接在ADC的通道16上,所以,我们在设置好ADC之后只要读取通道16的值,就是温度传感器返回来的电压值了。根据这个值,我们就可以计算出当前温度。GD32内置一个温度传感器,通过ADCIN16这个通道可以读出温度传感器的电压。其中给出了一个计算公式:
Temperature(in){(V25Vsense)AvgSlope}25公式中的Vsense就是在ADCIN16读到的数值。单位是V。AvgSlope就是温度与ADC数值转换的斜率。最小4。0典型4。3最大4。6单位是mVV25最小1。34V典型1。43V最大1。52V
现在,我们就可以总结一下GD32内部温度传感器使用的步骤了,如下:
1)设置ADC,开启内部温度传感器。
关于如何设置ADC,上一节已经介绍了,我们采用与上一节相似的设置。不同的是上一节温度传感器是读取外部通道的值,而内部温度传感器相当与把通道端口连接在内部温度传感器上。所以这里,我们要开启内部温度传感器功能:adctempsensorvrefintenable();
2)读取通道16的AD值,计算结果。
在设置完之后,我们就可以读取温度传感器的电压值了,得到该值就可以用上面的公式计算温度值。
例如读到Vsense1。30V。分别取V25和AvgSlope的典型值,
计算得到:(1。431。30)0。00432555。23
所以温度大约为55。GD32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量;测量范围40125,精度1。5。温度传感器产生一个随温度线性变化的电压,转换范围在2VVDDA3。6V之间。14。2内部温度传感器读取实现
内部ADC实现代码很简单,配置函数如下:briefConfiguretheADCperipheralparam〔in〕noneparam〔out〕noneretvalnonevoidadcconfig(void){enableGPIOCclockrcuperiphclockenable(RCUGPIOC);enableADC0clockrcuperiphclockenable(RCUADC0);configADCclockrcuadcclockconfig(RCUCKADCCKAPB2DIV8);configtheGPIOasanalogmodegpioinit(GPIOC,GPIOMODEAIN,GPIOOSPEED50MHZ,GPIOPIN3);ADCmodeconfigadcmodeconfig(ADCMODEFREE);ADCcontinuousmodefunctiondisableadcspecialfunctionconfig(ADC0,ADCCONTINUOUSMODE,DISABLE);ADCdataalignmentconfigadcdataalignmentconfig(ADC0,ADCDATAALIGNRIGHT);ADCchannellengthconfigadcchannellengthconfig(ADC0,ADCREGULARCHANNEL,1);ADCregularchannelconfigadcregularchannelconfig(ADC0,0,ADCCHANNEL16,ADCSAMPLETIME1POINT5);ADCtriggerconfigadcexternaltriggersourceconfig(ADC0,ADCREGULARCHANNEL,ADC012EXTTRIGREGULARNONE);ADCexternaltriggerenableadcexternaltriggerconfig(ADC0,ADCREGULARCHANNEL,ENABLE);ADCtemperatureandVrefintenableadctempsensorvrefintenable();enableADCinterfaceadcenable(ADC0);delayms(1);ADCcalibrationandresetcalibrationadccalibrationenable(ADC0);}
主函数也很简单:briefmainfunctionparam〔in〕noneparam〔out〕noneretvalnoneintmain(void){uint32tad0;uint8ti0;systickinitsysTickinit();usartinit1152008N1cominit(COM1,115200,0,1);adcconfigadcconfig();while(1){ad0;for(i0;i50;i){adcsoftwaretriggerenable(ADC0,ADCREGULARCHANNEL);while(!adcflagget(ADC0,ADCFLAGEOC));检查转换标志adcflagclear(ADC0,ADCFLAGEOC);清除结束标志adadadcregulardataread(ADC0);ADC转换结果}adad50;printf(ThecurrentADvalue0x04Xr,ad);printf(ThecurrentADvaluefVr,(float)ad40963。3);实际电压printf(temperturefrr,(1。433。34096ad)0。004325);delayms(1000);}}
值得注意的是,获取内部温度的核心代码就以下几行:adcsoftwaretriggerenable(ADC0,ADCREGULARCHANNEL);while(!adcflagget(ADC0,ADCFLAGEOC));检查转换标志adcflagclear(ADC0,ADCFLAGEOC);清除结束标志adadadcregulardataread(ADC0);ADC转换结果
只是为了防止偶然误差,这里求50次的均值。14。3实验现象
将程序编译好后下载到板子中,通过串口助手可以看到在接收区有温度值输出。