这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 【S32K3XX】内部 Temperature Sensor 使用

共2条 1/1 1 跳转至

【S32K3XX】内部 Temperature Sensor 使用

高工
2026-03-21 15:13:21     打赏

【简介】

S32K3 芯片中集成了温度传感器,温度传感器可以通过 ADC 模块可以读出芯片的温度信息。以下是片内的 Temperature Sensor (TempSense)  的框图。

image.png

上述的ETS_EN 和 GNDSEL 信号可以将温度传感器连接到ADC模块,对应的寄存器描述如下。

image.png


使用 TempSense 我们需要在ADC模块的配置中开启 TempSense  的API.

image.png

ADC 模块的49 Channel 设计时固定连接到内部的 TempSense 模块

image.png

温度的计算根据如下的公式来获取当前芯片温度,TCA0/TCA1/TCA2 是芯片内部校正系数。

image.png

添加如下的代码初始化内部的ADC模块

#if (1 == CFG_ADC0_ENABLE)

static volatile boolean adc0notif_triggered = FALSE;

void Adc0EndOfChainNotif(void)
{
uint16 TempSenseVal;
float Temperature;
uint16 data;

/* End of chain notification for ADC0 */
LOG_I("ADC0 end of chain notification.");
adc0notif_triggered = TRUE;

/*Read ADC data from ch49*/
data = Adc_Sar_Ip_GetConvData(ADCHWUNIT_0_INSTANCE, 49);
PRINTF("ADC0 Channel 49 Data: %x \r\n", data);

/*calculate temperature on chip from provided data*/
TempSenseVal = Adc_Sar_Ip_TempSenseCalculateTemp(ADCHWUNIT_0_INSTANCE,0,data);
PRINTF("Temperature sensor raw value: %x \r\n", TempSenseVal);

//Adc_Sar_Ip_TempSenseGetTemp(ADCHWUNIT_0_INSTANCE, 0U, &TempSenseVal);
/*Q11.4 format to float*/
Temperature = ((TempSenseVal&0x7FF0)>>4) + (TempSenseVal&0x0F)/16.0F;
PRINTF("Temperature: %f \r\n", (double)Temperature);
}
#endif


static int s32k3_adc_driver_init(void)
{
Adc_Sar_Ip_StatusType emStatus;

#if (1 == CFG_ADC0_ENABLE)
Adc_Sar_Ip_TempSenseEnable(ADCHWUNIT_0_INSTANCE);

/* Init adc */
emStatus =  Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_INSTANCE);
while (emStatus != ADC_SAR_IP_STATUS_SUCCESS)
{
emStatus = Adc_Sar_Ip_DoCalibration(ADCHWUNIT_0_INSTANCE);
}
LOG_I("ADC0 Calibration completed.");

emStatus =  Adc_Sar_Ip_Init(ADCHWUNIT_0_INSTANCE, &AdcHwUnit_0);

if(emStatus != ADC_SAR_IP_STATUS_SUCCESS)
{
LOG_E("ADC0 init failed %x.", emStatus);
}
else
{
LOG_I("ADC0 init OK.");
}

for(uint8_t Index = 0; Index < ADC_SAR_IP_CDR_COUNT; Index++)
{
Adc_Sar_Ip_DisableChannel(0,ADC_SAR_IP_CONV_CHAIN_NORMAL,Index);
}

/*Enables the ADC notifications*/
Adc_Sar_Ip_EnableNotifications(ADCHWUNIT_0_INSTANCE, ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN);
#endif

return 1;
}


添加如下代码读取内部温度传感器的数据。

unsigned int adc0(char argc, char **argv)
{
//Adc_Sar_Ip_StatusType status;

if((argc == 3) && (0 == strcmp(argv[1],"read")))
{
uint32_t channel = atoi(argv[2]);
Adc_Sar_Ip_EnableChannel(ADCHWUNIT_0_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL, channel);
/* Start a SW triggered normal conversion on ADC_SAR */
Adc_Sar_Ip_StartConversion(ADCHWUNIT_0_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL);

while(!adc0notif_triggered){};
adc0notif_triggered = FALSE;

Adc_Sar_Ip_DisableChannel(ADCHWUNIT_0_INSTANCE, ADC_SAR_IP_CONV_CHAIN_NORMAL, channel);
}
else if(argc == 2 && (0 == strcmp(argv[1],"selftest")))
{
//status = Adc_Sar_Ip_SelfTest(ADCHWUNIT_0_INSTANCE);
//LOG_I("ADC0 self test %s", status == ADC_SAR_IP_STATUS_SUCCESS ? "success" : "failed");
}
else
{
PRINTF("Usage: adc0 read <channel>\n");
}


纸箱上测试代码读取 49 channel  的温度数据,通过49 channel 已经读取到温度信息。 

image.png


   


           


院士
2026-03-26 18:03:02     打赏
2楼

这个芯片温度的差值还是很有必要的。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]