【沁恒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度左右。看看官方有什么测试过。
|