完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用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时采样得到点数确是一样,这似乎不对,采样点数应该增加才对,这又是什么原因呢? 请教各位高手,能告知原因吗? 是我哪里设置有问题吗? |
|
相关推荐
6 个讨论
|
|
se6238751 发表于 2020-8-20 10:13 谢谢你的回复,但是你说的不对啊 1. 当采样值大于设置值就会产生中断的,这就是触发条件啊。既然我能取得数,那么我关于中断的设置应该没有问题,不然什么数都没有的 2.TimerLoadSet是设置周期,是告知ADC多长时间进行一次采样,怎么会与ADC采样无关呢? 周期越短,采样点当然越多啊。 |
|
|
|
|
|
xj1223726587 发表于 2020-8-20 10:24 1.不知道楼主说的二次曲线是不是指从高->低->高的圆滑曲线信号? 楼主的描述似乎不是很清除,挺难理解的。建议楼主把曲线图发出来解释下。 根据楼主的代码,是先转换一个结果交给Comparator比较,然后再转换一个结果送入FIFO。仅当ADC结果>700时才会进入中断采集结果,当结果未被取走前,之前开始转换时的较小结果会一直存在于FIFO中,后来较大的结果会因为FIFO没清空而不能存入,这里可能会导致问题。 2.如果Timer的触发频率提高,信号不变,固定单位时间内获得的>700的结果个数确实应该增加。楼主需要保证测量的时长是一样的,然后可以检查下TimerA的定时设置是否正确作用了。楼主说的在中断比较记录数据,不知是在什么中断里比较的? |
|
|
|
|
|
vmmjuwy 发表于 2020-8-20 10:35 1.这个是我没说清楚, 就是个抛物线。是低-高-低,所以我才用HIGH_ALWAYS,不然数据量会很大 。你说是未取走我后天读数试试,难道他的fifo不能自动压数吗? 2.测量时间肯定是一样,不然我也不会这么问,在中断里面比较记录就是 if 采样值>700 ,就把ad采样值记录下来啊。至于timer是否正确作用了,应该是作用了,不然怎么进中断并记录下采样值呢。 |
|
|
|
|
|
xj1223726587 发表于 2020-8-20 10:44 Richard Ma 我是有比较中断才读ad的数,当比较器不产生中断是我是不去读fifo的,若ti的adc fifo是这样不读就不入的设计的话,你觉得我实际中该如何使用数字比较中断呢? |
|
|
|
|
|
xj1223726587 发表于 2020-8-20 10:59 jian wang 你好, 1. FIFO填满后,新的数据确实是无法写入的。不知道你是否需要每一个>=700的值都保存下来?建议当结果>6XX时,关掉比较器功能,保存ADC转换结果;当结果降回到700以下重新打开比较器。建议多利用下FIFO的深度,一次读出多个结果,这样可以节约CPU资源。如果仍觉得数据量较大,可以考虑使用DMA 2. 不知你是在Timer的中断里读结果还是在ADC的中断中读结果?个人觉得很有可能是Trigger的频率较高而有的Trigger被忽略掉了,可以检查下是否每次测量触发都正常响应了且ADC的转换速率已设置到1MSPS |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
690 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
604 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1059 浏览 1 评论
749 浏览 0 评论
普中科技F28335开发板每次上电复位后数码管都会显示,如何熄灭它?
527 浏览 1 评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
170浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
130浏览 14评论
在使用3254进行录音的时候出现一个奇怪的现象,右声道有吱吱声,请教一下,是否是什么寄存器设置存在问题?
129浏览 13评论
TLV320芯片内部自带数字滤波功能,请问linein进来的模拟信号是否是先经过ADC的超采样?
125浏览 12评论
GD32F303RCT6配置PA4 ADC引脚,将PA2代替key功能,PA2连接时无法实现预期功能,为什么?
59浏览 10评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 14:43 , Processed in 0.853219 second(s), Total 52, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号