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.

关于28335在三相异步电机算法中AD转换的疑问

Other Parts Discussed in Thread: CONTROLSUITE

AD转换配置成PWM1H来触发中断,目前是采集INA0,INA1,INA2三个通道,分别对应电机的三个相电流,我用示波器看了电机相电流,基本上算是满意的正弦波,跑的是开环控制,但我AD转换出来,这个三个通道显示的值完全一样,变换也是同样的,不知道是哪里配置没有搞对

AdcRegs.ADCTRL1.bit.CONT_RUN       = 0;//连续转换模式从初始状态开始,对于SEQ1和级联模式从CONV00开始,SEQ2从CONV08开始
   AdcRegs.ADCTRL1.bit.SEQ_OVRD       = 0;//使能在MAX CONVn设置的转换完成后环绕覆盖序列发生器转换结果
   AdcRegs.ADCTRL1.bit.SEQ_CASC       = 0;//双序列发生器模式,SEQ1和SEQ2作为两个8状态序列发生器操作

   AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1   = 0;//SEQ1每一个EOS结束都置位INT_SEQ1中断标志位
   AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1   = 1;//使能SEQ1中断
   AdcRegs.ADCTRL2.bit.SOC_SEQ1       = 0;//关闭SEQ1软件触发
   AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;//使能EPWM1SOCA触发ADC
   AdcRegs.ADCTRL2.bit.RST_SEQ1       = 1;
   AdcRegs.ADCMAXCONV.bit.MAX_CONV1   = 2;//设置最大转换通道数

   //AdcRegs.ADCTRL2.bit.INT_MOD_SEQ2   = 0;//SEQ2每一个EOS结束都置位INT_SEQ2中断标志位
   //AdcRegs.ADCTRL2.bit.INT_ENA_SEQ2   = 1;//使能SEQ2中断
   //AdcRegs.ADCTRL2.bit.SOC_SEQ2       = 0;//关闭SEQ2软件触发
   //AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ2 = 1;//使能EPWM1SOCA触发ADC
   //AdcRegs.ADCTRL2.bit.RST_SEQ2       = 1;
   //AdcRegs.ADCMAXCONV.bit.MAX_CONV2   = 0;//设置最大转换通道数

   AdcRegs.ADCST.bit.INT_SEQ1_CLR     = 1;//清除SEQ1中断标志位INT_SEQ1
   AdcRegs.ADCST.bit.INT_SEQ2_CLR     = 1;//清除SEQ2中断标志位INT_SEQ2

   AdcRegs.ADCCHSELSEQ1.bit.CONV00    = 0;//
   AdcRegs.ADCCHSELSEQ1.bit.CONV01    = 1;
   AdcRegs.ADCCHSELSEQ1.bit.CONV02    = 2;
   //AdcRegs.ADCCHSELSEQ1.bit.CONV03    = 3;
   //AdcRegs.ADCCHSELSEQ2.bit.CONV04    = 4;

   AdcRegs.ADCREFSEL.bit.REF_SEL      = 0;//ADC参考电压,为内部参考

   SysCtrlRegs.HISPCP.all             = 1;//高速外设时钟预分频系数HISPCP
   AdcRegs.ADCTRL3.bit.SMODE_SEL      = 0;
   AdcRegs.ADCTRL3.bit.ADCCLKPS       = 4;//ADC核时钟分频器系数ADCCKLPS
   AdcRegs.ADCTRL1.bit.CPS            = 1;//ADC核预订标器系数CPS
   AdcRegs.ADCTRL1.bit.ACQ_PS         = 1;//采集窗口
   AdcRegs.ADCTRL3.bit.ADCBGRFDN      = 3;//ADC带隙电路和参考电路加电
   //DELAY_US(100000);//延时10MS
   AdcRegs.ADCTRL3.bit.ADCPWDN        = 1;//ADC模块加电
   DELAY_US(100000);

以上是AD模块的配置代码

//配置事件触发寄存器
    EPwm1Regs.ETSEL.bit.SOCASEL   = 2;//当TBCTR计数值为0时,启动ADC转换
    EPwm1Regs.ETSEL.bit.SOCAEN    = 1;//使能EPWM1A脉冲触发ADC转换
    EPwm1Regs.ETPS.bit.SOCAPRD    = 1;//在第一个事件上生成EPWM1ASCOA脉冲

以上是PWM触发AD转换的代码,劳烦大家帮我看看是哪里的问题,谢谢了

  • 程序里面通道选择应该没有问题,有没有可能你观察的结果寄存器配置错了?否则不可能出现3个通道都一样,连变化趋势都一样的情况
  • U_Phase_I = AdcRegs.ADCRESULT0 >> 4;
    V_Phase_I = AdcRegs.ADCRESULT1 >> 4;
    W_Phase_I = AdcRegs.ADCRESULT2 >> 4;
    你好,以上是我读取的三个结果寄存器,肯定没问题的吧,另外,下午我单独测试了下第一个通道,接了一个电位器,现在现象很奇怪,无论我怎么配置AD模块,读出来的结果都不超过2330,按理说12位的AD出来的结果最大可以到4095啊,电位器我接的是3.3V电源
  • 而且感觉数据有些乱,虽然我转动电位器显示出来的AD值也在变,但完全不能反应出应该有的变化,我是用的PC端自己写的上位机观察的,数据通信那块是没有问题的,
  • 单独测试信号无变化?一起测试的时候是基本正常的正弦波?
    你先用例程测试一下呢?C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_examples_ccsv5\adc_soc