3721|3

1412

帖子

3

TA的资源

版主

【基于NUCLEO-F746ZG电机开发应用】16.安全任务的函数计算-温度计算 [复制链接]

在帖子【基于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 );
}

 

最新回复

感谢分享,写得很好。话说楼主什么时候能继续更新   详情 回复 发表于 2024-8-27 15:19
个人签名

没有什么不可以,我就是我,不一样的烟火! 


回复
举报

6408

帖子

0

TA的资源

五彩晶圆(高级)

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

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

点评

如果出现过温,过压,欠压,过流,均会关闭PWM输出,停机。 所以这里的软件安全措施也不是很完善,包括硬件做的安全措施也并不友好,毕竟只是一个开发板  详情 回复 发表于 2021-12-17 08:32

回复

1412

帖子

3

TA的资源

版主

温度检测主要是检测这个驱动芯片L6230PD的温度 如楼主文中提到的工作过程中的一个极限保护,如超过温度极限,怎么报警,设置蜂鸣器鸣叫?

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


回复

1

帖子

0

TA的资源

一粒金砂(初级)

感谢分享,写得很好。话说楼主什么时候能继续更新


回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表