lugl4313820 发表于 2022-2-27 12:18

【沁恒RISC-V内核 CH582】ADC内部温度转换

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

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

<p>ADC_InterTSSampInit();<br />
RoughCalib_Value = ADC_DataCalib_Rough(); //&nbsp; 取得这个值为-2</p>

<p>temp_value =ADC_ExcutSingleConver() + RoughCalib_Value; &nbsp; &nbsp; &nbsp;// 获取值为2851</p>

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

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

<p>主程序如下:</p>

<pre>
<code>/********************************** (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;
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;
double temperate;
intC25;
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 &lt; 20; i++ )
      {
      abcBuff = ADC_ExcutSingleConver() + RoughCalib_Value;      // 连续采样20次
      temp_value = temp_value + abcBuff ;
      }
    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);
}

}</code></pre>

<p>获取温度值为:</p>

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

lugl4313820 发表于 2022-2-27 12:31

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

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

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

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

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

<p>&nbsp;是我哪里没有弄,还是芯片有问题,求官方解答。</p>

lugl4313820 发表于 2022-2-27 13:11

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

<p>贴子有更新。。修改一下</p>

花花花hy 发表于 2022-2-28 14:31

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

#define&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; ...

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

花花花hy 发表于 2022-2-28 14:35

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

lugl4313820 发表于 2022-2-28 14:52

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

<p>我看了评测给的函数是:</p>

<p>/********************************** (C) COPYRIGHT *******************************<br />
* File Name &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: CH58x_adc.c<br />
* Author &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : WCH<br />
* Version &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: V1.1<br />
* Date &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 2020/04/01<br />
* Description&nbsp;<br />
*******************************************************************************/</p>

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

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

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

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

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

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

WCH_Risc5 发表于 2022-3-14 17:06

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

lugl4313820 发表于 2022-3-14 21:33

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

<p>可以说明一下如何较对绝对温度吗,原来我想节约一下资源,做一个超低成本、超低功耗的温度传感器,但是感觉好象不是跟理想中的一样。原来用过MSP430G2253,他的温度也要较准,但是贵公司的对比起他,还有一定的理解,望多多指教!</p>
页: [1]
查看完整版本: 【沁恒RISC-V内核 CH582】ADC内部温度转换