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

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内部集成运放不好改 软件改了
ambutiom00 回答时间: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按照电路放大倍数来算 采样电阻记得设置对 现在什么现象
不来也不去。 回答时间:2019-5-25 10:21:12
卤煮 pHandle->wPhaseAOffset 在哪修改呢
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版