3770|7

7048

帖子

11

TA的资源

版主

楼主
 

【沁恒RISC-V内核 CH582】ADC内部温度转换 [复制链接]

  本帖最后由 lugl4313820 于 2022-2-27 13:41 编辑

按照官方提供的例程,内部温度读取。

ADC_InterTSSampInit();
RoughCalib_Value = ADC_DataCalib_Rough(); //  取得这个值为-2

temp_value =ADC_ExcutSingleConver() + RoughCalib_Value;      // 获取值为2851

查找到CH58x_adc.c里的温度转换函数,因为要有小数,所以我修改了一下函数:如下:

/*******************************************************************************
* Function Name  : ADC_GetCurrentTS
* Description    : 获取当前采样的温度值(℃)
* Input          : ts_v:当前温度传感器采样输出
* Return         : 转换后的温度值(℃)
*******************************************************************************/
float ADC_GetCurrentTS( UINT16 ts_v )
{
  int  C25;
  float  cal;
  C25 = (*((PUINT32)ROM_CFG_TMP_25C));
  cal = ( ( (ts_v * 1050) + 2048 ) >> 12 ) + ( 1050 >> 1 );
  cal = 25 + ((float)(cal - C25)*10/14);
  return (  cal );
}

主程序如下:

/********************************** (C) COPYRIGHT *******************************
 * File Name          : Main.c
 * Author             : 刘建华
 * Version            : V1.0
 * Date               : 2022/02/27
 * Description        : 演示ST7735 硬件SPI驱动
 *******************************************************************************/

#include "CH58x_common.h"
#include "lcd_init.h"
#include "lcd.h"

UINT16 abcBuff[40];
uint32_t temp_value;
volatile UINT8 adclen;
void DebugInit( void )
{
  GPIOA_SetBits( GPIO_Pin_9 );
  GPIOA_ModeCfg( GPIO_Pin_8, GPIO_ModeIN_PU );
  GPIOA_ModeCfg( GPIO_Pin_9, GPIO_ModeOut_PP_5mA );
  UART1_DefInit();
}

int main()
{
  UINT8 i;
  char show_shr[30];
  double temperate;
  int  C25;
  int cal;
  C25 = (*((PUINT32)ROM_CFG_TMP_25C));
  signed short RoughCalib_Value = 0;    // ADC粗调偏差值
  SetSysClock( CLK_SOURCE_PLL_60MHz );

  /* 配置串口调试 */
  DebugInit();


  PRINT( "Start @ChipID=%02X\n", R8_CHIP_ID );
  sprintf(show_shr,"ChipID=%02X\n", R8_CHIP_ID);
  LCD_Init();
  LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  LCD_ShowString(0, 10, show_shr, BLUE, WHITE, 16, 0);
  mDelaymS(1000);
  LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  LCD_ShowString(10,0,"CH582M",BLUE,WHITE,32,0);
  LCD_ShowString(16,36,"HELLO WORLD",RED,WHITE,16,0);
  LCD_ShowString(16,54,"ST7735",RED,WHITE,16,0);
  ADC_InterTSSampInit();
  RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到变量 RoughCalib_Value中,注意这个变量需要定义为有符号变量
  PRINT("Rouh:%d\n",RoughCalib_Value);
  while( 1 )
  {
    temp_value = 0;
    for( i = 0; i < 20; i++ )
      {
        abcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value;      // 连续采样20次
        temp_value = temp_value + abcBuff[i] ;
      }
    temp_value = temp_value/20 ;
    LCD_ShowIntNum(20, 80, temp_value, 4, BLACK, WHITE, 16);
    temperate = ADC_GetCurrentTS(temp_value);
    LCD_ShowFloatNum1(20, 100, temperate, 6, BLACK, WHITE, 16);
    mDelaymS(1000);
  }

}

获取温度值为:

1度左右,感觉换算公式还是有问题,用手摸芯片,温度也就显示2度左右。看看官方有什么测试过。

最新回复

对v1.2是最新的,使用新的公式,使用新的公式后,温度的变化是对的,但绝对温度需要自己校准。   详情 回复 发表于 2022-3-14 17:06
点赞 关注(1)
 
 

回复
举报

7048

帖子

11

TA的资源

版主

沙发
 
本帖最后由 lugl4313820 于 2022-2-27 13:50 编辑

在CH58x_adc.h中看到有一个设置内置温度校准值的函数。

#define        ADC_TempCalibCfg( d )    (R8_TEM_SENSOR=R8_TEM_SENSOR&(~RB_TEM_SEN_CALIB)|d)                /* 设置内部温度传感器校准值 */

不知道这个d,要传什么样的参数?

查看数据手册,也没有说明可以传参:

 是我哪里没有弄,还是芯片有问题,求官方解答。

 
 
 

回复

7048

帖子

11

TA的资源

版主

板凳
 
本帖最后由 lugl4313820 于 2022-2-27 13:41 编辑

贴子有更新。。修改一下

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

4
 
lugl4313820 发表于 2022-2-27 12:31 在CH58x_adc.h中看到有一个设置内置温度校准值的函数。 #define         ...

这边还未对外开放,等开放之后在手册中会对这部分有所介绍。

 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

5
 

看你贴出来的代码,温度转换公式用的不是evt中最新的公式,可以下载官方最新的evt,使用新的公式,使用新的公式后,温度的变化是对的,但绝对温度需要自己校准。

点评

我看了评测给的函数是: /********************************** (C) COPYRIGHT ******************************* * File Name          : CH58x_adc.c * Author        详情 回复 发表于 2022-2-28 14:52
 
 
 

回复

7048

帖子

11

TA的资源

版主

6
 
花花花hy 发表于 2022-2-28 14:35 看你贴出来的代码,温度转换公式用的不是evt中最新的公式,可以下载官方最新的evt,使用新的公式,使用新的 ...

我看了评测给的函数是:

/********************************** (C) COPYRIGHT *******************************
* File Name          : CH58x_adc.c
* Author             : WCH
* Version            : V1.1
* Date               : 2020/04/01
* Description 
*******************************************************************************/

/*******************************************************************************
* Function Name  : ADC_GetCurrentTS
* Description    : 获取当前采样的温度值(℃)
* Input          : ts_v:当前温度传感器采样输出
* Return         : 转换后的温度值(℃)
*******************************************************************************/
int ADC_GetCurrentTS( UINT16 ts_v )
{
  int  C25;
  int cal;
  C25 = (*((PUINT32)ROM_CFG_TMP_25C));
  cal = ( ( (ts_v * 1050) + 2048 ) >> 12 ) + ( 1050 >> 1 );
  cal = 25 +( (cal - C25)*10/14);
  return (  cal );
}

然后另一个给的CH583 EVT例程下面又是这样的:

/********************************** (C) COPYRIGHT *******************************
 * File Name          : CH58x_adc.c
 * Author             : WCH
 * Version            : V1.2
 * Date               : 2021/11/17
 * Description
 * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
 * SPDX-License-Identifier: Apache-2.0
 *******************************************************************************/

/*********************************************************************
 * @fn      ADC_GetCurrentTS
 *
 * @brief   获取当前采样的温度值(℃)
 *
 * @param   ts_v    - 当前温度传感器采样输出
 *
 * @return  转换后的温度值(℃)
 */
int ADC_GetCurrentTS(uint16_t ts_v)
{
    uint32_t C25;
    int cal;

    C25 = (*((PUINT32)ROM_CFG_TMP_25C));
    cal = (ts_v * 2100) >> 12;
    cal = (((C25 >> 16) & 0xFFFF) ? ((C25 >> 16) & 0xFFFF) : 25) + ((cal - ((int)(C25 & 0xFFFF) - 1050 / 2) * 2) * 10 / 14);
    return (cal);
}

是不是要用v1.2?还是CH582的内部温度ADC需要另外提供的函数?

 
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

7
 

对v1.2是最新的,使用新的公式,使用新的公式后,温度的变化是对的,但绝对温度需要自己校准。

点评

可以说明一下如何较对绝对温度吗,原来我想节约一下资源,做一个超低成本、超低功耗的温度传感器,但是感觉好象不是跟理想中的一样。原来用过MSP430G2253,他的温度也要较准,但是贵公司的对比起他,还有一定的理解  详情 回复 发表于 2022-3-14 21:33
 
 
 

回复

7048

帖子

11

TA的资源

版主

8
 
WCH_Risc5 发表于 2022-3-14 17:06 对v1.2是最新的,使用新的公式,使用新的公式后,温度的变化是对的,但绝对温度需要自己校准。

可以说明一下如何较对绝对温度吗,原来我想节约一下资源,做一个超低成本、超低功耗的温度传感器,但是感觉好象不是跟理想中的一样。原来用过MSP430G2253,他的温度也要较准,但是贵公司的对比起他,还有一定的理解,望多多指教!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表