完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,我想使用DSPIC33 EP512MU810读取几个模拟输入,并产生PWM输出信号。为了减少CPU负载,我想使用DMA直接将ADC值写入SRAM。没有DMA,ADC和PWM工作没有任何问题。通过DMA,我的ADC输入值被写入到缓冲器中,并且可以被读取。但是之后没有对缓冲区的起始地址进行重置,这意味着写入缓冲区的值不会改变。我不知道为什么,因为DMA中断一直在按预期触发。代码的相关部分在下面发布。整个主要功能是附加的。如果有人能帮助我,我会很高兴。
|
|
相关推荐
4个回答
|
|
在“PrimeAdcStases”函数中花费了大量时间吗?在ISR中做很多处理不是个好主意。当重新启用DMA信道时,它会重置为“A”缓冲区,这样您的“dmaBuffer”变量就会失调吗?(顺便说一下,您可以从DMA控制器中得到它在任何时候使用的缓冲区,以便您可以处理另一个缓冲区。)请记住,使用双缓冲区的全部意义在于,DMA可以填充正在处理另一个的整体,而不会停止。
|
|
|
|
不,现在只有一个缓冲区值保存在一个变量中,并且DMA中断被启用。我删除了取消启用和重新启用DMA的行。我没有帮助,我想我是在做那件事。在Ping Pong Mode每次传输完成后,DMA启动附件DMA0STAL和DMA0STBL都是自动切换的。如果DMABUFFER=0,我将处理BuffaL.之后dmaBuffer被设置为1,我将处理bufferB。很抱歉,这是我第一次想使用DMA,并且我不能正确地理解它。
|
|
|
|
对于特定的MCU,您可以使用DMA来访问整个RAM。因此,您可以通过指定DMA空间的使用来节省自己的一些麻烦。另外,EDS内存可能存在问题,因此我建议您简单地将数据缓冲区放入普通内存中,特别是因为它们非常小。我已经做了很多次了,没有任何问题。要查看信道在任何时候使用哪个缓冲区,请查看DMAPPS寄存器中的适当位。在您的情况下,您需要访问*.*缓冲区,因此只需要相应地解释该位。我不会在从ISR调用的函数中使用DMAxIE位。对于纯粹主义者来说,这意味着函数已经超出了它的界限,但对于我来说,它只是做了那个函数中意想不到的事情,如果我忘记它正在做额外的事情,我可能会陷入困境。在ISR之上,我在ISR本身寻找这个问题。除此之外,你所期待的是正确的。我唯一要说的是,ADC和DMA缓冲区之间可能存在一些非常复杂的交互,如DMA和ADC FRM部分中所解释的。我从来没有在ADC上使用过DMA,所以我不能帮助你,如果是这个问题。苏珊
|
|
|
|
非常感谢你,苏珊,现在开始工作了。我不确定问题出在哪里(也许很多)。另一个问题是我忘了将一些变量定义为volatile。无论如何,谢谢你。
|
|
|
|
只有小组成员才能发言,加入小组>>
5238 浏览 9 评论
2027 浏览 8 评论
1950 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3202 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2253 浏览 5 评论
772浏览 1评论
663浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
590浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
672浏览 0评论
572浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:43 , Processed in 1.144816 second(s), Total 83, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号