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.

【求助】F28335中PWM、ADC、DMA的几个问题

 首先我参考TI官方的程序配置了PWM+ADC的做了一个测试程序,级联模式、SOCB触发,能触发成功并且成功进入到ADC转换完成的中断里,但是在中断里必须要将RST_SEQ1置1来复位排序器才可以得到正确的采样,如果不复位,多次转换的值将变成同一个值(我是用单通道转换,测试波形为正弦波),QS1:排序器复不复位为什么会影响到转换结果,不复位的感觉就是输入量被保持了,在连续转换里没有去复位它,为何没有影响。QS2:如果在启停模式必须得复位那么我在PWM+DMA+ADC测试中,在传输整个一帧的过程中,无法去复位该值,导致采集错误。

ADC配置如下:
	EALLOW;
    PieVectTable.ADCINT=&ADC0_ISR;
    EDIS;
    IER|=M_INT1;
    PieCtrlRegs.PIECTRL.bit.ENPIE=1;
    PieCtrlRegs.PIEIER1.bit.INTx6=1;
    EINT;
    ERTM;


	EALLOW;
	SysCtrlRegs.HISPCP.all=ADC_MODCLK;   //设置高速外设时钟为25MHz
	EDIS;
	AdcRegs.ADCTRL1.bit.SUSMOD=0X3;
	AdcRegs.ADCTRL1.bit.ACQ_PS=0x0;
	AdcRegs.ADCTRL3.bit.ADCCLKPS=ADC_CKPS;
	AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
	AdcRegs.ADCTRL2.bit.RST_SEQ1=1;
	AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0;
	AdcRegs.ADCTRL1.bit.CPS=1;
	AdcRegs.ADCTRL1.bit.CONT_RUN=0;
	AdcRegs.ADCTRL1.bit.SEQ_OVRD=1;
	AdcRegs.ADCMAXCONV.all=0x0000;     //自动转换0通道的值

    AdcRegs.ADCTRL2.bit.EPWM_SOCB_SEQ=1;   //级联状态下打开SOCB_SEQ,由ePWM SOCB信号启动
    AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
  PWM配置如下:
		//EPwm1Regs.ETSEL.all=0xC000;   //打开事件触发
		EPwm1Regs.ETSEL.bit.SOCBEN=1;
		EPwm1Regs.ETSEL.bit.SOCBSEL=4;
		EPwm1Regs.ETPS.bit.SOCBPRD=1;   //在第一个事件生成时产生脉冲,如果不写1或者写0则不产生脉冲
		EPwm1Regs.ETFLG.all=0;   //清除事件触发标志寄存器
		EPwm1Regs.ETCLR.all=0;   //清除事件
		EPwm1Regs.ETFRC.all=0;   //关闭事件触发

服务函数:

	PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
    	BUF_sample[adc_num]=((AdcRegs.ADCRESULT0)>>4);
    	adc_num++;
    	if(adc_num>BUF_SIZE)
    	adc_num=0;
    	AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;  
    	AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;  //清除中断标志
在中断服务函数中加入
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;  的波形

在中断服务函数中去掉

AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;  的波形
  

从保存数据的数组来看,采集的趋势是正常的,但是多个值被转换成了相同的值。希望有大神能够解答一下。

 
  • 在DMA传送模式中,用转换完成中断来作为DMA触发源,DMA会自动复位排序器吗,如果不会,怎么在连续采样启停模式中去复位排序器呢。

  • 现在这个板块有点门可罗雀啊

  • Jiaqi Zou,

    start-stop模式下overriding不起作用,也就是说在start-stop模式下,结果寄存器会像FIFO一样,不管你的SEQ怎么跑,结果都会顺序的写进ADCRESULT[0~15]里面去,除非你reset SEQ。我看到你的程序中一直在读ADCRESULT[0],但是这个值应该没有更新,直到你reset或者nature wrap。所以你可以顺序读16个结果寄存器来看看确认下。

    BR,

    Sam

  • 谢谢您的解答,按照您说的我做了一个实验,在reset SEQ的情况下,MAXCONV1设置为0x0的时候,读取ADCRESULT[1]寄存器并没有值,而设置为0x1的时候可以在ADCRESULT[1]中读到正常的波形,此时因为要转换两个通道,采样率降了一半,此时是有控制功效的。然后我去掉了reset SEQ,此时的MAXCONV1设置依然为0x0,但是去读取其他的结果结果寄存器是有值得,也就是MAXCONV1控制确实失效了。于是我用以下代码在每次转换后将值按照一定的顺序放到数组里

    	BUF_sample[adc_num]=((AdcRegs.ADCRESULT0)>>4);
        	BUF_sample[adc_num+1]=((AdcRegs.ADCRESULT1)>>4);
        	BUF_sample[adc_num+2]=((AdcRegs.ADCRESULT2)>>4);
        	BUF_sample[adc_num+3]=((AdcRegs.ADCRESULT3)>>4);
        	BUF_sample[adc_num+4]=((AdcRegs.ADCRESULT4)>>4);
        	BUF_sample[adc_num+5]=((AdcRegs.ADCRESULT5)>>4);
        	BUF_sample[adc_num+6]=((AdcRegs.ADCRESULT6)>>4);
        	BUF_sample[adc_num+7]=((AdcRegs.ADCRESULT7)>>4);
        	BUF_sample[adc_num+8]=((AdcRegs.ADCRESULT8)>>4);
        	BUF_sample[adc_num+9]=((AdcRegs.ADCRESULT9)>>4);
        	BUF_sample[adc_num+10]=((AdcRegs.ADCRESULT10)>>4);
        	BUF_sample[adc_num+11]=((AdcRegs.ADCRESULT11)>>4);
        	BUF_sample[adc_num+12]=((AdcRegs.ADCRESULT12)>>4);
        	BUF_sample[adc_num+13]=((AdcRegs.ADCRESULT13)>>4);
        	BUF_sample[adc_num+14]=((AdcRegs.ADCRESULT14)>>4);
        	BUF_sample[adc_num+15]=((AdcRegs.ADCRESULT15)>>4);
        	adc_num+=16;
        	if(adc_num>BUF_SIZE)
        	adc_num=0;

    但是出现了很奇怪的波形,

    看起来就是因为在单次转换的过程中,16个值是有一定的采样间隔的,设为T1,然后再SEQ1 nature wrap时,它的时间与T1不一致,导致波形衔接不上,wrap时间怎么去控制,还有在转换16个值得时候的间隔应该是有adc频率和采样窗的大小有关吧,再次感谢您的解答。