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.
电路原理图中的IA-FB、IB-FB、IC-FB为什么要出现两次?这样有什么好处?
为什么在软件中没有配置IA-FB、IB-FB、IC-FB、I-TOTAL?只是配置了EXT IA-FB、EXT IB-FB、EXT IC-FB,这些没有配置的功能接口是不是可以去掉?
我去掉这些接口后电机也可以正常运行,高速时可能不太正常,是什么原因?
//configure the SOCs for drv8301kit_revD
// EXT IA-FB
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_0,ADC_SocChanNumber_A6);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_0,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_0,ADC_SocSampleDelay_9_cycles);
// EXT IA-FB
// Duplicate conversion due to ADC Initial Conversion bug (SPRZ342)
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,ADC_SocChanNumber_A6);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_1,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_1,ADC_SocSampleDelay_9_cycles);
// EXT IB-FB
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_2,ADC_SocChanNumber_B6);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_2,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_2,ADC_SocSampleDelay_9_cycles);
// EXT IC-FB
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_3,ADC_SocChanNumber_A0);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_3,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_3,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb1
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_4,ADC_SocChanNumber_B7);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_4,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_4,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb2
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_5,ADC_SocChanNumber_A7);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_5,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_5,ADC_SocSampleDelay_9_cycles);
// ADC-Vhb3
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_6,ADC_SocChanNumber_B4);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_6,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_6,ADC_SocSampleDelay_9_cycles);
// VDCBUS
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_7,ADC_SocChanNumber_B2);
ADC_setSocTrigSrc(obj->adcHandle,ADC_SocNumber_7,ADC_SocTrigSrc_EPWM1_ADCSOCA);
ADC_setSocSampleDelay(obj->adcHandle,ADC_SocNumber_7,ADC_SocSampleDelay_9_cycles);
return;
} // end of HAL_setupAdcs() function
DRV8301 EVM板子上电流调理有两种方式,一种是用外部运放进行调理,得到信号EXT_IA_FB / EXT_IB_FB / EXT_IC_FB, 另外一种方式是用DRV8301芯片内部运放得到电流反馈,为DRV8301上S01和S02输出,即 IA_FB / IB_FB两个信号,IC_FB与EXT_IC_FB是接到一起的。
这些信息仔细看一下原理图都能看到。
至于高速转不好,那应该和这些采样配置关系不大,有可能是速度环或者电流环的控制参数不合理等软件原因造成。
下面的ADC端口在哪里定义的?怎么没有找到?把IA_FB、IB_FB、IC_FB切断后,下面的函数不发挥作用了吧?为什么对电机的性能没有影响?
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
//! \brief Reads the ADC data
//! \details Reads in the ADC result registers, and
//! scales the values according to the settings in user.h. The
//! structure gAdcData holds three phase voltages, three line
//! currents, and one DC bus voltage.
//! \param[in] handle The hardware abstraction layer (HAL) handle
//! \param[in] pAdcData A pointer to the ADC data buffer
static inline void HAL_readAdcDataWithOffsets(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);
pAdcData->I.value[0] = value;
// convert current B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_2);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[1] = value;
// convert current C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_3);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[2] = value;
// convert voltage A
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_4);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[0] = value;
// convert voltage B
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_5);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[1] = value;
// convert voltage C
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_6);
value = _IQ12mpy(value,voltage_sf);
pAdcData->V.value[2] = value;
// read the dcBus voltage value
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_7);
value = _IQ12mpy(value,voltage_sf);
pAdcData->dcBus = value;
return;
} // end of HAL_readAdcDataWithOffsets() function
Hi, 请先了解C2000 ADC的结构,和采样机制。
请阅读
“TMS320x2802x, 2803 Piccolo Analog-to-Digital Converter and Comparator Ref. Guide (Rev. F)”
http://www.ti.com/lit/ug/spruge5f/spruge5f.pdf
ADC_setSocChanNumber(obj->adcHandle,ADC_SocNumber_1,ADC_SocChanNumber_A6);
这句设置的是ADC硬件接口与Result寄存器对应的关系,这句是将A6管脚的采样结果放到RESULT1寄存器中,查看电路图得知A6管脚连接的是EXT_IA_FB信号。
value = (_iq)ADC_readResult(obj->adcHandle,ADC_ResultNumber_1);
value = _IQ12mpy(value,current_sf);
pAdcData->I.value[0] = value;
上面这段是从Result寄存器读数据,将Result1结果处理后存到变量 pAdcData->I.value[0]中。
所以读数据这段读出的是那个硬件端口进来的信息是由前面的配置决定的,因此不会失效。
具体是用的哪种调理电路出来的信号是软件设置的,默认是读取EXT_IA_FB....这组信号。
请参考上述回复。
结论是,目前这些信号完全没有被软件处理和使用,无论如何他们也不会对软件有任何影响,这个逻辑还是很清晰的,太感性的感觉不适合用来做技术判断,要依据基本规律和逻辑规律进行分析判断。
在void HAL_cal(HAL_Handle handle)有使用IC_FB进行HAL_AdcOffsetSelfCal(handle),IB_FB进行HAL_OscTempComp(handle)校准,直接去掉硬件接口,确认没有影响吗?
void HAL_cal(HAL_Handle handle)
{
HAL_Obj *obj = (HAL_Obj *)handle;
// enable the ADC clock
CLK_enableAdcClock(obj->clkHandle);
// Run the Device_cal() function
// This function copies the ADC and oscillator calibration values from TI reserved
// OTP into the appropriate trim registers
// This boot ROM automatically calls this function to calibrate the interal
// oscillators and ADC with device specific calibration data.
// If the boot ROM is bypassed by Code Composer Studio during the development process,
// then the calibration must be initialized by the application
ENABLE_PROTECTED_REGISTER_WRITE_MODE;
(*Device_cal)();
DISABLE_PROTECTED_REGISTER_WRITE_MODE;
// run offsets calibration in user's memory
HAL_AdcOffsetSelfCal(handle);
// run oscillator compensation
HAL_OscTempComp(handle);
// disable the ADC clock
CLK_disableAdcClock(obj->clkHandle);
return;
} // end of HAL_cal() function
// set SOC0 channel select to ADCINA5
ADC_setSocChanNumber(obj->adcHandle, ADC_SocNumber_0, ADC_SocChanNumber_A5);
//Select channel B5 for all SOC
HAL_AdcCalChanSelect(handle, ADC_SocChanNumber_B5);
你好,你列出来的这部分代码是ADC内部自校正的功能实现,于我们上面说的是两个功能。而且此处软件所采集的信息并不是IB_FB和IC_FB,详细信息请参考
“TMS320x2802x, 2803 Piccolo Analog-to-Digital Converter and Comparator Ref. Guide (Rev. F)”