发 帖  
原厂入驻New
[问答] 如何利用pic32mz ef并行读取4个adc?
116 adc 代码 ISR
分享
大家好,我有这个代码来读取4个ADC并行:基本上这个代码运行,但我有一些问题:1。ISR被称为太多,例如,如果我得到1000个样本,ISR被称为1800次(用1个通道测试)。2。如果我扫描所有4个频道,频道会稍微偏离,例如,频道0有1000个样本,频道1有998个样本,频道2有1002个样本等等。代码有什么问题吗?我假设ISR被称为所有4个通道分开,是否有可能只有一个中断所有4个通道?谢谢你,马里奥
0
2019-9-25 08:48:06   评论 分享淘帖 邀请回答

相关问题

19个回答
嗨,马里奥,请务必在读取adc数据之后清除中断标志,否则中断标志可以在现有的中断例程之后设置。在您的代码中,不是在ISR的开头清除中断标志,而是在结束清除中断标志,以确保中断标志被正确清除。因此,在ISR的结尾移动下面的函数。
2019-9-25 08:57:17 评论

举报

非常感谢Anthony,我把行移到末尾,g_isr_all_cnt等于一个样本计数器。但是计数器仍然不同——不是很多。安装有什么问题?
2019-9-25 09:06:24 评论

举报

这个问题可能是由于需要在32位系统中保存的较高数量的中断引起的中断等待时间。为了测试这个理论,你可以将Time5调整到10000,看看这是否解决了这个问题。如果问题消失了,那么我们知道这是由于中断延迟造成的。有区域号码可以减少处理ADC中断的延迟。请参阅下面的建议.1.为ADC启用早期中断,因此中断发生在ADC转换完成之前,但是如果您的周期比中断延迟快得多,则此方法可能不能修复。使用IFA连续转换,使用系统DMA或ADC FIFO来存储转换后的数据。使用中断来处理BuffrIn处理单版本。(有一个示例项目调用adchs_3ch_dma,作为1.0.7.9的一部分,它使用定时器触发器以2Msp执行3通道采样,并且dma存储数据。)3.使用ShadowRegistersetting存储和恢复上下文,以便ISR不需要执行这个任务。参见中断用户手册60001108H.PDFon PRISS注册更多关于影子寄存器的信息。调用SYS_INT_ShadowRegisterAssign inHarmony将关联的ADC中断优先级设置为Shadow寄存器设置号。
2019-9-25 09:21:52 评论

举报

嗨,安东尼,谢谢你的回复。快速提问:当你说版本1.0.7.9时,你指的是哪一部分?我通过和谐框架1.0602搜索,我认为这是最新版本……马里奥
2019-9-25 09:37:47 评论

举报

你好,对不起,我的错误,1.07将很快被释放。不过,我附上了一个早期开发的项目,应该与1.06一起工作。请解压缩项目并将其存储在下面的和谐路径中:\Health\V1Y06\Apps\Excel \外围\ ADCHS
2019-9-25 09:46:34 评论

举报

嗨,安东尼,再次感谢你的回答。我能够在2.5MHz的四个通道上采样数据。由于使用DMA,不再有漂移。我真的很惊讶中断中断有这么高的效果。
2019-9-25 10:03:32 评论

举报

你好,马里奥,谢谢你提供反馈,如果你需要额外的帮助,请告诉我们。
2019-9-25 10:19:46 评论

举报

嗨,安东尼,我还有一个问题,可能还有两个问题。我需要在中断处理程序中添加一些简单的代码,以计算采样缓冲区的数量。我已经将缓冲区大小加倍,并从DMA中评估了一半和全部中断标志。我将这些值存储在全局AppDATA中。我还存储了哪些缓冲区被填充并可以在中断之外使用。有两件事要发生:DMA0每次发射半中断,即使满应该只有开机。您可以通过将代码中的计数器添加到每个DMA事件(半/满)来检查并比较它们。DMA0的半值总是加倍。如果在每个DMA中断处理程序(满/半事件)中都有一个计数器,并设置缓冲区就绪的标志,那么事件就会再次漂移。这是非常简单的代码,只是一些计数器增量和设置标志。目前我的采样频率是2.5MHz,缓冲区大小为1728(由于双缓冲区而乘以2)。这就给了每秒DMA~1400中断。关于马里奥
2019-9-25 10:34:30 评论

举报

更多的信息:我认为它与DMAIN TITIONATION的半满标志有关,有些地方是错误的。DMAIN TITIONATION STORILATION SUBLY完全不稳定,像DMAIN TITION SITION,它有点飘忽不定的时间。当我评论每一个频道时,我仍然会在中断处理程序中得到事件。即使我通过它禁用它
2019-9-25 10:43:48 评论

举报

诚然,我只是浏览了一下这个帖子,还没有读完所有的帖子,但我注意到在你的标题中,你是说你正在使用PIC32MZEF,而在你最近的帖子中,你是在使用PLIB电话。我的印象是,PLIB仅仅是针对PIC32 MX目标,而不是PIC32 MZ,这可以解释奇怪的行为吗?
2019-9-25 10:59:07 评论

举报

我的印象是,PLIB仅仅是针对PIC32 MX目标,而不是PIC32 MZ,这可以解释奇怪的行为吗?我不相信那是真的。PLIB是为我的pic32MZ EF工作编译的,对PLIB函数的调用自动写入Harmony生成的源文件中。他们工作。
2019-9-25 11:18:44 评论

举报

这样看。你在2.5MHz采样4个通道,每个采样点是100nS。如果你运行在200兆赫,它是20个周期。这应该包括所有摊位、低效率、您执行的其他任务、后台DMA偷取的周期等。如果平均花费超过20个周期来处理一个样本,则无论做什么,您的样本都会滑落。
2019-9-25 11:30:13 评论

举报

Plib和Plib是两个完全不同的东西。Harmony框架中的外围层、“.../framework/./dma/plib_dma.h”以及现在推广并与MLA一起使用的旧Plib、<Plib.h>,在设计和使用上存在很大差异。不要把这两个混为一谈。迈西尔
2019-9-25 11:40:51 评论

举报

我不使用和谐,所以我不确定在ISR解析中调用多少(如果有的话)和谐PLIB函数到实际函数或宏。如果这些函数中的任何一个是实际函数,那么编译器必须保存和恢复所有FPU寄存器,因为它不能确保它们没有被使用。
2019-9-25 11:52:59 评论

举报

2019-9-25 12:08:15 评论

举报

我在P*M2220ZEFEH144*中发现了PLIB函数,所以它应该工作。在ISR中,我只使用函数来清除在末尾宏中的标志,所以没有跳转到ISR中的其他函数。@NorthGuy如果我正确地理解你,DMA阻塞了内存总线,对吧?我已经将采样速率减慢到250kHz,这导致不仅第一个DMA给了我一半和满计数器的不同值,所以这是中断不能够被足够快地服务的信号,但是:为什么我得到两次半中断?满是下半场吗?如果所有四条管道并行工作,我只需要一个ISR,这也节省了我的CPU时间。目前,似乎是…
2019-9-25 12:20:36 评论

举报

DMA可能干扰CPU,因为他们访问同一总线。在较慢的速率下,效果是可以忽略不计的。如果你跑得很快,你需要解释这一点。ISR不应该是个问题。通过使用DMA,你可以使用大的缓冲区,这样你就可以得到一个ISR的多个样本。但是,你需要对每一个样本做些事情。这部分需要时间。你应该能够足够快地完成它,并且留出一些时间让其他的事情发生。然后你可以增加速度直到它停止工作。
2019-9-25 12:39:28 评论

举报

当然,和谐外围层功能存在,并且用于PIC32MX和PIC32MZ。和谐团队的开发人员在没有使用外围层功能的情况下不允许访问硬件SFR。对于每种外围设备,每个MX和MZ芯片都有一个大的包含文件产品。SFR寄存器中的每个字段或控制位都有单独的函数。外围层函数在头文件中被编码为内联函数。当优化时,-O1或更高时,所有函数调用都被优化掉了。当编译应用程序、驱动程序或系统服务代码以进行调试时ng没有优化,-O0,就不执行内联,并且这些函数与预编译的归档文件链接。这样做是为了能够在为调试而构建的程序中使用优化的外围库函数。缺点是MPLAB中的调试器不能遵循源代码。对于从库中链接的函数。如其他人建议的,使用Shadow寄存器集,如果希望快速中断处理,请远离FPU。在MPLLAB的“反汇编”窗口中,可以看到中断prolog和pilog代码,输入和离开的指令应该少于20条。G A ISR,反对50以上,如果软件必须保存上下文的CPU或FPU。迈西尔
2019-9-25 12:47:42 评论

举报

我的ISR目前有46条指令,这是C源:我通过OC产生一个200ns的信号,并在示波器上跟踪信号。用1728字节,我得到了稳定的信号在1.42164kHz只做了事件。如果我将缓冲区加倍到3456字节,启用半事件并将PLIB_OC_Enable移动到另一个,如果信号变得不稳定,但仍然在1.42164kHz左右。如果没有启用,半事件也会发生,使完成事件也导致半事件。此外,半事件也伴随着完成事件(总共3个事件)。
2019-9-25 12:55:35 评论

举报

只有小组成员才能发言,加入小组>>

58个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表