【基于NUCLEO-F746ZG电机开发应用】16.安全任务的函数计算-温度计算
<div class='showpostmsg'><p><span style="font-size:16px;">在帖子<a href="https://bbs.eeworld.com.cn/thread-1180646-1-1.html">【基于NUCLEO-F746ZG电机开发应用】8.程序框架-三大核心任务简介</a>中对三个核心任务进行了简单介绍,里面涉及了很多具体的函数计算。</span></p><p><span style="font-size:16px;">我们从各个任务着手,把每个任务中的函数参数的值是如何获取的,一一来进行总结。今天先演示温度计算。</span></p>
<p> </p>
<p><span style="font-size:16px;">温度主要监测的是开发板中IHM07M1上的驱动芯片L6230PD的温度,实际上板载温度传感器,主要是对器件在工作过程中的一个极限保护。</span></p>
<p> </p>
<p><span style="font-size:16px;">在安全任务函数TSK_SafetyTask_PWMOFF()中,查看函数</span></p>
<pre>
<code>//检测温度,是否过温
CodeReturn |= errMask & NTC_CalcAvTemp(pTemperatureSensor); /* check for fault if FW protection is activated. It returns MC_OVER_TEMP or MC_NO_ERROR */
</code></pre>
<p><span style="font-size:16px;">点击函数NTC_CalcAvTemp(),可以查看到对温度传感器进行计算。计算流程为:</span></p>
<p><span style="font-size:16px;">1.获取ADC采样转换的值;</span></p>
<p><span style="font-size:16px;">2.若转换的值不等于65535,对采样的值进行计算。其中带宽为ADC的转换系数,初始值为250.</span></p>
<p><span style="font-size:16px;">3.采样完成后,与温度的最值进行比较,输出温度的状态信息,对标识赋值。</span></p>
<p> </p>
<p><span style="font-size:16px;"><strong>特别注意的是:这里的计算值转换的不是实际温度值.</strong></span></p>
<p><span style="font-size:16px;">其函数代码为:</span></p>
<pre>
<code>__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 ); //返回状态值
}</code></pre>
<p> </p>
<p> </p>
<p><span style="font-size:16px;">其中温度传感器的初始化值如下:</span></p>
<pre>
<code>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
};
</code></pre>
<p> </p>
<p> </p>
<p><span style="font-size:16px;">转换为实际温度值的函数为:NTC_GetAvTemp_C();</span></p>
<p><span style="font-size:16px;">这里是对转换的ADC值转换为实际温度值,单位为℃。所以的温度系数相关的在初始化的时候均已经赋值。</span></p>
<p><span style="font-size:16px;">经过以下函数计算,得出的即是准确的温度值,不过这里没有小数。</span></p>
<pre>
<code>__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 );
}</code></pre>
<p> </p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>温度检测主要是检测这个驱动芯片L6230PD的温度</p>
<p>如楼主文中提到的工作过程中的一个极限保护,如超过温度极限,怎么报警,设置蜂鸣器鸣叫?</p>
温度检测主要是检测这个驱动芯片L6230PD的温度
如楼主文中提到的工作过程中的一个极限保护,如超过温度极限,怎么报警,设置蜂鸣器鸣叫?
<p>如果出现过温,过压,欠压,过流,均会关闭PWM输出,停机。
所以这里的软件安全措施也不是很完善,包括硬件做的安全措施也并不友好,毕竟只是一个开发板</p> <p>感谢分享,写得很好。话说楼主什么时候能继续更新</p>
页:
[1]