在路上… 发表于 2019-1-21 17:20:04

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

如题,FOC5.2的电机库中,采样电路的放大是同向放大电路,但是我们硬件工程师设计成了反向,请问怎么在源码中修改以适配?

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

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

在路上… 发表于 2019-1-24 15:40:49

结帖了,我的思路是正确的,先是硬件调坏了一块 后是电机烧了一个,调到怀疑人生。现在把改后的代码贴出来,方便大家查阅
void R3HD2_GetPhaseCurrents( PWMC_Handle_t * pHdl, Curr_Components* pStator_Currents )
{
uint8_t bSector;
int32_t wAux;
PWMC_R3_HD2_Handle_t * pHandle = (PWMC_R3_HD2_Handle_t *) pHdl;

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

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

bSector = (uint8_t) pHdl->hSector;

switch ( bSector )
{
case SECTOR_4:
case SECTOR_5:
    /* Current on Phase C is not accessible   */
    /* Ia = PhaseAOffset - ADC converted value) */
    wAux = (int32_t)( ADC1->JDR1 );
    wAux *= 2;
    wAux = wAux - (int32_t)( pHandle->wPhaseAOffset ) ;

    /* Saturation of Ia */
    if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component1 = -INT16_MAX;
    }
    else if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component1 = INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component1 = (int16_t) wAux;
    }
   
    /* Ib = PhaseBOffset - ADC converted value) */
    wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
    wAux *= 2;
    wAux = wAux - (int32_t)( pHandle->wPhaseBOffset ) ;

    /* Saturation of Ib */
    if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component2 = -INT16_MAX;
    }
    else if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component2 = INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component2 = (int16_t) wAux;
    }
    break;
   
case SECTOR_6:
case SECTOR_1:
    /* Current on Phase A is not accessible   */
    /* Ib = PhaseBOffset - ADC converted value) */
    wAux = (int32_t)( ADC1->JDR1 );
    wAux *= 2;
    wAux =wAux - (int32_t)( pHandle->wPhaseBOffset ) ; //Ib

    /* Saturation of Ib */
    if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component2 = -INT16_MAX;
    }
    else if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component2 = INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component2 = (int16_t) wAux;
    }

    /* Ia = -Ic -Ib */
    wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
    wAux *= 2;
    wAux = (int32_t) pHandle->wPhaseCOffset - wAux;//Ic
    wAux -= (int32_t) pStator_Currents->qI_Component2; //-Ic-Ib wAux = -wAux-pStator_Currents->qI_Component2

    /* Saturation of Ia */
    if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component1 = INT16_MAX;
    }
    else if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component1 = -INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component1 = (int16_t) wAux;
    }
    break;
   
case SECTOR_2:
case SECTOR_3:
    /* Current on Phase B is not accessible   */
    /* Ia = PhaseAOffset - ADC converted value) */
    wAux = (int32_t)( ADC1->JDR1 );
    wAux *= 2;
    wAux =wAux - (int32_t)( pHandle->wPhaseAOffset ) ;

    /* Saturation of Ia */
    if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component1 = -INT16_MAX;
    }
    else if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component1 = INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component1 = (int16_t) wAux;
    }

    /* Ib = -Ic -Ia */
    wAux = (int32_t)( pHandle->pParams_str->ADCx2->JDR1 );
    wAux *= 2;
    wAux = (int32_t) pHandle->wPhaseCOffset - wAux;
    wAux -= (int32_t) pStator_Currents->qI_Component1;

    /* Saturation of Ib */
    if ( wAux > INT16_MAX )
    {
      pStator_Currents->qI_Component2 = INT16_MAX;
    }
    else if ( wAux < -INT16_MAX )
    {
      pStator_Currents->qI_Component2 = -INT16_MAX;
    }
    else
    {
      pStator_Currents->qI_Component2 = (int16_t) wAux;
    }                     
    break;

default:
    break;
}

pHandle->_Super.hIa = pStator_Currents->qI_Component1;
pHandle->_Super.hIb = pStator_Currents->qI_Component2;
pHandle->_Super.hIc = -pStator_Currents->qI_Component1 - pStator_Currents->qI_Component2;
}

郝戈戈 发表于 2019-1-22 07:45:05

把一块样板子上的运放正负输入线割断,另外用小线段连接起来 调试下。

在路上… 发表于 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 在哪修改呢
页: [1] 2
查看完整版本: STM32 FOC5.2电机库中中的电流采样如何改为反向放大