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

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

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

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

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

添加如下的代码初始化内部的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 已经读取到温度信息。

我要赚赏金
