WCH沁恒单片机
直播中

你又知道了

12年用户 1104经验值
私信 关注
[问答]

ADC内部温度监测不准确是什么原因导致的?如何解决?

int ADC_Temp(void)
{
UINT8 i;
UINT16 AdcTemp=0;
ADC_InterTSSampInit();
adclen = 0;
PFIC_EnableIRQ( ADC_IRQn );
ADC_StartUp();
while( adclen < 12 );
PFIC_DisableIRQ( ADC_IRQn );
for( i = 2; i < 12; i++ )
AdcTemp += abcBuff[i];
AdcTemp /= 10;
return ADC_GetCurrentTS(AdcTemp);
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void ADC_IRQHandler( void ) //adc中断服务程序
{
if( ADC_GetITStatus() )
{
ADC_ClearITFlag();
if( adclen < 12 )
{
abcBuff[adclen] = ADC_ReadConverValue();
ADC_StartUp(); // 作用清除中断标志并开启新一轮采样
}
adclen++;
}
}
int ADC_GetCurrentTS( UINT16 ts_v )
{
UINT32 C25_Data[2];
int cal;
FLASH_EEPROM_CMD( CMD_GET_ROM_INFO, ROM_CFG_TMP_25C, C25_Data, 0 );
cal = ( ( (ts_v * 1050) + 2048 ) >> 12 ) + ( 1050 >> 1 );
cal = 25 + ((cal - (int)(C25_Data[0]&0xFFFF))*10/14);
return ( cal );
}
代码如上,温度测出来一直都是8、9度的样子,室温27度,按理说测出来不应该是27度左右吗,不知道是哪里的问题



回帖(1)

杨超

2022-8-25 10:42:05
因为芯片里面没有存温度校准的基值。
你可以这样用,比如当前室温30°,对应当前实测温度是8或者9,做个对应关系。
然后计算温度的变化量就可以了,
比如温度变化后,转换对应的温度是15,相当于+6度,那么实际温度是30+6=36°;
比如温度变化后,转换对应的温度是3,相当于-6度,那么实际温度是30-6=24°;

但是因为是内部温度,跟实际室温还是有差距的,手册上标的误差是±10°,这个要注意。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分