annysky2012 发表于 2021-12-16 23:47

【基于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>&nbsp;</p>

<p><span style="font-size:16px;">温度主要监测的是开发板中IHM07M1上的驱动芯片L6230PD的温度,实际上板载温度传感器,主要是对器件在工作过程中的一个极限保护。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:16px;">在安全任务函数TSK_SafetyTask_PWMOFF()中,查看函数</span></p>

<pre>
<code>//检测温度,是否过温
CodeReturn |= errMask &amp; 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>&nbsp;</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-&gt;bSensorType == REAL_SENSOR )//传感器类型为真实传感器
{
    hAux = RCM_ExecRegularConv(pHandle-&gt;convHandle);//读取ADC转化的值

    if ( hAux != 0xFFFFu )//转化的值不等于65535
    {
      wtemp =( uint32_t )( pHandle-&gt;hLowPassFilterBW ) - 1u; //一阶低通滤波器带宽:250-1
      wtemp *= ( uint32_t ) ( pHandle-&gt;hAvTemp_d );//带宽*转化的平均电压值
      wtemp += hAux; //转化值累加
      wtemp /= ( uint32_t )( pHandle-&gt;hLowPassFilterBW );//除以带宽,求最终转化的值

      pHandle-&gt;hAvTemp_d = ( uint16_t ) wtemp;//赋值
    }

    pHandle-&gt;hFaultState = NTC_SetFaultState( pHandle );//检查有无错误标识,是否过温
}
else/* case VIRTUAL_SENSOR */ //是模拟传感器
{
    pHandle-&gt;hFaultState = MC_NO_ERROR; //返回无错误标识
}

return ( pHandle-&gt;hFaultState ); //返回状态值
}</code></pre>

<p>&nbsp;</p>

<p>&nbsp;</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>&nbsp;</p>

<p>&nbsp;</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-&gt;bSensorType == REAL_SENSOR )
{
    wTemp = ( int32_t )( pHandle-&gt;hAvTemp_d );//平均电压值赋值给变量
    wTemp -= ( int32_t )( pHandle-&gt;wV0 );//减去V0电压常数:1.055*65535/3.3
    wTemp *= pHandle-&gt;hSensitivity;//乘以灵敏度NTC灵敏度:3.3/0.023
    wTemp = wTemp / 65536 + ( int32_t )( pHandle-&gt;hT0 );//加上T0 温度常数值:25
}
else
{
    wTemp = pHandle-&gt;hExpectedTemp_C;
}
return ( ( int16_t )wTemp );
}</code></pre>

<p>&nbsp;</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>

Jacktang 发表于 2021-12-17 07:49

<p>温度检测主要是检测这个驱动芯片L6230PD的温度</p>

<p>如楼主文中提到的工作过程中的一个极限保护,如超过温度极限,怎么报警,设置蜂鸣器鸣叫?</p>

annysky2012 发表于 2021-12-17 08:32

温度检测主要是检测这个驱动芯片L6230PD的温度

如楼主文中提到的工作过程中的一个极限保护,如超过温度极限,怎么报警,设置蜂鸣器鸣叫?


<p>如果出现过温,过压,欠压,过流,均会关闭PWM输出,停机。
所以这里的软件安全措施也不是很完善,包括硬件做的安全措施也并不友好,毕竟只是一个开发板</p>

A354f 发表于 2024-8-27 15:19

<p>感谢分享,写得很好。话说楼主什么时候能继续更新</p>
页: [1]
查看完整版本: 【基于NUCLEO-F746ZG电机开发应用】16.安全任务的函数计算-温度计算