请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 FOC5.2电机库中中的电流采样如何改为反向放大

[复制链接]
在路上… 提问时间:2019-1-21 17:20 /
如题,FOC5.2的电机库中,采样电路的放大是同向放大电路,但是我们硬件工程师设计成了反向,请问怎么在源码中修改以适配?

我试着改了R3HD2_GetPhaseCurrents这个函数中的电流采样计算,改动如下:
wAux =  wAux - (int32_t)( pHandle->wPhaseAOffset ) ;

但是还是不行,电机转动震动的厉害,还需要怎么改吗 没有思路 请各位给个意见。

收藏 评论12 发布时间:2019-1-21 17:20

举报

12个回答
在路上… 最优答案 回答时间:2019-1-24 15:40:49
结帖了,我的思路是正确的,先是硬件调坏了一块 后是电机烧了一个,调到怀疑人生。现在把改后的代码贴出来,方便大家查阅
  1. void R3HD2_GetPhaseCurrents( PWMC_Handle_t * pHdl, Curr_Components* pStator_Currents )
  2. {
  3.   uint8_t bSector;
  4.   int32_t wAux;
  5.   PWMC_R3_HD2_Handle_t * pHandle = (PWMC_R3_HD2_Handle_t *) pHdl;

  6.   /* Deactivate TIMx CH4 to disable next triggers using bit-banding access */
  7.   *(uint32_t*) (pHandle->wTIMxCH4_BB_Addr) = 0u;

  8.   /* Reset the SOFOC flag to indicate the start of FOC algorithm*/
  9.   pHandle->bSoFOC = 0u;

  10.   bSector = (uint8_t) pHdl->hSector;

  11.   switch ( bSector )
  12.   {
  13.   case SECTOR_4:
  14.   case SECTOR_5:
  15.     /* Current on Phase C is not accessible     */
  16.     /* Ia = PhaseAOffset - ADC converted value) */
  17.     wAux = (int32_t)( ADC1->JDR1 );
  18.     wAux *= 2;
  19.     wAux = wAux - (int32_t)( pHandle->wPhaseAOffset ) ;

  20.     /* Saturation of Ia */
  21.     if ( wAux < -INT16_MAX )
  22.     {
  23.       pStator_Currents->qI_Component1 = -INT16_MAX;
  24.     }
  25.     else if ( wAux > INT16_MAX )
  26.     {
  27.       pStator_Currents->qI_Component1 = INT16_MAX;
  28.     }
  29.     else
  30.     {
  31.       pStator_Currents->qI_Component1 = (int16_t) wAux;
  32.     }
  33.    
  34.     /* Ib = PhaseBOffset - ADC converted value) */
  35.     wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
  36.     wAux *= 2;
  37.     wAux = wAux - (int32_t)( pHandle->wPhaseBOffset ) ;

  38.     /* Saturation of Ib */
  39.     if ( wAux < -INT16_MAX )
  40.     {
  41.       pStator_Currents->qI_Component2 = -INT16_MAX;
  42.     }
  43.     else if ( wAux > INT16_MAX )
  44.     {
  45.       pStator_Currents->qI_Component2 = INT16_MAX;
  46.     }
  47.     else
  48.     {
  49.       pStator_Currents->qI_Component2 = (int16_t) wAux;
  50.     }
  51.     break;
  52.    
  53.   case SECTOR_6:
  54.   case SECTOR_1:
  55.     /* Current on Phase A is not accessible     */
  56.     /* Ib = PhaseBOffset - ADC converted value) */
  57.     wAux = (int32_t)( ADC1->JDR1 );
  58.     wAux *= 2;
  59.     wAux =  wAux - (int32_t)( pHandle->wPhaseBOffset ) ; //Ib

  60.     /* Saturation of Ib */
  61.     if ( wAux < -INT16_MAX )
  62.     {
  63.       pStator_Currents->qI_Component2 = -INT16_MAX;
  64.     }
  65.     else if ( wAux > INT16_MAX )
  66.     {
  67.       pStator_Currents->qI_Component2 = INT16_MAX;
  68.     }
  69.     else
  70.     {
  71.       pStator_Currents->qI_Component2 = (int16_t) wAux;
  72.     }

  73.     /* Ia = -Ic -Ib */
  74.     wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
  75.     wAux *= 2;
  76.     wAux = (int32_t) pHandle->wPhaseCOffset - wAux;  //Ic
  77.     wAux -= (int32_t) pStator_Currents->qI_Component2; //-Ic-Ib wAux = -wAux-pStator_Currents->qI_Component2

  78.     /* Saturation of Ia */
  79.     if ( wAux > INT16_MAX )
  80.     {
  81.       pStator_Currents->qI_Component1 = INT16_MAX;
  82.     }
  83.     else if ( wAux < -INT16_MAX )
  84.     {
  85.       pStator_Currents->qI_Component1 = -INT16_MAX;
  86.     }
  87.     else
  88.     {
  89.       pStator_Currents->qI_Component1 = (int16_t) wAux;
  90.     }
  91.     break;
  92.    
  93.   case SECTOR_2:
  94.   case SECTOR_3:
  95.     /* Current on Phase B is not accessible     */
  96.     /* Ia = PhaseAOffset - ADC converted value) */
  97.     wAux = (int32_t)( ADC1->JDR1 );
  98.     wAux *= 2;
  99.     wAux =  wAux - (int32_t)( pHandle->wPhaseAOffset ) ;

  100.     /* Saturation of Ia */
  101.     if ( wAux < -INT16_MAX )
  102.     {
  103.       pStator_Currents->qI_Component1 = -INT16_MAX;
  104.     }
  105.     else if ( wAux > INT16_MAX )
  106.     {
  107.       pStator_Currents->qI_Component1 = INT16_MAX;
  108.     }
  109.     else
  110.     {
  111.       pStator_Currents->qI_Component1 = (int16_t) wAux;
  112.     }

  113.     /* Ib = -Ic -Ia */
  114.     wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
  115.     wAux *= 2;
  116.     wAux = (int32_t) pHandle->wPhaseCOffset - wAux;
  117.     wAux -= (int32_t) pStator_Currents->qI_Component1;

  118.     /* Saturation of Ib */
  119.     if ( wAux > INT16_MAX )
  120.     {
  121.       pStator_Currents->qI_Component2 = INT16_MAX;
  122.     }
  123.     else if ( wAux < -INT16_MAX )
  124.     {
  125.       pStator_Currents->qI_Component2 = -INT16_MAX;
  126.     }
  127.     else
  128.     {
  129.       pStator_Currents->qI_Component2 = (int16_t) wAux;
  130.     }                     
  131.     break;

  132.   default:
  133.     break;
  134.   }

  135.   pHandle->_Super.hIa = pStator_Currents->qI_Component1;
  136.   pHandle->_Super.hIb = pStator_Currents->qI_Component2;
  137.   pHandle->_Super.hIc = -pStator_Currents->qI_Component1 - pStator_Currents->qI_Component2;
  138. }
复制代码
郝戈戈 回答时间:2019-1-22 07:45:05
把一块样板子上的运放正负输入线割断,另外用小线段连接起来 调试下。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

在路上… 回答时间:2019-1-22 10:15:10
郝戈戈 发表于 2019-1-22 07:45
把一块样板子上的运放正负输入线割断,另外用小线段连接起来 调试下。

明白你的意思 但是 我们这个是用TI的集成的IC做的 IC里面带运放 改不了 TI驱动IC是DRV8323RH
我的想法是先改FOC源码里的关于电流采样那块的程序,但是改了没啥效果。。。可能是我理解有问题 但是整个FOC的源码确实不熟 不知道具体怎么改
在路上… 回答时间:2019-1-24 15:42:39
郝戈戈 发表于 2019-1-22 07:45
把一块样板子上的运放正负输入线割断,另外用小线段连接起来 调试下。

嗯 后来确定是硬件和电机同时烧掉了,导致不正常 现在好了 感谢!
mmuuss586 回答时间:2019-1-24 16:43:21

飞线改回来就好了
在路上… 回答时间:2019-1-30 10:16:06
mmuuss586 发表于 2019-1-24 16:43
飞线改回来就好了

驱动IC内部集成运放不好改 软件改了
zhoutiantian 回答时间:2019-3-31 11:03:03
在路上… 发表于 2019-1-30 10:16
驱动IC内部集成运放不好改 软件改了

你好 感谢你的分享 我的问题跟你一样  我用的是DRV8305,按照你的思路该代码,还是不对,也许是我带的还不对。 问下你的ST MOTOR Control Workbench采样部分是怎么设置的,比如Amplification on board需要勾选吗,gain怎么设置
在路上… 回答时间:2019-4-10 20:53:06
ambutiom00 发表于 2019-3-31 11:03
你好 感谢你的分享 我的问题跟你一样  我用的是DRV8305,按照你的思路该代码,还是不对,也许是我带的还不 ...

Amplification on board 不需要勾选 gain按照电路放大倍数来算 采样电阻记得设置对 现在什么现象
CheneyFC 回答时间:2019-5-25 10:21:12
卤煮 pHandle->wPhaseAOffset 在哪修改呢
未来,我来 回答时间:2019-7-29 10:15:36
在路上… 发表于 2019-1-24 15:40
结帖了,我的思路是正确的,先是硬件调坏了一块 后是电机烧了一个,调到怀疑人生。现在把改后的代码贴出来 ...

你好,按说库原理图是正向放大吧,但是代码中看着像是反向放大的,为什么是这样的
未来,我来 回答时间:2019-7-29 10:28:35
它这里的意思难道是说从某一相流入的电流?
wAux = ( int32_t )( ADC1->JDR1 );
      wAux *= 2;
      wAux =  wAux - ( int32_t )( pHandle->wPhaseAOffset ) ;  这个是流出A相的电流,所以
wAux = ( int32_t )( ADC1->JDR1 );
      wAux *= 2;
      wAux = ( int32_t )( pHandle->wPhaseAOffset ) - wAux; 这个就是流入A相的电流,是不是这么理解的。
在路上… 回答时间:2019-8-16 16:24:35
未来,我来 发表于 2019-7-29 10:28
它这里的意思难道是说从某一相流入的电流?
wAux = ( int32_t )( ADC1->JDR1 );
      wAux *= 2;

贴完整函数出来 看不懂

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版