使用DSP28335的AD模块,采集的电压是已经经过转换成0-3V的电机的AB两相电流。 转换后的0-3V的电压用示波器观察B相滞后A相120度,但是经过AD模块采集后,用CCS3.3的图表观察采集后的电压,也是正弦波,但B相只滞后A相90度左右。 请问这会是什么原因呢?
Emma Wang:
请您贴上graph采集的波形与AD部分的代码,便于我们帮助你分析。
使用DSP28335的AD模块,采集的电压是已经经过转换成0-3V的电机的AB两相电流。 转换后的0-3V的电压用示波器观察B相滞后A相120度,但是经过AD模块采集后,用CCS3.3的图表观察采集后的电压,也是正弦波,但B相只滞后A相90度左右。 请问这会是什么原因呢?
user4966799:
回复 Emma Wang:
头文件中定义:
#define ADCTRL1_INIT_STATE ADC_SUS_MODE0 + ADC_ACQ_PS_16 + \ ADC_CPS_1 + ADC_SEQ_DUAL
#define ADCTRL2_INIT_STATE ADC_EPWM_SOCA_SEQ1
AD的配置:
DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL1.all = ADC_RESET_FLAG; // Reset the ADC Module asm(" RPT #12 || NOP ");
AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // Power up bandgap/reference circuitry DELAY_US(ADC_usDELAY); // Delay before powering up rest of ADC AdcRegs.ADCTRL3.bit.ADCPWDN = 1; // Power up rest of ADC DELAY_US(ADC_usDELAY);
AdcRegs.ADCTRL3.bit.ADCCLKPS = 0; // Set up ADCTRL3 register AdcRegs.ADCTRL1.all = ADCTRL1_INIT_STATE; // Set up ADCTRL1 register AdcRegs.ADCTRL2.all = ADCTRL2_INIT_STATE; // Set up ADCTRL2 register AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x3; // Specify three conversions AdcRegs.ADCCHSELSEQ1.all = p->ChSelect; // Configure channel selection
// Set up Event Trigger with CNT_zero enable for Time-base of EPWM1 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOCA EPwm1Regs.ETSEL.bit.SOCASEL = 1; // Enable CNT_zero event for SOCA EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate SOCA on the 1st event EPwm1Regs.ETCLR.bit.SOCA = 1; // Clear SOCA flag
计算电流函数:
int16 DatQ15; int32 Tmp;
// Wait until ADC conversion is completed while (AdcRegs.ADCST.bit.SEQ1_BSY == 1) {}
DatQ15 = AdcRegs.ADCRESULT0^0x8000; // Convert raw result to Q15 (bipolar signal) Tmp = (int32)p->ImeasAGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15 DatQ15 = AdcRegs.ADCRESULT1^0x8000; Tmp += (int32)p->ImeasAGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15 p->ImeasA = (int16)(Tmp>>14); // Convert Q28 to Q15 p->ImeasA += p->ImeasAOffset; // Add offset
DatQ15 = AdcRegs.ADCRESULT2^0x8000; // Convert raw result to Q15 (bipolar signal) Tmp = (int32)p->ImeasBGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15 DatQ15 = AdcRegs.ADCRESULT3^0x8000; Tmp += (int32)p->ImeasBGain*(int32)DatQ15; // Tmp = gain*dat => Q28 = Q13*Q15 p->ImeasB = (int16)(Tmp>>14); // Convert Q28 to Q15 p->ImeasB += p->ImeasBOffset; // Add offset
Graph中波形如下:
示波器的测量结果:
可以看出,示波器测出的是相差120度正确的,但是经过AD就变成了只有90度了。