电机控制之ADC转换
(1)软件采集电压与电流:
BUS_Curr = (float32)((int16)(ADCSampPara.BUS_Curr- ADCSampPara.OffsetBUS_Curr)/4096.0*1.5*BUS_Curr_Sensor_Range);
PhaseU_Curr = (float32)((int16)(ADCSampPara.PhaseU_Curr- ADCSampPara.OffsetPhaseU_Curr)/4096.0*1.5*Phase_Curr_Sensor_Range);
PhaseV_Curr = (float32)((int16)(ADCSampPara.PhaseV_Curr- ADCSampPara.OffsetPhaseV_Curr)/4096.0*1.5*Phase_Curr_Sensor_Range);
BUS_Voltage= ADCSampPara.BUS_Voltage*BUS_Voltage_Mult_Coeff +BUS_Voltage_Add_Coeff ;
PhaseW_Curr= -(PhaseU_Curr+ PhaseV_Curr);//相电流Iu Iv Iw和等于0
首先,需要明确的是单片机采集到的是什么信号?
电机输出的是模拟信号,经过A/D转换变为数字信号。DSP28335的ADC是12位的,所以(0-3V)对应数字量(0-4095)。假设结果寄存器读到的数字量为X(0= 这里,代码中提到采集母线电流也是交流,为后面弱磁控制做准备。 直流母线电压通过万用表标定得出系数,y=ax+b (2)ADC模块配置 EALLOW; SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; //使能 ADC 外设时钟 ADC_cal(); //调用 ADC_cal 汇编程序,它是 TI 提供的 ADC 校准程序,直接使用即可 EDIS; AdcRegs.ADCTRL3.all = 0x00E0; //顺序采样 DELAY_US(ADC_usDELAY); // 上面代码等价于Ti封装的函数InitAdc(); AdcRegs.ADCTRL1.bit.ACQ_PS = ACQPS_X[0]; //SOC脉冲宽度等于9个ADCCLK周期 AdcRegs.ADCTRL1.bit.CPS = 1; //2分频 AdcRegs.ADCTRL3.bit.ADCCLKPS = 0; //不分频 AdcRegs.ADCTRL1.bit.SEQ_CASC = 0; //双排序器模式 AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 0x0; //禁止INT_SEQ1向CPU发出中断申请 AdcRegs.ADCTRL2.bit.RST_SEQ1 = 0x1; //复位排序器SEQ1到CONV00状态 AdcRegs.ADCTRL2.bit.RST_SEQ2 = 0x1; //立即复位SEQ2为预触发状态,退出正在执行的转换序列 AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=0x1; //允许ePWM的触发信号启动SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = ChSel_X[0]; AdcRegs.ADCCHSELSEQ1.bit.CONV01 = ChSel_X[1]; AdcRegs.ADCCHSELSEQ1.bit.CONV02 = ChSel_X[2]; AdcRegs.ADCCHSELSEQ1.bit.CONV03 = ChSel_X[3]; AdcRegs.ADCCHSELSEQ2.bit.CONV04 = ChSel_X[4]; AdcRegs.ADCCHSELSEQ2.bit.CONV05 = ChSel_X[5]; AdcRegs.ADCCHSELSEQ2.bit.CONV06 = ChSel_X[6]; AdcRegs.ADCCHSELSEQ2.bit.CONV07 = ChSel_X[7]; AdcRegs.ADCCHSELSEQ3.bit.CONV08 = ChSel_X[8]; AdcRegs.ADCCHSELSEQ3.bit.CONV09 = ChSel_X[9]; AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 9; //10个通道 EDIS; EPwm1Regs.ETSEL.bit.SOCAEN = 1; EPwm1Regs.ETSEL.bit.SOCASEL = 2; EPwm1Regs.ETPS.bit.SOCAPRD = 1; EPwm1Regs.ETCLR.bit.SOCA = 1;



