TI中文支持网
TI专业的中文技术问题搜集分享网站

【求助】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;  的波形
  

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

 

Jiaqi Zou:

在DMA传送模式中,用转换完成中断来作为DMA触发源,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;  的波形
  

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

 

Jiaqi Zou:

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

 首先我参考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;  的波形
  

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

 

Sam Zhang:

回复 Jiaqi Zou:

Jiaqi Zou,

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

BR,

Sam

 首先我参考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;  的波形
  

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

 

Jiaqi Zou:

回复 Sam Zhang:

谢谢您的解答,按照您说的我做了一个实验,在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频率和采样窗的大小有关吧,再次感谢您的解答。

赞(0)
未经允许不得转载:TI中文支持网 » 【求助】F28335中PWM、ADC、DMA的几个问题
分享到: 更多 (0)