查看: 10525|回复: 6

【片上温度传感器】片内温度传感器问题

[复制链接]

2

主题

5

帖子

54

积分

中级工程师

Rank: 2

积分
54
发表于 2021-4-2 16:21:52 | 显示全部楼层 |阅读模式
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;  
}

回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-4-6 09:04:46 | 显示全部楼层
刚去查了,手册错误,0x1FFF_FA92 存放的是 30度时 温度在芯片出厂时,30度定标时的采样值。所以里面不是1e00。 芯片温度的定标一定是30度。
回复

使用道具 举报

154

主题

846

帖子

4624

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4624
发表于 2021-4-6 09:06:35 | 显示全部楼层
想点个赞,手一偏,点到踩上去了。不好意思了。不知道怎么改。
回复

使用道具 举报

2

主题

5

帖子

54

积分

中级工程师

Rank: 2

积分
54
 楼主| 发表于 2021-4-12 17:16:10 | 显示全部楼层
  LL_VREF_EnableTemperatureSensor(VREF);//使能VREF BUFFER
  LL_VREF_EnableVPTATBuffer(VREF);
  LL_ADC_EnalbleSequencerChannel(ADC, LL_ADC_INTERNAL_CH_TEMPSENSOR);//通道选择VREF
测量温度要使能这三个
回复

使用道具 举报

2

主题

5

帖子

54

积分

中级工程师

Rank: 2

积分
54
 楼主| 发表于 2021-4-12 17:54:23 | 显示全部楼层
  LL_VREF_EnableTemperatureSensor(VREF);//使能VREF BUFFER
  LL_VREF_EnableVPTATBuffer(VREF);
  LL_ADC_EnalbleSequencerChannel(ADC, LL_ADC_INTERNAL_CH_TEMPSENSOR);//通道选择VREF
测温前需要加入这三行
回复

使用道具 举报

0

主题

1

帖子

38

积分

初级工程师

Rank: 1

积分
38
发表于 2021-5-17 17:21:55 | 显示全部楼层
顾博文 发表于 2021-4-6 09:04
刚去查了,手册错误,0x1FFF_FA92 存放的是 30度时 温度在芯片出厂时,30度定标时的采样值。所以里面不是1e ...

语句不通,都理解不了你说的什么意思
回复

使用道具 举报

35

主题

109

帖子

1518

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1518
发表于 2021-5-19 13:55:51 | 显示全部楼层
0x1FFFFA92低半字应该是0x1E00,不是可能芯片没有定标过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表