在帖子【基于NUCLEO-F746ZG电机开发应用】8.程序框架-三大核心任务简介中对三个核心任务进行了简单介绍,里面涉及了很多具体的函数计算。
我们从各个任务着手,把每个任务中的函数参数的值是如何获取的,一一来进行总结。今天先演示温度计算。
温度主要监测的是开发板中IHM07M1上的驱动芯片L6230PD的温度,实际上板载温度传感器,主要是对器件在工作过程中的一个极限保护。
在安全任务函数TSK_SafetyTask_PWMOFF()中,查看函数
//检测温度,是否过温
CodeReturn |= errMask[bMotor] & NTC_CalcAvTemp(pTemperatureSensor[bMotor]); /* check for fault if FW protection is activated. It returns MC_OVER_TEMP or MC_NO_ERROR */
点击函数NTC_CalcAvTemp(),可以查看到对温度传感器进行计算。计算流程为:
1.获取ADC采样转换的值;
2.若转换的值不等于65535,对采样的值进行计算。其中带宽为ADC的转换系数,初始值为250.
3.采样完成后,与温度的最值进行比较,输出温度的状态信息,对标识赋值。
特别注意的是:这里的计算值转换的不是实际温度值.
其函数代码为:
__weak uint16_t NTC_CalcAvTemp( NTC_Handle_t * pHandle )
{
uint32_t wtemp;
uint16_t hAux;
if ( pHandle->bSensorType == REAL_SENSOR )//传感器类型为真实传感器
{
hAux = RCM_ExecRegularConv(pHandle->convHandle);//读取ADC转化的值
if ( hAux != 0xFFFFu )//转化的值不等于65535
{
wtemp = ( uint32_t )( pHandle->hLowPassFilterBW ) - 1u; //一阶低通滤波器带宽:250-1
wtemp *= ( uint32_t ) ( pHandle->hAvTemp_d );//带宽*转化的平均电压值
wtemp += hAux; //转化值累加
wtemp /= ( uint32_t )( pHandle->hLowPassFilterBW );//除以带宽,求最终转化的值
pHandle->hAvTemp_d = ( uint16_t ) wtemp;//赋值
}
pHandle->hFaultState = NTC_SetFaultState( pHandle );//检查有无错误标识,是否过温
}
else /* case VIRTUAL_SENSOR */ //是模拟传感器
{
pHandle->hFaultState = MC_NO_ERROR; //返回无错误标识
}
return ( pHandle->hFaultState ); //返回状态值
}
其中温度传感器的初始化值如下:
NTC_Handle_t TempSensorParamsM1 =
{
.bSensorType = REAL_SENSOR,//真实传感器
.TempRegConv =
{
.regADC = ADC1,//ADC1
.channel = MC_ADC_CHANNEL_12,//ADC1的通道12为采集温度
.samplingTime = M1_TEMP_SAMPLING_TIME,//温度采样时间:28
},
.hLowPassFilterBW = M1_TEMP_SW_FILTER_BW_FACTOR,//低通滤波器带宽:250
.hOverTempThreshold = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d),//最大温度值:(1.055+0.023*(50-25))*65535/3.3
.hOverTempDeactThreshold = (uint16_t)(OV_TEMPERATURE_THRESHOLD_d - OV_TEMPERATURE_HYSTERESIS_d),//(1.055+0.023*(50-25))*65535/3.3-(0.023*10*65535/3.3)
.hSensitivity = (uint16_t)(ADC_REFERENCE_VOLTAGE/dV_dT),//NTC灵敏度:3.3/0.023
.wV0 = (uint16_t)(V0_V *65536/ ADC_REFERENCE_VOLTAGE),//V0电压常数:1.055*65535/3.3
.hT0 = T0_C,//T0 温度常数值:25
};
转换为实际温度值的函数为:NTC_GetAvTemp_C();
这里是对转换的ADC值转换为实际温度值,单位为℃。所以的温度系数相关的在初始化的时候均已经赋值。
经过以下函数计算,得出的即是准确的温度值,不过这里没有小数。
__weak int16_t NTC_GetAvTemp_C( NTC_Handle_t * pHandle )
{
int32_t wTemp;
if ( pHandle->bSensorType == REAL_SENSOR )
{
wTemp = ( int32_t )( pHandle->hAvTemp_d );//平均电压值赋值给变量
wTemp -= ( int32_t )( pHandle->wV0 );//减去V0电压常数:1.055*65535/3.3
wTemp *= pHandle->hSensitivity;//乘以灵敏度NTC灵敏度:3.3/0.023
wTemp = wTemp / 65536 + ( int32_t )( pHandle->hT0 );//加上T0 温度常数值:25
}
else
{
wTemp = pHandle->hExpectedTemp_C;
}
return ( ( int16_t )wTemp );
}