TI中文支持网
TI专业的中文技术问题搜集分享网站

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

有关电流电压的计算过程,很不理解,根据读取到的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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;// convert current Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];// divide by 2^numAdcBits = 2^12pAdcData->I.value[1] = value;// convert current Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];// divide by 2^numAdcBits = 2^12pAdcData->I.value[2] = value;// convert voltage Avalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];// divide by 2^numAdcBits = 2^12pAdcData->V.value[0] = value;// convert voltage Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];// divide by 2^numAdcBits = 2^12pAdcData->V.value[1] = value;// convert voltage Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];// divide by 2^numAdcBits = 2^12pAdcData->V.value[2] = value;// read the dcBus voltage valuevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);// divide by 2^numAdcBits = 2^12value = _IQ12mpy(value,voltage_sf);pAdcData->dcBus = value;return;
} // end of HAL_readAdcData() function

mangui zhang:

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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;// convert current Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];// divide by 2^numAdcBits = 2^12pAdcData->I.value[1] = value;// convert current Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];// divide by 2^numAdcBits = 2^12pAdcData->I.value[2] = value;// convert voltage Avalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];// divide by 2^numAdcBits = 2^12pAdcData->V.value[0] = value;// convert voltage Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];// divide by 2^numAdcBits = 2^12pAdcData->V.value[1] = value;// convert voltage Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];// divide by 2^numAdcBits = 2^12pAdcData->V.value[2] = value;// read the dcBus voltage valuevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);// divide by 2^numAdcBits = 2^12value = _IQ12mpy(value,voltage_sf);pAdcData->dcBus = value;return;
} // end of HAL_readAdcData() function

Eric Ma:

有关电�电压的计算过程,很不理解,根据读取到的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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;
ERIC:
这里使用的是标幺化的处理,数据格式是Q24的结构,所以一个12位的ADC,其实就是一个Q12的数据,再通过IQ12mpy处理成Q24,这就变成了标幺值,然后再乘以硬件系数值。
注意ADCbias其实也是经过标幺化处理后的了。

有关电流电压的计算过程,很不理解,根据读取到的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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;// convert current Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];// divide by 2^numAdcBits = 2^12pAdcData->I.value[1] = value;// convert current Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];// divide by 2^numAdcBits = 2^12pAdcData->I.value[2] = value;// convert voltage Avalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];// divide by 2^numAdcBits = 2^12pAdcData->V.value[0] = value;// convert voltage Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];// divide by 2^numAdcBits = 2^12pAdcData->V.value[1] = value;// convert voltage Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];// divide by 2^numAdcBits = 2^12pAdcData->V.value[2] = value;// read the dcBus voltage valuevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);// divide by 2^numAdcBits = 2^12value = _IQ12mpy(value,voltage_sf);pAdcData->dcBus = value;return;
} // end of HAL_readAdcData() function

desheng yang:

回复 Eric Ma:

Hi,ERIC

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

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

有关电流电压的计算过程,很不理解,根据读取到的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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;// convert current Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];// divide by 2^numAdcBits = 2^12pAdcData->I.value[1] = value;// convert current Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];// divide by 2^numAdcBits = 2^12pAdcData->I.value[2] = value;// convert voltage Avalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];// divide by 2^numAdcBits = 2^12pAdcData->V.value[0] = value;// convert voltage Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];// divide by 2^numAdcBits = 2^12pAdcData->V.value[1] = value;// convert voltage Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];// divide by 2^numAdcBits = 2^12pAdcData->V.value[2] = value;// read the dcBus voltage valuevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);// divide by 2^numAdcBits = 2^12value = _IQ12mpy(value,voltage_sf);pAdcData->dcBus = value;return;
} // end of HAL_readAdcData() function

desheng yang:

回复 mangui zhang:

Hi,mangui zhang 

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

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

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

有关电流电压的计算过程,很不理解,根据读取到的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 samplevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[0];// divide by 2^numAdcBits = 2^12pAdcData->I.value[0] = value;// convert current Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[1];// divide by 2^numAdcBits = 2^12pAdcData->I.value[1] = value;// convert current Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);value = _IQ12mpy(value,current_sf) - obj->adcBias.I.value[2];// divide by 2^numAdcBits = 2^12pAdcData->I.value[2] = value;// convert voltage Avalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[0];// divide by 2^numAdcBits = 2^12pAdcData->V.value[0] = value;// convert voltage Bvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[1];// divide by 2^numAdcBits = 2^12pAdcData->V.value[1] = value;// convert voltage Cvalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);value = _IQ12mpy(value,voltage_sf) - obj->adcBias.V.value[2];// divide by 2^numAdcBits = 2^12pAdcData->V.value[2] = value;// read the dcBus voltage valuevalue = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);// divide by 2^numAdcBits = 2^12value = _IQ12mpy(value,voltage_sf);pAdcData->dcBus = value;return;
} // end of HAL_readAdcData() function

desheng yang:

回复 Eric Ma:

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

赞(0)
未经允许不得转载:TI中文支持网 » C2000中 ADC采样计算电流电压的问题
分享到: 更多 (0)