|
FM33LC026,手册FM33LC0xx产品说明书-V2.4.6第85页,“0x1FFF_FA92高半字保存 ADC 数据低半字为定标温度,0x1E00 表示 30°C”,但在芯片中读出的数据为0xFFFF04E6.
芯片实际的温度采集转换值为2311,可能也不正确。单测量VDDA电压是和实际相符。代码如下
const unsigned short *prefCal = (unsigned short *)0x1FFFFB08;
const unsigned short *ptsCal1 = (unsigned short *)0x1FFFFA92;
uint32_t GetVref1p22Sample(void)
{
uint16_t ADCRdresult;
LL_VREF_EnableVREFBuffer(VREF);//使能VREF BUFFER
LL_ADC_EnalbleSequencerChannel(ADC, LL_ADC_INTERNAL_CH_VREF);//通道选择VREF
LL_ADC_ClearFlag_EOC(ADC);//清标志
LL_ADC_Enable(ADC); // 启动ADC
LL_ADC_StartConversion(ADC); // 开始转换
// 等待转换完成
while (LL_ADC_IsActiveFlag_EOC(ADC) == RESET);
LL_ADC_ClearFlag_EOC(ADC);//清标志
ADCRdresult =LL_ADC_ReadConversionData12(ADC);//获取采样值
LL_ADC_Disable(ADC); // 关闭ADC
while (LL_ADC_IsActiveFlag_BUSY(ADC));
LL_ADC_DisableSequencerChannel(ADC, LL_ADC_INTERNAL_CH_VREF);//通道关闭VREF
LL_VREF_DisableVREFBuffer(VREF);//关闭VREF BUFFER
// 转换结果
return ADCRdresult;
}
uint32_t GetTsData(void)
{
uint16_t ADCRdresult;
LL_VREF_EnableTemperatureSensor(VREF);//使能VREF BUFFER
LL_ADC_EnalbleSequencerChannel(ADC, LL_ADC_INTERNAL_CH_TEMPSENSOR);//通道选择VREF
LL_ADC_ClearFlag_EOC(ADC);//清标志
LL_ADC_Enable(ADC); // 启动ADC
LL_ADC_StartConversion(ADC); // 开始转换
// 等待转换完成
while (LL_ADC_IsActiveFlag_EOC(ADC) == RESET);
LL_ADC_ClearFlag_EOC(ADC);//清标志
ADCRdresult =LL_ADC_ReadConversionData12(ADC);//获取采样值
LL_ADC_Disable(ADC); // 关闭ADC
while (LL_ADC_IsActiveFlag_BUSY(ADC));
LL_ADC_DisableSequencerChannel(ADC, LL_ADC_INTERNAL_CH_TEMPSENSOR);//通道关闭VREF
LL_VREF_DisableTemperatureSensor(VREF);//关闭VREF BUFFER
// 转换结果
return ADCRdresult;
}
unsigned short GetMcuTemp(void)
{
unsigned long refData=0, ret=0, tsData;
double vptat, vptat30;
//....
LL_ADC_Init(ADC, &ADC_InitStruct);
//....
refData = GetVref1p22Sample();//
rtInfo.mcuVol = (unsigned short)(((*prefCal)*1.0)/refData*3000);//mcu电压,单位mV
tsData = GetTsData(); //测量温度传感器转换值
//....
return ret;
}
|
|