This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C2000中 ADC采样计算电流电压的问题

Other Parts Discussed in Thread: MOTORWARE

有关电流电压的计算过程,很不理解,根据读取到的DAC值计算实际值的时候,电流计算为什么不需要除以4096乘以3.3,再减去偏置,再除以放大倍数和测量电阻的乘积?

以下程序求具体解释:

static inline void HAL_readAdcData(HAL_Handle handle,HAL_AdcData_t *pAdcData)
{
  HAL_Obj *obj = (HAL_Obj *)handle;

  _iq value;
  _iq current_sf = HAL_getCurrentScaleFactor(handle);
  _iq voltage_sf = HAL_getVoltageScaleFactor(handle);


  // convert current A
  // sample the first sample twice due to errata sprz342f, ignore the first sample
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);
  value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];      // divide by 2^numAdcBits = 2^12
  pAdcData->I.value[0] = value;

  // convert current B
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);
  value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];      // divide by 2^numAdcBits = 2^12
  pAdcData->I.value[1] = value;

  // convert current C
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);
  value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];      // divide by 2^numAdcBits = 2^12
  pAdcData->I.value[2] = value;

  // convert voltage A
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);
  value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];      // divide by 2^numAdcBits = 2^12
  pAdcData->V.value[0] = value;

  // convert voltage B
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);
  value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];      // divide by 2^numAdcBits = 2^12
  pAdcData->V.value[1] = value;

  // convert voltage C
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);
  value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];      // divide by 2^numAdcBits = 2^12
  pAdcData->V.value[2] = value;

  // read the dcBus voltage value
  value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);     // divide by 2^numAdcBits = 2^12
  value = _IQ12mpy(value,voltage_sf);
  pAdcData->dcBus = value;

  return;
} // end of HAL_readAdcData() function

  • adc采集到的是数字量。这个数字量最大是4096 而对应能采集的电压也是1-3.3V

    这样一除就能算出最小的数字对应的电源值 ✖️采集到的数字量就是实际值

    偏置是一个测试值  比如你每次采集到的值比实际电源高0.2V。那就在采集值全部减去这个值

  • 有关电�电压的计算过程,很不理解,根据读取到的DAC值计算实际值的时候,电流计算为什么不需要除以4096乘以3.3,再减去偏置,再除以放大倍数和测量电阻的乘积?

    以下程序求具体解释:

    static inline void HAL_readAdcData(HAL_Handle handle,HAL_AdcData_t *pAdcData)
    {
      HAL_Obj *obj = (HAL_Obj *)handle;
    
      _iq value;
      _iq current_sf = HAL_getCurrentScaleFactor(handle);
      _iq voltage_sf = HAL_getVoltageScaleFactor(handle);
    
    
      // convert current A
      // sample the first sample twice due to errata sprz342f, ignore the first sample
      value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);
      value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];      // divide by 2^numAdcBits = 2^12
      pAdcData->I.value[0] = value;
    ERIC:
    这里使用的是标幺化的处理,数据格式是Q24的结构,所以一个12位的ADC,其实就是一个Q12的数据,再通过IQ12mpy处理成Q24,这就变成了标幺值,然后再乘以硬件系数值。
    注意ADCbias其实也是经过标幺化处理后的了。
  • Hi,ERIC

    我还有疑问是,那这个标幺化,跟实际计算中涉及到的3.3以及运放等系数有什么具体的关联?标幺化电压应该是以 USER_IQ_FULL_SCALE_VOLTAGE_V 为基值吧?电流应该是以 USER_IQ_FULL_SCALE_CURRENT_A 为基值吧?

    读到的模拟量转化为数字量后的值,为什么直接就可以标幺化了?有没有相关的转换过程?我想明白的是跟实际计算是不是一样的,谢谢您!

  • Hi,mangui zhang 

    是的,但是我的疑问是库函数里面的计算,好像跟实际计算不一样,他具体是怎么计算的?

    而且开发板中,硬件用的是反向运算放大器的接法,而计算时为什么也是采用正向运行放大器接法时的计算?

    反向运算放大器不应该是: value = - _IQ12mpy(value,current_sf) + obj->adcBias.I.value[0]; 这样计算么?

  • 我还有疑问是,那这个标幺化,跟实际计算中涉及到的3.3以及运放等系数有什么具体的关联?标幺化电压应该是以 USER_IQ_FULL_SCALE_VOLTAGE_V 为基值吧?电流应该是以 USER_IQ_FULL_SCALE_CURRENT_A 为基值吧?

    读到的模拟量转化为数字量后的值,为什么直接就可以标幺化了?有没有相关的转换过程?我想明白的是跟实际计算是不是一样的,谢谢您!

    ERIC:

    其实,我想说的是,殊途同归,它的方法跟你说的其实是一个道理。

    首先,程序里面用了标幺化,那么就代表着4095时,等于标幺化的1. 一般的电机算法,也不用程序什么系数之类的,而是直接把0~4095整成0~1就可以了,然后就电流环控制。至于1代表多少安的电流,你自己知道就好,或是如果程序需要,你再乘以比例系数,换算出来。

    那么motorware里面,它为了方面观察,所以做了很多变量来表示实际的电流大小,所以就要用到硬件的系数啦。那么标幺后的1,里面代表的电流大小的IQ FULL SCALE那个值,而不是硬件的最大电流,所以就需要乘以一个系数啦。

    里面用到Q24的数值表示方式,3.3V的模拟量,经过AD后是4095,也就是Q12的标幺1, 需要转换成Q24,所以要做一个IQ12mpy。

  • 好的,我再理一理思绪,谢谢您的解答,Thanks,ERIC!