lm3s9b96的ADC遇到的问题



我用96的ADC0模块对一个类似2次曲线的信号进行采样,用了2种方式,always采样+数字比较器功能和timer触发,中断比较记录数据。均存在问题。

1. always采样+数字比较器

     我对波形进行采样,通道按如下配置  ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH13 | ADC_CTL_CMP0 );
                                                                       ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH13 | ADC_CTL_END );                                      

                                                                      ADCComparatorConfigure(ADC0_BASE, 0, ADC_COMP_INT_HIGH_ALWAYS   );
                                                                      ADCComparatorRegionSet(ADC0_BASE, 0, 700, 700);

                    在中断里面用  HWREG(ADC0_BASE + ADC_O_SSFIFO0)  读数 ,当我用500ksps的速率采样,每次大概有140左右的数,但是每次采集的数前8个数不对(这8个数值大小是递减的,应该是上次采集的数的尾部8个数)而本次采集的最后一个数值离700还有很远,大概740左右就没了,每次都是这样。后来尝试在采样开始前读一次FIFO再采集,那么前8个数就变成很小的数,大概30左右(这个曲线的位置离开始采样有比较远的距离,有足够的时间初始化),后面还是一样,如果 数据采集结束后读一次FIFO,那么这8个数就是从740到700递减的8个数;然后在采集,那么前8个数还是很小的数。这是什么原因???

2.  timer触发,中断比较记录数据

     后来我用这个方式,timer如下配置     SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 );                   
                                                                       TimerConfigure(TIMER0_BASE, TIMER_CFG_32_BIT_PER);             
                                                                      TimerLoadSet(TIMER0_BASE, TIMER_A, SysCtlClockGet()/125000);                     
                                                                    TimerControlTrigger(TIMER0_BASE, TIMER_A, 1); 

     在中断中读数字进行比较,>700的就记录下来,采样的数字顺序是对的。但是当我把SysCtlClockGet()/125000  改为250000,500000,1000000时采样得到点数确是一样,这似乎不对,采样点数应该增加才对,这又是什么原因呢?

请教各位高手,能告知原因吗? 是我哪里设置有问题吗?

     

               

  • 1.如果拟采用一直触发的方式进行采样的话,需要等到每次采样结束才能获取数据。否则获取的数据可能不正确。

    ADCComparatorConfigure你仅仅配置了中断,没有配置触发。

    2.TimerLoadSet是设置定时器周期,和ADC的采样无关。

    每次调用采样,如果用driverlib的库函数ADCSequenceDataGet,最多只能获取8个采样数据。如果是采样序列3,只能获取一个数据。

  • 谢谢你的回复,但是你说的不对啊

    1. 当采样值大于设置值就会产生中断的,这就是触发条件啊。既然我能取得数,那么我关于中断的设置应该没有问题,不然什么数都没有的

    2.TimerLoadSet是设置周期,是告知ADC多长时间进行一次采样,怎么会与ADC采样无关呢? 周期越短,采样点当然越多啊。

  • 1.不知道楼主说的二次曲线是不是指从高->低->高的圆滑曲线信号? 楼主的描述似乎不是很清除,挺难理解的。建议楼主把曲线图发出来解释下。

    根据楼主的代码,是先转换一个结果交给Comparator比较,然后再转换一个结果送入FIFO。仅当ADC结果>700时才会进入中断采集结果,当结果未被取走前,之前开始转换时的较小结果会一直存在于FIFO中,后来较大的结果会因为FIFO没清空而不能存入,这里可能会导致问题。

    2.如果Timer的触发频率提高,信号不变,固定单位时间内获得的>700的结果个数确实应该增加。楼主需要保证测量的时长是一样的,然后可以检查下TimerA的定时设置是否正确作用了。楼主说的在中断比较记录数据,不知是在什么中断里比较的?

  • 1.这个是我没说清楚, 就是个抛物线。是低-高-低,所以我才用HIGH_ALWAYS,不然数据量会很大 。你说是未取走我后天读数试试,难道他的fifo不能自动压数吗?

    2.测量时间肯定是一样,不然我也不会这么问,在中断里面比较记录就是 if 采样值>700 ,就把ad采样值记录下来啊。至于timer是否正确作用了,应该是作用了,不然怎么进中断并记录下采样值呢。  

  • Richard Ma   我是有比较中断才读ad的数,当比较器不产生中断是我是不去读fifo的,若ti的adc fifo是这样不读就不入的设计的话,你觉得我实际中该如何使用数字比较中断呢?

  • jian wang 你好,

    1. FIFO填满后,新的数据确实是无法写入的。不知道你是否需要每一个>=700的值都保存下来?建议当结果>6XX时,关掉比较器功能,保存ADC转换结果;当结果降回到700以下重新打开比较器。建议多利用下FIFO的深度,一次读出多个结果,这样可以节约CPU资源。如果仍觉得数据量较大,可以考虑使用DMA

    2. 不知你是在Timer的中断里读结果还是在ADC的中断中读结果?个人觉得很有可能是Trigger的频率较高而有的Trigger被忽略掉了,可以检查下是否每次测量触发都正常响应了且ADC的转换速率已设置到1MSPS