您好,我們產(chǎn)品用了芯片內(nèi)部溫度采集,但是發(fā)現(xiàn)批量生產(chǎn)時(shí)有一些時(shí)-233度,有些是-23度,有些是30度,請(qǐng)問這種有沒有辦法統(tǒng)一一個(gè)參考點(diǎn)(比如就是25度作為一個(gè)參考點(diǎn)),如何修改?
內(nèi)部的溫度測(cè)量,是依賴于 ADC ,
請(qǐng)確保ADC 本身測(cè)量沒有問題,??
比如當(dāng)IO 的輸入電平,高于芯片的供電電壓時(shí)候, 將會(huì)影響到ADC 的測(cè)量結(jié)果,
對(duì)于ch578/579 如果使能的ADC 的粗調(diào) 值進(jìn)行修正,請(qǐng)確保PA5 在校準(zhǔn)時(shí)候配置為高阻輸入,且外部也是高阻態(tài), 否則將可能影響到 ADC 的粗調(diào)結(jié)果,從而進(jìn)一步影響到ADC的測(cè)量結(jié)果.
另外,也可將具體的測(cè)量溫度的代碼發(fā)我郵箱zxy@wch.cn,我們進(jìn)一步排查.
麻煩幫忙看一下ADC采集溫度代碼是否有問題,代碼如下所示:
#include "CH57x_common.h"
#include "adc.h"
signed short? RoughCalib_Value=0;// ADC粗調(diào)偏差值
/*******************************************************************************
* Function Name? : ADC_Init
* Description? ? : ADC初始化函數(shù)
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: None
*******************************************************************************/
void ADC_Init(void)
{
? ? /* 溫度采樣并輸出, 包含數(shù)據(jù)粗校準(zhǔn) */?
? ? PRINT( "\n1.Temperature sampling...\n");
? ? ADC_InterTSSampInit();
? ? RoughCalib_Value = ADC_DataCalib_Rough();? // 用于計(jì)算ADC內(nèi)部偏差,記錄到變量 RoughCalib_Value中,注意這個(gè)變量需要定義為有符號(hào)變量
}
/*******************************************************************************
* Function Name? : Get_Adc_Average
* Description? ? : 獲取內(nèi)部溫度通道的轉(zhuǎn)換值,取times次,然后平均?
* Input? ? ? ? ? : times:獲取次數(shù)
* Output? ? ? ? ?: None
* Return? ? ? ? ?: 內(nèi)部溫度通道的times次轉(zhuǎn)換結(jié)果平均值
*******************************************************************************/
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;? ? ? // 連續(xù)采樣20次
}
return temp_val/times;
}?
/*******************************************************************************
* Function Name? : Get_Adc_Average
* Description? ? : 獲取溫度
* Input? ? ? ? ? : None
* Output? ? ? ? ?: None
* Return? ? ? ? ?: 內(nèi)部溫度通道的times次轉(zhuǎn)換結(jié)果平均值
*******************************************************************************/
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;
}
同樣的問題,我也碰到了。
? /* 溫度采樣并輸出, 包含數(shù)據(jù)校準(zhǔn) */
? PRINT( "\n1.Temperature sampling...\n" );
? ADC_InterTSSampInit();
? RoughCalib_Value = ADC_DataCalib_Rough(); // 用于計(jì)算ADC內(nèi)部偏差,記錄到變量 RoughCalib_Value中,注意這個(gè)變量需要定義為有符號(hào)變量
? while(1)
{
? for( i = 0; i < 20; i++ )
? {
? ? ? ababab[i] = ADC_ExcutSingleConver() + RoughCalib_Value;? ? ? // 連續(xù)采樣20次
? }
? for( i = 0; i < 20; i++ )
? {
? ? PRINT( "%d \n", ababab[i] );
? }
}
我是這么寫的,我在官方例程上直接寫一個(gè)死循環(huán)看數(shù)組取數(shù),和串口打印出來的數(shù)據(jù)是否變化但是一直不變就不知道是什么意思了,打印出來這個(gè)數(shù)字一直位置在2849-2857這個(gè)范圍
從你給出的這個(gè)數(shù)據(jù),你用的應(yīng)該不是579吧,用的是573或者是582,你是怎么給芯片改變溫度的呢,外部溫度沒有明顯變化的情況下,adc采樣出的值基本不會(huì)有太大的變化的。