您好,我们产品用了芯片内部温度采集,但是发现批量生产时有一些时-233度,有些是-23度,有些是30度,请问这种有没有办法统一一个参考点(比如就是25度作为一个参考点),如何修改?
内部的温度测量,是依赖于 ADC ,
请确保ADC 本身测量没有问题,
比如当IO 的输入电平,高于芯片的供电电压时候, 将会影响到ADC 的测量结果,
对于ch578/579 如果使能的ADC 的粗调 值进行修正,请确保PA5 在校准时候配置为高阻输入,且外部也是高阻态, 否则将可能影响到 ADC 的粗调结果,从而进一步影响到ADC的测量结果.
另外,也可将具体的测量温度的代码发我邮箱zxy@wch.cn,我们进一步排查.
麻烦帮忙看一下ADC采集温度代码是否有问题,代码如下所示:
#include "CH57x_common.h"
#include "adc.h"
signed short RoughCalib_Value=0;// ADC粗调偏差值
/*******************************************************************************
* Function Name : ADC_Init
* Description : ADC初始化函数
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void ADC_Init(void)
{
/* 温度采样并输出, 包含数据粗校准 */
PRINT( "\n1.Temperature sampling...\n");
ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量
}
/*******************************************************************************
* Function Name : Get_Adc_Average
* Description : 获取内部温度通道的转换值,取times次,然后平均
* Input : times:获取次数
* Output : None
* Return : 内部温度通道的times次转换结果平均值
*******************************************************************************/
uint16_t Get_Adc_Average(uint8_t times)
{
uint32_t temp_val=0;
uint8_t t;
for(t=0;t
{
temp_val+=ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次
}
return temp_val/times;
}
/*******************************************************************************
* Function Name : Get_Adc_Average
* Description : 获取温度
* Input : None
* Output : None
* Return : 内部温度通道的times次转换结果平均值
*******************************************************************************/
uint8_t Get_Temprate(void)
{
int temp=0;
temp=ADC_GetCurrentTS(Get_Adc_Average(20));
if(temp<0)
temp=256+temp;
PRINT("temp:%d 'c\r\n",temp);
return temp;
}
同样的问题,我也碰到了。
/* 温度采样并输出, 包含数据校准 */
PRINT( "\n1.Temperature sampling...\n" );
ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量
while(1)
{
for( i = 0; i < 20; i++ )
{
ababab[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次
}
for( i = 0; i < 20; i++ )
{
PRINT( "%d \n", ababab[i] );
}
}
我是这么写的,我在官方例程上直接写一个死循环看数组取数,和串口打印出来的数据是否变化但是一直不变就不知道是什么意思了,打印出来这个数字一直位置在2849-2857这个范围
从你给出的这个数据,你用的应该不是579吧,用的是573或者是582,你是怎么给芯片改变温度的呢,外部温度没有明显变化的情况下,adc采样出的值基本不会有太大的变化的。